Winapi 禁用WIN32API焦点控件高亮显示
选择按钮或复选框等控件时,如何删除绘制的轮廓Winapi 禁用WIN32API焦点控件高亮显示,winapi,Winapi,选择按钮或复选框等控件时,如何删除绘制的轮廓 HWND chk=CreateWindow("button",s, BS_FLAT|BS_AUTOCHECKBOX|BS_LEFTTEXT|WS_CHILD|WS_VISIBLE, x,y,w,h,p,id,hInst,NULL); 焦点矩形,如用于助记符的下划线,根据用户界面状态显示。默认情况下,这些内容是隐藏的,除非用户通过键盘启动对话框或菜单。这个想法是,如果他们使用键盘,这些视觉提示是有用的,但如果他们使用鼠标(或触摸),它们只是杂
HWND chk=CreateWindow("button",s,
BS_FLAT|BS_AUTOCHECKBOX|BS_LEFTTEXT|WS_CHILD|WS_VISIBLE,
x,y,w,h,p,id,hInst,NULL);
焦点矩形,如用于助记符的下划线,根据用户界面状态显示。默认情况下,这些内容是隐藏的,除非用户通过键盘启动对话框或菜单。这个想法是,如果他们使用键盘,这些视觉提示是有用的,但如果他们使用鼠标(或触摸),它们只是杂乱无章 用户界面状态可以通过使用
SPI_GET
/SETKEYBOARDCUES
来访问,但我不建议更改,因为它会影响用户对所有应用程序的体验,而不仅仅是您的应用程序
常规UI控件根据其状态和当前UI状态决定如何绘制它们自己。如果要更改应用程序的外观,则必须使用控件为“所有者绘图”提供的任何功能,这可能需要大量工作,而且并非所有控件类型都提供适当的替代。我不知道有哪种控制位可以抑制聚焦矩形
如果您使用的是现代应用程序,焦点指示器的外观通常比老式按钮上的虚线矩形干净得多。如果你只是想要现代的外观,而不是真的想让键盘用户更难使用你的应用程序,请确保你已经完成了。焦点矩形,如用于助记符的下划线,根据用户界面状态显示。默认情况下,这些内容是隐藏的,除非用户通过键盘启动对话框或菜单。这个想法是,如果他们使用键盘,这些视觉提示是有用的,但如果他们使用鼠标(或触摸),它们只是杂乱无章 用户界面状态可以通过使用
SPI_GET
/SETKEYBOARDCUES
来访问,但我不建议更改,因为它会影响用户对所有应用程序的体验,而不仅仅是您的应用程序
常规UI控件根据其状态和当前UI状态决定如何绘制它们自己。如果要更改应用程序的外观,则必须使用控件为“所有者绘图”提供的任何功能,这可能需要大量工作,而且并非所有控件类型都提供适当的替代。我不知道有哪种控制位可以抑制聚焦矩形
如果您使用的是现代应用程序,焦点指示器的外观通常比老式按钮上的虚线矩形干净得多。如果您只是想要现代的外观,而不是真的想让键盘用户更难使用您的应用程序,请确保您已经安装了。只需更换button类的WM_SETFOCUS msg即可。我已经写了所有的代码。这在win32中称为子类化
#include <windows.h>
// window callback
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// redefining button class
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WNDPROC oldButtonProc;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, char* cmdLine, int cmdShow)
{
const char WNDClsName[] = "no-name";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = WNDClsName;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
HWND hwnd = CreateWindow(
WNDClsName,
"Caption",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // parent
NULL, // menu
hInstance, // instance handle
NULL); // additional application data
HWND button1 = CreateWindow(
"button", // class
"", // text
WS_CHILD | WS_BORDER | WS_VISIBLE, // style
CW_USEDEFAULT, CW_USEDEFAULT, // x,y
CW_USEDEFAULT, CW_USEDEFAULT, // w,h
hwnd, // parent
(HMENU) 101,
hInstance,
NULL);
oldButtonProc = (WNDPROC) SetClassLong(button1, GCL_WNDPROC, (LONG)ButtonProc);
DestroyWindow(button1);
button1 = CreateWindow(
"button", // class
"Doit!", // text
WS_CHILD | WS_BORDER | WS_VISIBLE, // style
CW_USEDEFAULT, CW_USEDEFAULT, // x,y
CW_USEDEFAULT, CW_USEDEFAULT, // w,h
hwnd, // parent
(HMENU) 101,
hInstance,
NULL);
ShowWindow(hwnd, cmdShow);
// run the message loop
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SetWindowLong(button1, GCL_WNDPROC, (LONG)oldButtonProc);
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_SIZE:
{
short width = LOWORD(lParam);
short height = HIWORD(lParam);
MoveWindow(GetDlgItem(hwnd, 101), width/2-40, height/2-10, 80, 20, 0);
InvalidateRect(hwnd, 0, 0);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_SETFOCUS)
{
return 0;
}
return CallWindowProc(oldButtonProc, hwnd, uMsg, wParam, lParam);
}
#包括
//窗口回调
LRESULT回调WindowProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM);
//重新定义按钮类
LRESULT回调按钮PROC(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM);
WNDPROC oldButtonProc;
int-WINAPI-WinMain(HINSTANCE-HINSTANCE,HINSTANCE,char*cmdLine,int-cmdShow)
{
const char WNDClsName[]=“无名称”;
WNDCLASS wc={};
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.lpszClassName=WNDClsName;
wc.hCursor=LoadCursor(空,IDC_箭头);
注册类(&wc);
HWND HWND=CreateWindow(
WNDClsName,
“标题”,
WS_重叠窗口,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,//父项
NULL,//菜单
hInstance,//实例句柄
NULL);//其他应用程序数据
HWND按钮1=创建窗口(
“按钮”//class
“”,//文本
WS|u CHILD | WS|u BORDER | WS|u VISIBLE,//样式
CW_USEDEFAULT,CW_USEDEFAULT,//x,y
CW_usefault,CW_usefault,//w,h
hwnd,//父
(汉努)101,
hInstance,
无效);
oldButtonProc=(WNDPROC)SetClassLong(按钮1,GCL_WNDPROC,(长)按钮Proc);
打开窗口(按钮1);
button1=CreateWindow(
“按钮”//class
“Doit!”,//文本
WS|u CHILD | WS|u BORDER | WS|u VISIBLE,//样式
CW_USEDEFAULT,CW_USEDEFAULT,//x,y
CW_usefault,CW_usefault,//w,h
hwnd,//父
(汉努)101,
hInstance,
无效);
ShowWindow(hwnd、cmdShow);
//运行消息循环
MSG={};
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
SetWindowLong(按钮1,GCL_WNDPROC,(长)旧按钮PROC);
返回0;
}
LRESULT回调WindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
案例WM_销毁:
PostQuitMessage(0);
返回0;
案例WM_大小:
{
短宽度=LOWORD(LPRAM);
短高度=HIWORD(lParam);
移动窗口(GetDlgItem(hwnd,101),宽度/2-40,高度/2-10,80,20,0);
(hwnd,0,0);
返回0;
}
案例WM_油漆:
{
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hwnd和ps);
FillRect(hdc和ps.rcPaint,(HBRUSH)(颜色窗口+1));
端漆(hwnd和ps);
}
返回0;
}
返回DefWindowProc(hwnd、uMsg、wParam、lParam);
}
LRESULT回调按钮PROC(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
if(uMsg==WM_SETFOCUS)
{
返回0;
}
返回CallWindowProc(oldButtonProc、hwnd、uMsg、wParam、lParam);
}
只需替换button类的WM_SETFOCUS msg。我已经写了所有的代码。这在win32中称为子类化
#include <windows.h>
// window callback
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// redefining button class
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
WNDPROC oldButtonProc;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, char* cmdLine, int cmdShow)
{
const char WNDClsName[] = "no-name";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = WNDClsName;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
HWND hwnd = CreateWindow(
WNDClsName,
"Caption",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // parent
NULL, // menu
hInstance, // instance handle
NULL); // additional application data
HWND button1 = CreateWindow(
"button", // class
"", // text
WS_CHILD | WS_BORDER | WS_VISIBLE, // style
CW_USEDEFAULT, CW_USEDEFAULT, // x,y
CW_USEDEFAULT, CW_USEDEFAULT, // w,h
hwnd, // parent
(HMENU) 101,
hInstance,
NULL);
oldButtonProc = (WNDPROC) SetClassLong(button1, GCL_WNDPROC, (LONG)ButtonProc);
DestroyWindow(button1);
button1 = CreateWindow(
"button", // class
"Doit!", // text
WS_CHILD | WS_BORDER | WS_VISIBLE, // style
CW_USEDEFAULT, CW_USEDEFAULT, // x,y
CW_USEDEFAULT, CW_USEDEFAULT, // w,h
hwnd, // parent
(HMENU) 101,
hInstance,
NULL);
ShowWindow(hwnd, cmdShow);
// run the message loop
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SetWindowLong(button1, GCL_WNDPROC, (LONG)oldButtonProc);
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_SIZE:
{
short width = LOWORD(lParam);
short height = HIWORD(lParam);
MoveWindow(GetDlgItem(hwnd, 101), width/2-40, height/2-10, 80, 20, 0);
InvalidateRect(hwnd, 0, 0);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK ButtonProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_SETFOCUS)
{
return 0;
}
return CallWindowProc(oldButtonProc, hwnd, uMsg, wParam, lParam);
}
#包括
//窗口回调
LRESULT回调WindowProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM);
//重新定义按钮类
LRESULT回调按钮PROC(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM l