Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB6列表不显示时所选项目的列表视图颜色';我没有焦点_Vb6 - Fatal编程技术网

VB6列表不显示时所选项目的列表视图颜色';我没有焦点

VB6列表不显示时所选项目的列表视图颜色';我没有焦点,vb6,Vb6,在Windows 10中没有焦点的Listview上,Listview项目非常微弱地高亮显示。我知道这取决于系统主题 在此图像中,选择了项目编号3 是否有任何方法可以通过编程更改,使其变成更暗的灰色,更可见。在早期版本的Windows中,标准主题显示为深灰色。以下是解决此问题的有效方法。它涉及使用子类化和win api调用,因此请谨慎行事 此代码使用由vbAccelerator提供的,尽管您应该能够使用任何子类化技术。总之,KillFocus消息被覆盖以实现我们的目标 Option Expl

在Windows 10中没有焦点的
Listview
上,
Listview
项目非常微弱地高亮显示。我知道这取决于系统主题

在此图像中,选择了项目编号3


是否有任何方法可以通过编程更改,使其变成更暗的灰色,更可见。在早期版本的Windows中,标准主题显示为深灰色。

以下是解决此问题的有效方法。它涉及使用子类化和win api调用,因此请谨慎行事

此代码使用由vbAccelerator提供的,尽管您应该能够使用任何子类化技术。总之,
KillFocus
消息被覆盖以实现我们的目标

Option Explicit

Implements ISubclass

Private Const LVS_SHOWSELALWAYS As Long = &H8
Private Const LVIS_FOCUSED      As Long = &H1
Private Const LVM_FIRST         As Long = &H1000
Private Const LVM_GETNEXTITEM   As Long = (LVM_FIRST + 12)
Private Const LVM_SETITEMSTATE  As Long = (LVM_FIRST + 43)
Private Const LVNI_FOCUSED      As Long = &H1
Private Const LVNI_SELECTED     As Long = &H2
Private Const WM_SETFOCUS       As Long = &H7
Private Const WM_KILLFOCUS      As Long = &H8

Private Type LVITEM
   Mask       As Long
   iItem      As Long
   iSubItem   As Long
   State      As Long
   StateMask  As Long
   pszText    As String
   cchTextMax As Long
   iImage     As Long
   lParam     As Long
   iIndent    As Long
   iGroupId   As Long
   cColumns   As Long
   puColumns  As Long
   piColFmt   As Long
   iGroup     As Long
End Type

Private Declare Function SendMessageW Lib "user32.dll" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Sub Form_Load()
   ListView1.ListItems.Add , , "Item Number One"
   ListView1.ListItems.Add , , "Item Number Two"
   ListView1.ListItems.Add , , "Item Number Three"
   ListView1.ListItems.Add , , "Item Number Four"
   ListView1.ListItems.Add , , "Item Number Five"
   ListView1.ListItems(3).Selected = True

   AttachMessage Me, ListView1.hWnd, WM_KILLFOCUS
End Sub

Private Sub Form_Unload(Cancel As Integer)
   DetachMessage Me, ListView1.hWnd, WM_KILLFOCUS
End Sub

Private Property Let ISubclass_MsgResponse(ByVal RHS As SSubTimer6.EMsgResponse)
'
End Property

Private Property Get ISubclass_MsgResponse() As SSubTimer6.EMsgResponse
   ISubclass_MsgResponse = emrConsume
End Property

Private Function ISubclass_WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Dim i As Long
   Dim lvi As LVITEM

   Select Case iMsg
      Case WM_KILLFOCUS
         'get selected item and remove focus
         i = SendMessageW(hWnd, LVM_GETNEXTITEM, -1&, ByVal LVNI_FOCUSED Or LVNI_SELECTED)

         If i <> -1 Then
            lvi.StateMask = LVIS_FOCUSED
            SendMessageW hWnd, LVM_SETITEMSTATE, i, lvi
         End If

         'return 1 to indicate we processed the message
         ISubclass_WindowProc = 1
   End Select
End Function
选项显式
实现ISubclass
Private Const LVS_SHOWSELALWAYS As Long=&H8
私有Const lvu聚焦为Long=&H1
私人施工LVM_第一个长度=&H1000
Private Const LVM_GETNEXTITEM As Long=(LVM_FIRST+12)
Private Const LVM_SETITEMSTATE As Long=(LVM_FIRST+43)
私有Const LVNI_聚焦为Long=&H1
私有常量LVNI_选择为Long=&H2
私有常量WM_SETFOCUS As Long=&H7
私有Const WM_KILLFOCUS As Long=&H8
私有类型LVITEM
面具一样长
尽可能长
iSubItem尽可能长
国家只要
国家面具
pszText作为字符串
cchTextMax尽可能长
我想象的一样长
lpram尽可能长
只要
iGroupId尽可能长
cColumns尽可能长
puColumns一样长
皮克尔夫姆特一样长
iGroup尽可能长
端型
私有声明函数SendMessageW Lib“user32.dll”(ByVal hWnd为Long,ByVal uMsg为Long,ByVal wParam为Long,ByRef lParam为Any)为Long
专用子表单_加载()
ListView1.ListItems.Add,“项目编号1”
ListView1.ListItems.Add,“第二项”
ListView1.ListItems.Add,“第三项”
ListView1.ListItems.Add,“第四项”
ListView1.ListItems.Add,“第五项”
ListView1.ListItems(3).Selected=True
附件消息我,ListView1.hWnd,WM_KILLFOCUS
端接头
私有子表单_卸载(取消为整数)
DetachMessage Me,ListView1.hWnd,WM_KILLFOCUS
端接头
私有财产出租子类响应(ByVal RHS作为SSubTimer6.EMsgResponse)
'
端属性
私有属性获取ISubclass_msgressponse()作为ssubtime6.EMsgResponse
ISubclass\u msgressponse=emrConsume
端属性
私有函数ISubclass_WindowProc(ByVal hWnd为Long,ByVal iMsg为Long,ByVal wParam为Long,ByVal lParam为Long)为Long
我想我会坚持多久
将lvi设置为LVITEM
选择案例iMsg
案例WM_KILLFOCUS
'获取所选项目并删除焦点
i=SendMessageW(hWnd,LVM_GETNEXTITEM,-1&,ByVal LVNI_FOCUSED或LVNI_SELECTED)
如果i-1那么
lvi.StateMask=LVIS\u聚焦
sendmagesw hWnd,LVM_SETITEMSTATE,i,lvi
如果结束
'返回1表示我们已处理该消息
ISubclass_WindowProc=1
结束选择
端函数

以下是解决同样问题的方法。这不容易做到。也许是API调用?它不是重复的。我问的是当listview没有焦点时更改所选项目的颜色。是否强制项目保持焦点?现在我们如何判断它是否有焦点?控件会得到我的键盘输入吗?@CodyGray该项实际上没有焦点。焦点矩形将被删除,项目将保持原始背景色。该控件仍然允许键盘输入。也许在视觉上并不理想,但根据应用程序的要求,它可能就足够了。