Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 禁用WIN32API焦点控件高亮显示_Winapi - Fatal编程技术网

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