c - 如何使 tab 键在此对话框控件中起作用?
问题描述
我添加IsDialogMessage()
到我的主循环中,tab 键确实有效,但它卡在选项卡控件的顶部,并且没有进入对话框内的控件。我该如何解决?我已经尝试WS_GROUP
过第一个控件和WS_TABSTOP
所有下一个创建的控件,但它没有工作。
选项卡控件的创建方式如下:
hTabControl =
CreateWindowW(WC_TABCONTROLW, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_TABSTOP | WS_GROUP | WS_EX_CONTROLPARENT,
10, 30, 400, 250,
hwnd,
(HMENU) ID_MAIN_TABCONTROL,
NULL,
NULL);
和对话框:
CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT,
"DialogBox",
L"Dialog Box",
WS_SYSMENU | WS_CHILD | WS_GROUP | WS_TABSTOP | WS_VISIBLE,
10, 30, 350, 150,
hTabControl, NULL, ghInstance, NULL
);
// ...
WNDCLASSEXW wc = {0};
wc.cbSize = sizeof(WNDCLASSEXW);
wc.lpfnWndProc = DialogProc;
wc.hInstance = ghInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpszClassName = "DialogClass";
RegisterClassExW(&wc);
然后是 DialogProc 过程:
LRESULT CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
CreateWindowW(L"button", L"A",
WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_GROUP,
50, 50, 80, 25, hwnd, (HMENU) ID_TAB1_BUTTONA, NULL, NULL);
CreateWindowW(L"button", L"B",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
150, 50, 80, 25, hwnd, (HMENU) ID_TAB1_BUTTONB, NULL, NULL);
CreateWindowW(L"button", L"C",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
250, 50, 80, 25, hwnd, (HMENU) ID_TAB1_BUTTONC, NULL, NULL);
CreateWindowW(L"button", L"D",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
50, 100, 80, 25, hwnd, (HMENU) ID_TAB1_BUTTOND, NULL, NULL);
CreateWindow(L"Edit", NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | WS_TABSTOP,
150, 100, 80, 20, hwnd, (HMENU) ID_TAB1_EDIT1, NULL, NULL);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
// didn't do anything
default:
break;
case ID_TAB1_BUTTONA:
{
MessageBox(NULL, L"Click on A button", L"Welcome to the jungle!", MB_OK);
}
break;
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
和主循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsDialogMessage(hwnd, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
解决方案
推荐阅读
- c++ - gcc 4.6.1 版与 protobuf 兼容吗?
- autodesk-forge - 删除所有模型派生属性?
- laravel - 在 Laravel 中找不到观察者
- blockchain - Hyperledger Besu 是否与 Cosmos IBC 兼容?
- networking - 如何在 SONiC OS 中找到内存缓冲区大小限制?
- javascript - 数组在 reduce()、map() 等内部可用的原因是什么?
- python - Spark使用mappartitions将rdd文本文件转换为列,同时保留空值
- flutter - 如何让 RotateTransition 将我的小部件旋转一半(180 度)
- c# - 使用启动窗口运行 Windows 窗体应用程序
- javascript - 如何在javascript中设置数组对象的键值?