Пишу собственный аналог инспектора объектов. Для реализации мне понадобилось создать аналог ComboBox'a. Проблема с выпадающим списком (аналог системного ComboLBox). Он реализован с использованием CreateWindow('ComboLBox', ..., организацией собственного цикла обработки сообщений и т.д. Для отслеживания кликов мыши вне области окна приходится делать SetCapture (впрочем, так сделано и в системном ComboLBox). Но! В этом случае не работает прокрутка (ScrollBar) внутри моего окна. В смысле полоса прокрутки появляется когда надо, но при клике мыши на ней перемещение ползунка не происходит. Как это победить?
привожу пример кода:
var
hlb: THandle;
OldWndProc: Pointer;
function ComboLBoxWindowProc(Wnd: HWND; Msg, wParam, lParam: Longint): Longint; stdcall;
begin
Result:=CallWindowProc(OldWndProc, wnd, Msg, wParam, lParam);
case Msg of
WM_LBUTTONDOWN:
begin
ReleaseCapture;
ShowWindow(hlb, SW_HIDE);
end;
end;
end;
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var i: Integer;
begin
hlb:=CreateWindowEx(WS_EX_TOPMOST or WS_EX_TOOLWINDOW ,
'ComboLBox', '',
WS_CHILD or WS_CLIPSIBLINGS or WS_BORDER or WS_VSCROLL or WS_VISIBLE,
100, 100, 100, 200, form.handle, 0, HInstance, nil);
windows.SetParent(hlb, 0);
OldWndProc:=Pointer(GetWindowLong(hlb, GWL_WNDPROC));
SetWindowLong(hlb, GWL_WNDPROC, integer(@ComboLBoxWindowProc));
for i:=1 to 20 do
SendMessage(hlb, LB_ADDSTRING, 0, integer(pchar('12345')));
SetCapture(hlb);
end;