Здравствуйте!
Пытаюсь реализовать нечто похожее на КомбоБокс. Интересен один механизм который используется в оригинальном КомбоБоксе, а именно закрытие его Popup списка Item-ов при выделении другого контрола, активации и деактивации окна, при том что само Popup окно создается и показывается неактивным т.к. окно содержащее КомбоБокс не теряет своей активности при его открытии, соответственно Popup не получает фокус (Иначе бы он стал активным). Также для того чтобы окно не активировалось по клику на нем я обрабатываю сообщение WM_MOUSEACTIVATE, где возвращаю в результат MA_NOACTIVATE.
Следовательно, что я сейчас имею:
1) Невозможно обрабатывать сообщение WM_ACTIVATE (Из за того что Popup изначально не активен).
2) Невозможно обработать сообщения WM_SETFOCUS и WM_KILLFOCUS (Из за того что Popup не получает фокус).
Все что сумел сделать, это обработать WM_ACTIVATEAPP при потере фокуса окном процесса и WM_WINDOWPOSCHANGING при смене Z ордера на окне.
Само окошко реализовано на основе класса TWinControl. Привожу некоторые фрагменты кода:
procedure TAMCheckComboBoxDropDownList.CreateParams(
var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := WS_POPUP;
if NewStyleControls then
ExStyle := WS_EX_TOOLWINDOW;
end;
end;
procedure TAMCheckComboBoxDropDownList.HideList;
begin
if fActive then
begin
ShowWindow(Handle, SW_HIDE);
fActive := false;
end;
end;
procedure TAMCheckComboBoxDropDownList.ShowList;
var
Rct : TRect;
begin
GetWindowRect(fOwner.Handle, Rct);
SetWindowPos(Handle, HWND_TOP, Rct.Left, Rct.Bottom, Rct.Right - Rct.Left, 100, SWP_NOACTIVATE);
ParentWindow := fOwner.Handle;
ShowWindow(Handle, SW_SHOWNOACTIVATE);
fActive := true;
end;
procedure TAMCheckComboBoxDropDownList.WMMouseActivate(
var Msg: TWMMouseActivate);
begin
Msg.Result := MA_NOACTIVATE;
end;
Собственно остался вопрос, как прятать Popup, так как это делает стандартный ComboBox?