#c #winapi #tabs
#c #winapi #вкладки
Вопрос:
Я создал небольшое приложение на C, используя WinAPI, и у меня возникла небольшая проблема. Клавиша 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; }
Если нет простого способа, то должен ли я использовать мой алгоритм?
PS: Я пытался добавить TABSTOP, это не работает. Вот некоторые элементы управления, которые не работают. Я использую VS 2010 Express, 64-разрядную версию Windows 7.
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);
Комментарии:
1. Что случилось с проверенным методом установки tabstop и разрешения wndproc по умолчанию обрабатывать его?
2. @Ignacio Vazquez-Abrams Этот испытанный метод у меня не работает. Смотрите редактирование.
Ответ №1:
Вы должны вызвать IsDialogMessage() в цикле обмена сообщениями. Смотрите эту статью о том, как это сделать.
Комментарии:
1. решил и мою проблему, так что 1. кстати, это также позволяет клавишам со стрелками перемещать фокус между элементами управления. Краткая версия статьи: В вашем цикле обмена сообщениями, сразу после GetMessage(), вызовите IsDialogMessage(), и если это вернет true, не утруждайте себя переводом и отправкой.
2. будет использоваться с
WS_TABSTOP
стилем окна.3. Ссылка недоступна
Ответ №2:
Вам нужно придать вашим элементам управления стиль WS_TABSTOP. В MSDN есть подробности.
Ответ №3:
Используйте SetFocus(GetNextDlgTabItem(getParent((HWND)wParam), (HWND)wParam, FALSE)); в WndProc :
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;
}