我使用 WinAPI 用 C 创建了一个小应用程序,但遇到了一个小问题。 Tab 键不会在控件之间切换。 应该是自动的吗?如果没有,您能告诉我如何实施吗? 我制定了一种在编辑框之间切换的算法,这是一个存根:
case WM_NOTIFY
{
if tab key
{
control_id++;
SetFocus(GetDlgItem(hwnd, control id));
if control_id = max_control_id
{ control_id = min_control_id; }
如果没有简单的方法,那么我应该使用我的算法吗?
P.S.:我尝试添加 TABSTOP,但不起作用。以下是一些不起作用的控件。我使用的是 VS 2010 Express,Windows 7 64 位。
hwnduser = CreateWindow (TEXT("EDIT"), NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP | WS_GROUP,
220, 80, 80, 20,
hwnd, (HMENU) 3, NULL, NULL);
hwndpass = CreateWindow (TEXT("EDIT"), NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP,
220, 130, 80, 20,
hwnd, (HMENU) 4, NULL, NULL);
CreateWindow(TEXT("button"), TEXT("Login"),
WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_GROUP,
80,200,100,30,
hwnd, (HMENU) 1, NULL, NULL);
CreateWindow(TEXT("button"), TEXT("Exit"),
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
220,200,100,30,
hwnd, (HMENU) 2, NULL, NULL);
您必须在消息循环中调用 IsDialogMessage()。
请参阅如何使用一个 IsDialogMessage() 调用多个无模式对话框了解如何执行此操作。
您需要为控件指定 WS_TABSTOP 样式。 MSDN 有详细信息。
在 WndProc 中使用 SetFocus(GetNextDlgTabItem(GetParent((HWND)wParam), (HWND)wParam, FALSE)); :
LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message)
{
case WM_CREATE:
{
CreateWindow(L"button", L"", WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP, 60, 50, 200, 20, hwnd, (HMENU)101, NULL, NULL);
CreateWindow(L"EDIT", L"", WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 72, 200, 20, hwnd, (HMENU)102, NULL, NULL);
CreateWindow(L"EDIT", L"", WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 92, 200, 20, hwnd, (HMENU)103, NULL, NULL);
CreateWindow(L"EDIT", L"", WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 60, 112, 200, 20, hwnd, (HMENU)104, NULL, NULL);
}
break;
case WM_SETFOCUS:
SetFocus(GetNextDlgTabItem(GetParent((HWND)wParam), (HWND)wParam, FALSE));
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}