首页 > 解决方案 > 按钮全部突出显示

问题描述

我有两个按钮。每个按钮都被突出显示,而不仅仅是第一个按钮。如何使第一个按钮仅突出显示?

在此处输入图像描述

顺便说一句,这是两个按钮的代码:

openFileButton = CreateWindowA("button", "Open File and start hashing", WS_VISIBLE | WS_CHILD | SS_CENTER, 220, 210, 200, 50, hWnd,
                (HMENU)BUTTON_OPEN_FILE, NULL, NULL);
  SendMessage(openFileButton, WM_SETFONT, my_font, true);
  hashFileButton = CreateWindowA("button", "Get the File hash", WS_VISIBLE | WS_CHILD | SS_CENTER, 220, 270, 200, 50, hWnd,
                (HMENU)BUTTON_HASH_FILE, NULL, NULL);
  SendMessage(hashFileButton, WM_SETFONT, my_font, true);

尝试使用SetFocus但没有运气。

标签: c++winapi

解决方案


首先,停止调用AWinAPI 函数的版本。那些在 90 年代就已经过时了。改用W版本,L在字符串文字上带有前缀并wchar_t作为字符类型。

其次,您为按钮传递了错误的样式标志。具体来说,您正在通过SS_CENTER. 这是静态控件的样式(因此是SS_前缀),而不是按钮的样式。SS_CENTER在Windows头文件中被#定义为值0x1,相当于按钮样式,BS_DEFPUSHBUTTON. (请注意,#define 宏不是类型安全的,因此编译器不知道也无法警告您在创建按钮控件时指定了静态控件样式。)

这种错误BS_DEFPUSHBUTTON样式的存在是为什么您的按钮都突出显示的原因,就好像它们是对话框中的默认按钮一样。对于标准按钮,您需要BS_PUSHBUTTON#defined 为值 0x0,因此相当于不将任何样式标志传递给您的CreateWindow函数。但是为了可读性和自记录代码,我强烈建议显式传递BS_PUSHBUTTON.

因此,您更正的代码变为:

openFileButton = CreateWindowW(L"button",
                               L"Open File and Start Hashing",
                               WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                               220, 210, 200, 50,
                               hWnd,
                               (HMENU)BUTTON_OPEN_FILE,
                               NULL,
                               NULL);
SendMessage(openFileButton, WM_SETFONT, my_font, true);

hashFileButton = CreateWindowW(L"button",
                               L"Get the File Hash",
                               WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
                               220, 270, 200, 50,
                               hWnd,
                               (HMENU)BUTTON_HASH_FILE,
                               NULL,
                               NULL);
SendMessage(hashFileButton, WM_SETFONT, my_font, true);

您实际上可能希望使用该样式将一个(并且只有一个)按钮设置为“默认”按钮。BS_DEFPUSHBUTTON通过在主消息循环中调用该IsDialogMessage函数可以轻松实现该行为(通过创建一个对话框可以“免费”获得该行为,并添加了资源编辑器的好处来布置控件和设置样式)。


推荐阅读