c++ - 按钮全部突出显示
问题描述
我有两个按钮。每个按钮都被突出显示,而不仅仅是第一个按钮。如何使第一个按钮仅突出显示?
顺便说一句,这是两个按钮的代码:
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
但没有运气。
解决方案
首先,停止调用A
WinAPI 函数的版本。那些在 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
函数可以轻松实现该行为(通过创建一个对话框可以“免费”获得该行为,并添加了资源编辑器的好处来布置控件和设置样式)。
推荐阅读
- python - Pymongo 聚合()$项目
- r - 如果两列相同,则重命名字符串
- python - 在 django 中运行 Websockets 服务器
- vue.js - 绑定到 getter 的计算属性不会在从 Vuex 状态对象中按键删除项目时更新
- android - 我可以将windows上的android studio项目导入mac os吗?
- javascript - 拒绝以响应异步函数中无关等待期间的事件
- c# - asp.net c#中SQLDATASOURCE的常用参数
- firebase-dynamic-links - 如何以编程方式撤销或删除firebase动态链接?
- mysql - 如何在 SQL 中按行分组?
- database - Android Room Database:如何嵌入多个实体