如何在使用 CreateWindow 创建的窗口中设置默认按钮而不是 Windows 中的对话框资源?

问题描述 投票:0回答:1

我正在开发一个 Windows 应用程序,需要使用

CreateWindow
函数创建自定义窗口。但是,我注意到,当我使用对话框资源时,我可以设置默认按钮,但当我使用
CreateWindow
动态创建窗口时,我不确定如何执行此操作。

有没有办法在使用 CreateWindow 创建的窗口中设置默认按钮而不依赖于对话框资源?如果是这样,实现这一目标的最佳方法是什么?我想确保默认按钮突出显示,并且当窗口处于焦点状态时可以通过“Enter”键激活。

我一直在网上进行广泛的研究,但我无法找到有关如何处理这种特定情况的任何明确信息。以下是我的

main.cpp
代码的摘录:

#include <Windows.h>
#include <CommCtrl.h>

#define IDC_BUTTON1 1001
#define IDC_BUTTON2 1002

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
    WNDCLASSEXA wcex = { };

    wcex.cbSize = sizeof(WNDCLASSEXA);
    wcex.lpfnWndProc = MainWindowProc;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIconA(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursorA(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
    wcex.lpszClassName = "MainWindowClass";

    RegisterClassExA(&wcex);

    HWND hWnd = CreateWindowExA(0, "MainWindowClass", "", WS_OVERLAPPEDWINDOW, 0, 0, 416, 228, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, SW_NORMAL);

    MSG msg = { };

    while (GetMessageA(&msg, NULL, 0, 0) > 0)
    {
        if (!IsDialogMessageA(hWnd, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessageA(&msg);
        }
    }

    return 0;
}

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:
        {
            HFONT hFont = CreateFontA(13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Shell Dlg 2");

            HWND hWndEdit1 = CreateWindowExA(WS_EX_CLIENTEDGE, WC_EDIT, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 100, 20, 200, 21, hWnd, NULL, NULL, NULL);
            HWND hWndEdit2 = CreateWindowExA(WS_EX_CLIENTEDGE, WC_EDIT, "", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 100, 60, 200, 21, hWnd, NULL, NULL, NULL);

            HWND hWndButton1 = CreateWindowExA(0, WC_BUTTON, "Button 1", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 122, 120, 75, 23, hWnd, (HMENU)IDC_BUTTON1, NULL, NULL);
            HWND hWndButton2 = CreateWindowExA(0, WC_BUTTON, "Button 2", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 203, 120, 75, 23, hWnd, (HMENU)IDC_BUTTON2, NULL, NULL);

            SendMessageA(hWndEdit1, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE);
            SendMessageA(hWndEdit2, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE);
            SendMessageA(hWndButton1, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE);
            SendMessageA(hWndButton2, WM_SETFONT, (WPARAM)hFont, (LPARAM)FALSE);

            SendMessageA(hWndEdit1, EM_SETMARGINS, (WPARAM)EC_LEFTMARGIN, (LPARAM)0);
            SendMessageA(hWndEdit2, EM_SETMARGINS, (WPARAM)EC_LEFTMARGIN, (LPARAM)0);
        } break;

        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
                case IDOK:
                {
                    MessageBoxA(hWnd, "OK", "Title", MB_OK);
                } break;

                case IDCANCEL:
                {
                    MessageBoxA(hWnd, "Cancel", "Title", MB_OK);
                } break;

                case IDC_BUTTON1:
                {
                    MessageBoxA(hWnd, "BUTTON 1", "Title", MB_OK);
                } break;

                case IDC_BUTTON2:
                {
                    MessageBoxA(hWnd, "BUTTON 2", "Title", MB_OK);
                } break;
            }
        } break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProcA(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

我尝试使用

DM_SETDEFID
,但我找不到让它按预期工作的方法。看来我可能需要手动处理
DM_SETDEFID
DM_GETDEFID
事件,但我不确定如何处理此问题以确保正常功能。

我正在寻找有关如何有效管理

DM_SETDEFID
DM_GETDEFID
事件的指导,或任何其他推荐的技术,使我能够为 Windows 应用程序中使用 CreateWindow 创建的自定义窗口设置默认按钮。

c++ c winapi
1个回答
0
投票

为默认按钮指定

BS_DEFPUSHBUTTON
窗口样式:

创建一个行为类似于 BS_PUSHBUTTON 样式按钮的按钮,但具有独特的外观。如果该按钮位于对话框中,则即使该按钮没有输入焦点,用户也可以通过按 ENTER 键来选择该按钮。这种样式对于使用户能够快速选择最可能的(默认)选项很有用。

© www.soinside.com 2019 - 2024. All rights reserved.