创建ListView时出现奇怪的效果

5
我注意到当我创建一个ListView时有一个奇怪的效果。
如果我创建一个没有Button的ListView,ListView中选定的项会有一个点状边框。然而,当我也创建一个Button时,ListView选定的项就不再有点状边框了。只有在我拥有一个启用公共控件6的清单文件时才会发生这种情况:
这是我用来创建窗口、ListView和Button的代码:
// Create Window
HWND hWnd = CreateWindowEx(0, "WinClass", "My Window", WS_OVERLAPPEDWINDOW, 261, 172, 394, 284, NULL, NULL, hInstance, NULL);

// Create ListView
HWND hListView = CreateWindowEx(0, WC_LISTVIEW, "", WS_CHILD | LVS_REPORT | WS_VISIBLE, 0, 0, 232, 190, hWnd, 0, GetModuleHandle(NULL), NULL);

// Create Button
HWND hButtonRefresh = CreateWindowEx(NULL, "BUTTON", "OK", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 10, 200, 110, 25, hWnd, NULL, GetModuleHandle(NULL), NULL);

注意:我并不是对这个效果有问题,我只是想了解为什么会出现这种情况!


1
^ 这个。正如可以看到的,OK按钮有蓝色边框。 - Eregrith
@Jonathan Potter 但是在这两张图片中,我都是点击了ListView的项,所以ListView拥有焦点而不是Button。 - paul
在Windows中,当前默认情况下,焦点矩形只有在通过键盘进行操作时才会显示。你可以使用 WM_CHANGEUISTATE 消息来改变这一设置。 - Jonathan Potter
尝试添加另一个按钮和列表视图以查看效果。 - Fredrick Gauss
显示剩余2条评论
3个回答

1
只是因为按钮获得了焦点而列表视图失去了焦点,点击列表视图,点应该会重新出现。

不,这不是问题所在。即使我点击了任何ListView的项目,样式仍然保持不变。 - paul
@paul 在评论中已经解释了正在发生的事情。你还有什么不理解的吗?为什么要在这上面浪费赏金呢? - Jonathan Potter

0

我相信虚线边框表示默认控件。在第二个截图中,转到按钮的属性并将默认按钮设置为 false,然后您应该看到像第一个截图中的文本周围的虚线边框。

要执行此操作,请在资源视图中打开对话框,选择按钮,然后从右键菜单中选择“属性”。在属性窗口中,您应该在行为部分中看到默认按钮-只需将其更改为 false。

或者在代码中尝试类似以下内容:

DWORD style = m_BtnOk.GetStyle();
// remove default push button style
style &= ~BS_DEFPUSHBUTTON;
// set the style
::SendMessage(m_BtnClose.GetSafeHwnd(), BM_SETSTYLE, (WPARAM)style, (LPARAM)TRUE);

如何将默认按钮设置为 false? - paul
我没有使用任何资源,您可以在我的问题中看到我用来创建按钮的代码。 - paul
抱歉,只需从“确定”按钮的代码行中删除 BS_DEFPUSHBUTTON 即可。 - Craig Jones
我已经移除了 BS_DEFPUSHBUTTON,但效果仍然存在! - paul
点状边框出现在列表视图上,怎么可能是“默认控件”呢? - Jonathan Potter

0

正如其他人所指出的那样,它的目的是指示输入焦点。如果您在任何本地表单中使用 Tab 键,您会看到矩形跳到开发人员设置的索引。

它出现的原因是因为它具有 TabStop 属性。由于第一个示例中只有一个元素,因此只有一个选项卡停止可能性,因此由矩形指示。尝试调整 TabStop 属性,使用 Tab 键进行操作,看看会发生什么变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接