我正在开发一个 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 创建的自定义窗口设置默认按钮。
BS_DEFPUSHBUTTON
窗口样式:
创建一个行为类似于 BS_PUSHBUTTON 样式按钮的按钮,但具有独特的外观。如果该按钮位于对话框中,则即使该按钮没有输入焦点,用户也可以通过按 ENTER 键来选择该按钮。这种样式对于使用户能够快速选择最可能的(默认)选项很有用。