禁用WIN32API聚焦控件突出显示

时间:2014-08-25 17:59:31

标签: winapi

如何选择控件(如按钮或复选框)时绘制的轮廓?

HWND chk=CreateWindow("button",s,
  BS_FLAT|BS_AUTOCHECKBOX|BS_LEFTTEXT|WS_CHILD|WS_VISIBLE,
  x,y,w,h,p,id,hInst,NULL);

http://www.thevbzone.com/L3_3.gif

3 个答案:

答案 0 :(得分:3)

根据UI状态显示焦点矩形,如助记符的下划线。默认情况下,这些内容是隐藏的,除非用户通过键盘启动了对话框或菜单。这个想法是,如果他们使用键盘,这些视觉提示很有用,但如果他们使用鼠标(或触摸),他们就会变得杂乱无章。

可以使用SPI_GET / SETKEYBOARDCUES通过SystemParametersInfo访问用户界面状态,但我不建议更改,因为它会影响用户的所有体验应用程序,而不仅仅是你的。

常规UI控件决定如何根据状态和当前UI状态绘制自己。如果您想要更改应用程序的外观,则必须使用控件为"所有者绘图提供的任何功能,"这可能是相当多的工作,并非所有控件类型都提供适当的覆盖。我不知道任何可以抑制焦点矩形的每个控制位。

如果您正在使用现代应用程序,则焦点指示器通常比旧样式按钮上的虚线矩形更清晰。如果您只是想要现代外观并且不想让键盘用户更难以使用您的应用程序,请确保您enabled visual styles

答案 1 :(得分:1)

This worked for me. After creating the button:

    if (hWndButton[i] != NULL)
    {
        SendMessage(hWndButton[i], WM_CHANGEUISTATE, (WPARAM)(0x10001),(LPARAM)(0));
    }

答案 2 :(得分:0)

只需替换按钮类的WM_SETFOCUS消息。我已经编写了所有代码。这在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);
}