![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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')));