Как создать аналог выпадающего списка ComboBox

Dmitro25
Дата: 27.11.2007 12:29:51
Пишу собственный аналог инспектора объектов. Для реализации мне понадобилось создать аналог 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.FormCreate(Sender: TObject);
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, 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;
VirusXP
Дата: 27.11.2007 16:03:07
cxRTTIInspector

Всё уже написано до нас :(
Dmitro25
Дата: 28.11.2007 08:34:08
Чужим пользоваться неохота, поскольку своё уже написано... Дело в том, что мой компонент уже работает, только для вывода выпадающего списка используется немодальная форма. Единственный минус такого подхода в том, что при выпадении такого списка основная форма перестаёт быть активной, поэтому я решил переделать механизм выпадающего списка. Но столкнулся с вышеописанной проблемой. Самое главное - я знаю, что решение её возможно, поскольку всегда перед глазами системный ComboBox с его выпадающим списком ComboLBox, который функционирует по схожим принципам (т.е. делает SetCapture), но у него-то ScrollBar работает!