C 创建ListView时的奇怪效果

C 创建ListView时的奇怪效果,c,listview,winapi,C,Listview,Winapi,我在创建Listview时注意到一种奇怪的效果 当我创建一个ListView而不创建一个按钮时,ListView中的选定项有一个虚线边框。但是,当我同时创建一个按钮时,ListView所选项目不再有虚线边框。只有当我有一个启用公共控件的清单文件时,才会发生这种情况6: 这是我用来创建窗口、ListView和按钮的代码: // Create Window HWND hWnd = CreateWindowEx(0, "WinClass", "My Window", WS_OVERLAPPEDWIN

我在创建Listview时注意到一种奇怪的效果

当我创建一个ListView而不创建一个按钮时,ListView中的选定项有一个虚线边框。但是,当我同时创建一个按钮时,ListView所选项目不再有虚线边框。只有当我有一个启用公共控件的清单文件时,才会发生这种情况6:

这是我用来创建窗口、ListView和按钮的代码:

// 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);

注意:我对这种效果没有问题,我只是想了解为什么会发生这种情况

我相信虚线边框表示默认控件。在第二个屏幕截图中,转到按钮的属性并将Default button设置为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);

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

正如其他人所指出的,它的目的是指示输入焦点。如果您在任何本机表单周围进行制表,您将看到矩形在开发人员设置的索引周围跳跃


它之所以出现是因为它有一个。由于在第一个示例中只有一个元素,所以制表符停止只有一种可能性,所以它由矩形表示。使用属性“周围”选项卡,查看更改。

虚线边框表示listview具有输入焦点。默认情况下,无论最后创建哪个控件,都会获得输入焦点,这意味着当您有一个按钮时,它会拥有该按钮,而不是listview。^this。可以看到“确定”是蓝色边框的。@Jonathan Potter,但在这两幅图像中,我都单击了ListView项,因此ListView具有焦点而不是按钮。在您实际使用键盘之前,Windows中默认情况下会隐藏焦点矩形。您可以使用
WM_CHANGEUISTATE
消息来更改此设置。另请参见:如何将默认按钮设置为false?我没有使用资源,您可以在我的问题中看到我用于创建按钮的代码。Doh-抱歉。只需从OK按钮的行中删除BS_def按钮。我已删除了
BS_def按钮
,但效果仍然存在!虚线边框在listview上,这怎么可能是“默认控件”?不,这不是问题所在。即使单击任何ListView项,样式也保持不变。@paul注释中已经解释了发生的情况。你还不明白吗?你为什么在这上面浪费赏金?