爱体育

 
 加入
查看: 286|回复: 4

listview条目选择问题求助?-爱体育

  [复制链接]
发表于 2023-9-12 12:31:35 | 显示全部楼层 |


以下代码来自本论坛,修改了个选中条目的颜色


#include
#include
#include
#include
#include
#include
#include

$gui = guicreate("listview custom draw", 400, 300)

$clistview = guictrlcreatelistview("column 1|column 2|column 3", 2, 2, 394, 268, -1, bitor($lvs_ex_gridlines, $lvs_ex_fullrowselect))
$hlistview = guictrlgethandle($clistview)

for $i = 1 to 30
        guictrlcreatelistviewitem("row" & $i & ": col 1|row" & $i & ": col 2|row" & $i & ": col 3", $clistview)
next
;~ guictrlcreateinput("click here to test focus", 50, 275, 200, 18)


guiregistermsg($wm_notify, "wm_notify")
guisetstate()

do
until guigetmsg() = $gui_event_close

exit

func wm_notify($hwnd, $msg, $wparam, $lparam)
        local $hwndfrom, $iidfrom, $icode, $tnmhdr

        $tnmhdr = dllstructcreate($tagnmhdr, $lparam)
        $hwndfrom = hwnd(dllstructgetdata($tnmhdr, "hwndfrom"))
        $iidfrom = dllstructgetdata($tnmhdr, "idfrom")
        $icode = dllstructgetdata($tnmhdr, "code")

        switch $hwndfrom
                case $hlistview
                        switch $icode
                                case $nm_customdraw
                                        if not _guictrllistview_getviewdetails($hwndfrom) then return $gui_rundefmsg
                                        local $tcustdraw, $idrawstage, $iitem, $isubitem, $hdc, $trect, $color, $fram
                                        $tcustdraw = dllstructcreate($tagnmlvcustomdraw, $lparam)
                                        $idrawstage = dllstructgetdata($tcustdraw, 'dwdrawstage')
                                        switch $idrawstage
                                                case $cdds_prepaint
                                                        return $cdrf_notifyitemdraw
                                                case $cdds_itemprepaint
                                                        return $cdrf_notifysubitemdraw
                                                case $cdds_itempostpaint
                                                case bitor($cdds_itemprepaint, $cdds_subitem)
                                                        $iitem = dllstructgetdata($tcustdraw, 'dwitemspec')
                                                        $isubitem = dllstructgetdata($tcustdraw, 'isubitem')

                                                        if _guictrllistview_getitemselected($hwndfrom, $iitem) then
                                                                $hdc = _winapi_getdc($hwndfrom)
                                                                $trect = dllstructcreate($tagrect)
                                                                if $isubitem = 0 then
                                                                        _sendmessage($hwndfrom, $lvm_getsubitemrect, $iitem, dllstructgetptr($trect))
                                                                        dllstructsetdata($trect, "left", 2)
                                                                        $color = _winapi_getstockobject($dc_brush)
                                                                        $fram = _winapi_getstockobject($black_brush)
                                                                        _winapi_setdcbrushcolor($hdc, 0x0078d7)
                                                                        _winapi_fillrect($hdc, dllstructgetptr($trect), $color)
                                                                        _winapi_framerect($hdc, dllstructgetptr($trect), $fram)
                                                                endif

                                                                dllstructsetdata($trect, "left", 2)
                                                                dllstructsetdata($trect, "top", $isubitem)
                                                                _sendmessage($hwndfrom, $lvm_getsubitemrect, $iitem, dllstructgetptr($trect))

                                                                local $stext = _guictrllistview_getitemtext($hwndfrom, $iitem, $isubitem)
                                                                _winapi_setbkmode($hdc, $transparent)

                                                                _winapi_selectobject($hdc, _sendmessage($hwndfrom, $wm_getfont))

                                                                if $isubitem = 0 then
                                                                        dllstructsetdata($trect, "left", dllstructgetdata($trect, "left") 2)
                                                                else
                                                                        dllstructsetdata($trect, "left", dllstructgetdata($trect, "left") 6)
                                                                endif
                                                                _winapi_drawtext($hdc, $stext, $trect, bitor($dt_vcenter, $dt_end_ellipsis, $dt_singleline))

                                                                _winapi_releasedc($hwndfrom, $hdc)

                                                                return $cdrf_skipdefault
                                                        endif

                                                        return $cdrf_newfont
                                                case bitor($cdds_itempostpaint, $cdds_subitem)
                                        endswitch
                        endswitch
        endswitch

        return $gui_rundefmsg
endfunc   ;==>wm_notify

    需要实现:当窗口出现后自动选中索引项目第3项,当选择其它项目时取消索引项目的第3项,在线求助。

 楼主| 发表于 2023-9-12 13:08:59 | 显示全部楼层
本帖最后由 h111666b 于 2023-9-12 13:10 编辑

; 在窗口创建后默认选中索引3
_guictrllistview_setitemstate($hlistview, 3, $lvis_selected, $lvis_selected)

使用此项选中索引3后,当窗口出现鼠标悬停到选择的索引3条目时,文字会丢失不全,重新点击才正常显示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2023-9-12 22:27:47 | 显示全部楼层

; 在窗口创建后默认选中索引3
_guictrllistview_setitemstate($hlistview, 3, $lvis_selected, $lvis_sele ...
  1. #include
  2. #include
  3. #include


  4. global $hlistview, $iselecteditem

  5. $gui = guicreate("listview custom draw", 400, 300)

  6. $clistview = guictrlcreatelistview("column 1|column 2|column 3", 2, 2, 394, 268, -1)
  7. $hlistview = guictrlgethandle($clistview)

  8. for $i = 1 to 30
  9.     guictrlcreatelistviewitem("row" & $i & ": col 1|row" & $i & ": col 2|row" & $i & ": col 3", $clistview)
  10. next

  11. ; 设置默认选中索引为3的列表项
  12. $iselecteditem = 3
  13. _guictrllistview_setitemselected($hlistview, 3, true)

  14. guiregistermsg($wm_notify, "wm_notify")
  15. guisetstate()

  16. do
  17. until guigetmsg() = $gui_event_close

  18. exit

  19. func wm_notify($hwnd, $msg, $wparam, $lparam)
  20.     local $tnmhdr, $hwndfrom, $iidfrom, $icode

  21.     $tnmhdr = dllstructcreate($tagnmhdr, $lparam)
  22.     $hwndfrom = hwnd(dllstructgetdata($tnmhdr, "hwndfrom"))
  23.     $iidfrom = dllstructgetdata($tnmhdr, "idfrom")
  24.     $icode = dllstructgetdata($tnmhdr, "code")

  25.     switch $hwndfrom
  26.         case $hlistview
  27.             switch $icode
  28.                 case $nm_customdraw
  29.                     local $tcustdraw, $idrawstage, $iitem, $isubitem, $hdc, $trect, $color
  30.                     $tcustdraw = dllstructcreate($tagnmlvcustomdraw, $lparam)
  31.                     $idrawstage = dllstructgetdata($tcustdraw, 'dwdrawstage')
  32.                     select
  33.                         case $idrawstage = $cdds_prepaint
  34.                             return $cdrf_notifyitemdraw

  35.                         case bitor($idrawstage, $cdds_itemprepaint) = bitor($cdds_itemprepaint, 0x1000)
  36.                             $iitem = dllstructgetdata($tcustdraw, 'dwitemspec')
  37.                             $isubitem = dllstructgetdata($tcustdraw, 'isubitem')
  38.                             $hdc = dllstructgetdata($tcustdraw, "hdc")
  39.                             $trect = dllstructcreate($tagrect, dllstructgetdata($tcustdraw, "rctext"))

  40.                             ; 设置填充和边框颜色
  41.                             if $iitem = $iselecteditem - 1 then
  42.                                 $color = 0x0078d7
  43.                             else
  44.                                 $color = 0xffffff
  45.                             endif

  46.                             _winapi_fillrect($hdc, dllstructgetptr($trect), _winapi_getstockobject($black_brush))
  47.                             _winapi_framerect($hdc, dllstructgetptr($trect), _winapi_getstockobject($black_brush))

  48.                             ; 绘制文本
  49.                             dllstructsetdata($trect, "left", dllstructgetdata($trect, "left") 6)
  50.                             local $stext = _guictrllistview_getitemtext($hwndfrom, $iitem, $isubitem)
  51.                             _winapi_setbkmode($hdc, $transparent)
  52.                             _winapi_settextcolor($hdc, $color)
  53.                             _winapi_drawtext($hdc, $stext, $trect, $dt_vcenter $dt_end_ellipsis $dt_singleline)

  54.                             return $cdrf_skipdefault

  55.                         case else
  56.                             ; 绘制完成
  57.                     endselect
  58.             endswitch
  59.     endswitch

  60.     return $gui_rundefmsg
  61. endfunc
复制代码
 楼主| 发表于 2023-9-13 10:45:41 | 显示全部楼层
本帖最后由 h111666b 于 2023-9-13 10:53 编辑

感谢回复,但是还是没达到要求,当点击了列表以外按钮焦点高亮消失,而原先的是不会失去高亮显示的
使用_guictrllistview_setitemdrophilited($clistview, 3, true) 此项可以保持高亮,现在有个问题就是,当点击其它项目后怎么取消已经选中的高亮项目3

代码如下


lude
#include
#include
#include
#include
#include
#include

$gui = guicreate("listview custom draw", 400, 300)

$clistview = guictrlcreatelistview("column 1|column 2|column 3", 2, 2, 394, 150, -1, bitor($lvs_ex_gridlines, $lvs_ex_fullrowselect))
$hlistview = guictrlgethandle($clistview)

for $i = 1 to 30
        guictrlcreatelistviewitem("row" & $i & ": col 1|row" & $i & ": col 2|row" & $i & ": col 3", $clistview)
next
;~ guictrlcreateinput("click here to test focus", 50, 275, 200, 18)

;设置选中项目高亮显示
_guictrllistview_setitemdrophilited($clistview, 3, true)

$button1 = guictrlcreatebutton("测试按钮", 100, 154, 60, 27)
guiregistermsg($wm_notify, "wm_notify")
guisetstate()

do
until guigetmsg() = $gui_event_close

exit

func wm_notify($hwnd, $msg, $wparam, $lparam)
        local $hwndfrom, $iidfrom, $icode, $tnmhdr

        $tnmhdr = dllstructcreate($tagnmhdr, $lparam)
        $hwndfrom = hwnd(dllstructgetdata($tnmhdr, "hwndfrom"))
        $iidfrom = dllstructgetdata($tnmhdr, "idfrom")
        $icode = dllstructgetdata($tnmhdr, "code")

        switch $hwndfrom
                case $hlistview
                        switch $icode
                                case $nm_customdraw
                                        if not _guictrllistview_getviewdetails($hwndfrom) then return $gui_rundefmsg
                                        local $tcustdraw, $idrawstage, $iitem, $isubitem, $hdc, $trect, $color, $fram
                                        $tcustdraw = dllstructcreate($tagnmlvcustomdraw, $lparam)
                                        $idrawstage = dllstructgetdata($tcustdraw, 'dwdrawstage')
                                        switch $idrawstage
                                                case $cdds_prepaint
                                                        return $cdrf_notifyitemdraw
                                                case $cdds_itemprepaint
                                                        return $cdrf_notifysubitemdraw
                                                case $cdds_itempostpaint
                                                case bitor($cdds_itemprepaint, $cdds_subitem)
                                                        $iitem = dllstructgetdata($tcustdraw, 'dwitemspec')
                                                        $isubitem = dllstructgetdata($tcustdraw, 'isubitem')

                                                        if _guictrllistview_getitemselected($hwndfrom, $iitem) then
                                                                $hdc = _winapi_getdc($hwndfrom)
                                                                $trect = dllstructcreate($tagrect)
                                                                if $isubitem = 0 then
                                                                        _sendmessage($hwndfrom, $lvm_getsubitemrect, $iitem, dllstructgetptr($trect))
                                                                        dllstructsetdata($trect, "left", 2)
                                                                        $color = _winapi_getstockobject($dc_brush)
                                                                        $fram = _winapi_getstockobject($black_brush)
                                                                        _winapi_setdcbrushcolor($hdc, 0x0078d7)
                                                                        _winapi_fillrect($hdc, dllstructgetptr($trect), $color)
                                                                        _winapi_framerect($hdc, dllstructgetptr($trect), $fram)
                                                                endif

                                                                dllstructsetdata($trect, "left", 2)
                                                                dllstructsetdata($trect, "top", $isubitem)
                                                                _sendmessage($hwndfrom, $lvm_getsubitemrect, $iitem, dllstructgetptr($trect))

                                                                local $stext = _guictrllistview_getitemtext($hwndfrom, $iitem, $isubitem)
                                                                _winapi_setbkmode($hdc, $transparent)

                                                                _winapi_selectobject($hdc, _sendmessage($hwndfrom, $wm_getfont))

                                                                if $isubitem = 0 then
                                                                        dllstructsetdata($trect, "left", dllstructgetdata($trect, "left") 2)
                                                                else
                                                                        dllstructsetdata($trect, "left", dllstructgetdata($trect, "left") 6)
                                                                endif
                                                                _winapi_drawtext($hdc, $stext, $trect, bitor($dt_vcenter, $dt_end_ellipsis, $dt_singleline))

                                                                _winapi_releasedc($hwndfrom, $hdc)

                                                                return $cdrf_skipdefault
                                                        endif

                                                        return $cdrf_newfont
                                                case bitor($cdds_itempostpaint, $cdds_subitem)
                                        endswitch
                        endswitch
        endswitch

        return $gui_rundefmsg
endfunc   ;==>wm_notify




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2023-9-13 10:54:48 | 显示全部楼层
需要实现以上第二张图片要求,点击按钮或者窗口外其它项目,列表框内选中的条目高亮不会消失
您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|爱体育 ( ) "));

gmt 8, 2023-12-7 01:02 , processed in 0.095471 second(s), 21 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图