Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
43-70_otvety_na_teplogo.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
87.53 Кб
Скачать

48. Работа с кнопками в окне приложений. Управление фокусом кнопок.

Нажимаемые кнопки, флажки, переключатели и кнопки, определяемые пользователем, получают фокус ввода при щелчке мыши на них. Признаком наличия фокуса ввода служит окружающая текст пунктирная линия. Когда дочерние окна управления получают фокус ввода, родительское окно

теряет его; весь ввод с клавиатуры направлен теперь не на родительское окно, а на дочернее окно управления. Однако, дочернее окно управления реагирует только на клавишу <Spacebar>, которая в этот момент действует аналогично мыши. Такая ситуация создает очевидную проблему: ваша программа теряет контроль над обработкой сообщений клавиатуры. Давайте посмотрим, что можно с этим сделать.

Когда Windows переключает фокус ввода с одного окна (например, родительского) на

другое (например, дочернее окно управления), она первым делом посылает сообщение WM_KILLFOCUS окну, теряющему фокус ввода. Параметр сообщения wParam является описателем окна, которое должно получить фокус ввода. Затем Windows посылает сообщение WM_SETFOCUS окну, получающему фокус ввода, при этом параметр сообщения wParam является описателем окна, которое теряет фокус ввода. (В обоих случаях, wParam может быть

равен NULL, который показывает, что нет окна, которое имеет или получает фокус ввода.)

Родительское окно, обрабатывая сообщения WM_KILLFOCUS, может предотвратить получение фокуса ввода дочерним окном. Предположим, что массив hwndChild содержит описатели всех дочерних окон. (Которые были помещены в массив при создании окон с помощью вызовов функций CreateWindow.) Пусть NUM — это число дочерних окон, тогда:

case WM_KILLFOCUS:

for(i = 0; i < NUM; i++)

if(hwndChild[ i ] ==(HWND) wParam)

{

SetFocus(hwnd);

break;

}

return 0;

Этот фрагмент кода показывает, что, если родительское окно определяет, что его фокус ввода переходит к одному из дочерних окон управления, оно вызывает функцию SetFocus и восстанавливает фокус ввода на себя.

Далее представлен более простой (но менее очевидный) способ добиться того же самого:

case WM_KILLFOCUS:

if(hwnd == GetParent((HWND) wParam))

SetFocus(hwnd);

return 0;

Однако, оба эти метода имеют недостатки: они не дают кнопкам возможности реагировать на клавишу <Spacebar>, поскольку кнопки никогда не получают фокус ввода. Лучше было бы дать кнопкам возможность получить фокус ввода, но при этом и пользователю обеспечить возможность переходить от кнопки к кнопке с помощью клавиши <Tab>.

48,А. Функции для изменения состояния дочерних окон на примере кнопок.

Если создается дочернее окно без WS_VISIBLE, то для его проявления нужна ф-я:

ShowWindow(hwndchild,SW_SHOWNORMAL)

ShowWindow(hwndchild,SW_HIDI)

IsWindowVisible(hwndchild).

Если окно становится недоступным, то оно не реагирует на клавиатуру и мышь и окрашивается в серый цвет.

EnableWindow(hwndchild,FALSe), если TRUE, то становится доступным

IsWindowEnable(hwndChild).

48,Б. Функции, которые определяют связи между идентификатором дочернего окна, хэнделом дочернего окна и хэнделом родительского окна.

Оконная процедура с помощью функции GetParent получает описатель своего родительского окна (окна диалога) и посылает ему сообщение WM_COMMAND с параметром wParam равным идентификатору дочернего окна элемента управления, который получен с помощью функции GetWindowLong. Затем оконная процедура диалогового окна передает это сообщение процедуре диалога программы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]