Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Combobox и манифест ХР


SPeller ©   (2004-11-07 17:44:00) 

У меня новая проблема с комбобоксом. Создаю комбобокс таким кодом:

var
 H: HWND;
begin
 H := CreateWindowEx(WS_EX_CLIENTEDGE, 'COMBOBOX', 'cb1',
   WS_CHILD or WS_BORDER or WS_VISIBLE or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or
   WS_TABSTOP or
   CBS_HASSTRINGS or CBS_DROPDOWN{LIST} or WS_VSCROLL,
   100, 0, 100, 100, Handle, 0, {HInstance}0, nil);
 SendMessage(H, CB_ADDSTRING, 0, Integer(PChar('Some item 1')));
 SendMessage(H, CB_ADDSTRING, 0, Integer(PChar('Some item 2')));
 ...
 SendMessage(H, CB_ADDSTRING, 0, Integer(PChar('Some item 23')));


Комбобокс создается, но если у программы нет манифеста ХР, то он в открытом состоянии выглядит как и положено:
http://speller.narod.ru/img/other/combobox2.gif
Но если у программы есть манифест, то он выглядит вот так:
http://speller.narod.ru/img/other/combobox1.gif
При включенных и выключенных темах эффект одинаковый. Значение высоты контрола игнорируется, можно вписать хоть 0, хоть 10000. Полоса прокрутки появляется только если кол-во элементов больше примерно 30.
VCL-комбобокс ведет себя нормально в обоих случаях.
Кто-нибудь знает, как лечить такой глюк?

WinXP SP1a.


Ученик   (2004-11-08 10:20:00) [1]

Проблему с высотой решит добавление CBS_NOINTEGRALHEIGHT при вызове CreateWindowEx


SPeller   (2004-11-08 05:48:00) [2]

С цветом возможно это решит проблему (пока не могу проверить), а как быть с высотой выпадающего списка?


Ученик   (2004-11-07 19:06:00) [3]

Возможно, можно проще, но VCL делает тоже самое :-)

var
 ComboWndProc: Pointer;


function MyComboWndProc(HWindow: HWnd; Message, WParam: Longint;
                       LParam: Longint): Longint; stdcall;
begin
 if Message = WM_CTLCOLORLISTBOX then begin
   SetBkColor(WParam, clWhite);
   Result := GetStockObject(WHITE_BRUSH)
 end else
   Result := CallWindowProc(ComboWndProc, HWindow, Message, WParam, LParam)
end;

...
ComboWndProc := Pointer(SetWindowLong(H, GWL_WNDPROC, LongInt(@MyComboWndProc)));
SendMessage(H, CB_ADDSTRING, 0, Integer(PChar('Some item 1')));


Наверх

Титульная страница Поиск, карта сайта Написать письмо