Здравствуйте Leonid33, Вы писали:
L>Ситуация:
L> Есть выпадающее окно (в компоненте типа ComboEdit)
L>Это окно умеет изменять размер, но не имеет фокуса ввода с клавиатуры.
L>Фокус ввода должен быть всегда у соответствующего редактора (у дрругого окна).
L>Для этого на сообщение WM_MOUSEACTIVATE отвечаю MA_NOACTIVATE.
L>Но при изменении размера этого окна (выпадающего),
L>ему приходит сообщение WM_ACTIVATE и оно получает фокус ввода.
L>Как этого избежать?
Как обычно в таких случаях — открываю MSDN — ищу WM_ACTIVATE и ессно читаю.
А написано там вот что:
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_ACTIVATE
WPARAM wParam, // activation and minimization options
LPARAM lParam // handle to window (HWND)
);
wParam
The low-order word specifies whether the window is being activated or deactivated.
This parameter can be one of the following values.
Value Meaning
WA_ACTIVE Activated by some method other than a mouse click (for example, by a call to the SetActiveWindow function or by use of the keyboard interface to select the window).
WA_CLICKACTIVE Activated by a mouse click.
WA_INACTIVE Deactivated.
The high-order word specifies the minimized state of the window being activated or deactivated. A nonzero value indicates the window is minimized.
lParam
Handle to the window being activated or deactivated, depending on the value of the wParam parameter. If the low-order word of wParam is WA_INACTIVE, lParam is the handle to the window being activated. If the low-order word of wParam is WA_ACTIVE or WA_CLICKACTIVE, lParam is the handle to the window being deactivated.
This handle can be NULL.
Вот значит проверяем флаги и активируем окно HWND(lParam) —
SetActiveWindow(HWND(lParam));
Вот и всё.
Удачи.
-------------------------------------------------------------------
Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
L>>Как этого избежать?
G>Как обычно в таких случаях — открываю MSDN — ищу WM_ACTIVATE и ессно читаю.
G>А написано там вот что:
...
G>Вот значит проверяем флаги и активируем окно HWND(lParam) —
G>G>SetActiveWindow(HWND(lParam));
G>
G>Вот и всё.
G>Удачи.
Это-то понятно, что можно венуть фокус обратно.
В приципе — это тоже решение.
Но можно ли, вообще, избежать в данном случае передачу фокуса?