Форум: "KOL";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизComboBox Найти похожие ветки
← →
nsvi (2004-01-03 12:17) [0]Имеются 2 Комбобокса. В первый выводятся рисунки 16х16 из ImageList, второй - для выбора стандартных цветов. Применяю обработчики события OnDrawItem. Взяты из ответов в данном форуме и из компонентов. Работает все хорошо, за исключением - в обоих случаях в строку выбора выводится только текст, а рисунки и образцы цвета отсутствуют. Что здесь не так? Бьюсь уже давно, но решения так и не нашел.
function TForm1.ComboBox1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
cbRect: TRect;
begin
cbRect := Rect;
FillRect(DC, cbRect, ComboBox1.Canvas.Brush.Handle);
cbRect.Left := 28;
DrawText(DC, PChar(Int2str(ItemIdx+1)),
-1, cbRect, DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
//== Icon 16x16
if (odsComboboxEdit in ItemState) then
begin // Edit
cbRect.Top := 4;
cbRect.Bottom := 20;
cbRect.Left := 3;
cbRect.Right := 19;
end
else
begin // DropList
cbRect.Left := 2;
cbRect.Right := 18;
end;
ImageList1.StretchDraw(Itemidx, DC, cbRect);
end;
В этом обработчике стандартные цвета находятся в массиве ColorValues.
function TForm1.ComboBox2DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
TextRect : TRect;
ColorRect : TRect;
begin
if ItemIdx > -1 then
begin
FillRect(DC,Rect,0);
ColorRect.Top := Rect.Top + 1 ;
ColorRect.Left := Rect.Left + 2;
ColorRect.Right := 60;
ColorRect.Bottom := Rect.Bottom - 1;
Combobox2.Canvas.Brush.Color :=ColorValues[itemidx];
Combobox2.Canvas.Pen.Color := clHighlight;
SelectObject(DC,Combobox2.Canvas.Brush.Handle);
RectangleDC,ColorRect.Left,ColorRect.Top,ColorRect.Right,ColorRect.Bottom);
Combobox2.Canvas.Brush.Color := Combobox2.Color;
SelectObject(DC,Combobox2.Canvas.Brush.Handle);
TextRect := Rect;
TextRect.Left := 63;
DrawText(DC,PChar(Combobox2.Items[ItemIdx]),Length(Combobox2.Items[ItemIdx]),textRect,DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
end;
end;
Delphi6, KOL&MCK - 1.86
← →
Gandalf © (2004-01-03 20:25) [1]А OwnerDraw включено?
← →
nsvi (2004-01-04 02:29) [2]Да, включено coOwnerDrawVariable
← →
nsvi (2004-01-04 02:39) [3]Решил поиграть с Options ComboBox-ов и когда поставил ReadOnly в true - все заработало! Да откуда же знать, что этот параметр влияет на вывод картинки в строку выбора?
← →
SPeller © (2004-01-05 09:40) [4]Скинь мне на мыло - гляну.
← →
Bez (2004-05-05 15:41) [5]А почему когда я в ComboBox вывожу рисунки, то не выделяется тот Item, над которым находится мыша?
← →
Gandalf © (2004-05-05 17:07) [6]А как выводишь? Рисуем? Надо и выделение рисовать.
← →
Bez (2004-05-05 19:11) [7]Сорри, а в каком событии это обрабатывать надо?
Я так понимаю, что надо вычислить область над которой находится курсор и покрасить ее в нужный цвет, так или нет?
← →
Gandalf © (2004-05-05 23:27) [8]Так.
← →
Bez (2004-05-06 00:48) [9]Я делаю это в событии DrawItem
if Combobox2.CurIndex=ItemIdx
then ComboBox2.Brush.Color:= clMenu
else ComboBox2.Brush.Color:= clWindow;
Получается следующая весчь:
Items-ы имеют фон clMenu, a выделенный Item, над которым мышка, имеет фон clWindow. Т.е. все наоборот получается.... :(
Может я просто не правильно делаю это???
← →
SPeller © (2004-05-06 05:43) [10]Ты что, с цветами разобраться не можешь?
← →
Gandalf © (2004-05-06 10:54) [11]function TForm1.ComboBox1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
begin
end;
Тут тебе ItemIdx и ItemState - что еще нужно для счастья?
← →
Bez (2004-05-06 23:22) [12]Никак не выходит у меня счастье :(
намекните хоть еще на что-нибудь... или покажите на примере
← →
SPeller © (2004-05-07 04:52) [13]Проверяй ItemState, и если итем выделен, то рисуй соответствующим образом, что непонятного?
← →
Bez (2004-05-12 13:03) [14]Покапался, что то не получилось нормально сделать
смог вот так (то что жирным выделено), тока это как то не прикольно смотрится, цвет выделения не такой, как в системе установлен...
function TfrmAbonent.ComboBox2DrawItem(Sender: PObj; DC: HDC;
const Rect: TRect; ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
var
cbRect: TRect;
Bitmap: PBitmap;
hLib : HModule;
ResName: PChar;
begin
cbRect := Rect;
FillRect(DC, cbRect, ComboBox2.Canvas.Brush.Handle);
cbRect.Left := 28;
DrawText(DC, PChar(ComboBox2.Items[ItemIdx]),-1, cbRect,
DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
if (odsComboboxEdit in ItemState) then
begin // Edit
cbRect.Top := 4;
cbRect.Bottom := 20;
cbRect.Left := 3;
cbRect.Right := 19;
end
else
begin // DropList
cbRect.Left := 2;
cbRect.Right := 18;
end;
hLib := LoadLibrary("syncres.dll");
if hLib <> 0 then
begin
ResName:= nil;
Bitmap := NewBitmap(16, 16);
case ItemIdx of
0 : ResName:= PChar("PHONETYPE_01");
1 : ResName:= PChar("PHONETYPE_02");
2 : ResName:= PChar("PHONETYPE_03");
3 : ResName:= PChar("PHONETYPE_04");
4 : ResName:= PChar("PHONETYPE_05");
5 : ResName:= PChar("PHONETYPE_06");
end;
Bitmap.LoadFromResourceName(hLib, ResName);
Bitmap.DrawTransparent(DC, cbRect.Left, cbRect.Top,
clFuchsia );
end;
cbRect:= Rect;
cbRect.Left := 24;
if (odaSelect in DrawAction) then InvertRect(DC,cbRect);
end;
← →
Gandalf © (2004-05-12 13:37) [15]А почему InvertRect? Или тогда почему удивляемся?
ComboBox2.Canvas.Brush.Color:=clHighlight;
Ну и цвет шрифта не забываем менять...
← →
Bez (2004-05-12 14:19) [16]А если так сделать, то фон выпадающего списка становится цвета clHighlight; а под надписями остается старый фон....
причем при наведении мыши на Item цвета не меняются...
а если добавить изменение цвета шрифта
ComboBox2.Font.Color:= clRed;
то при раскрытии списка (выпадении) фон становится цвета clHighlight, BackGround под буквами остается старый, шрифт становится красного цвета у всех Item"ов...
А при наведении на Item шрифт изменяется на clWindowText
Вот такая трабла получачется :(
← →
SPeller © (2004-05-12 14:43) [17]Я думаю что не стоит использовать шрифт самого комбобокса при отрисовке. Лучше создать временный шрифт и юзать его для всех действий. А цвета..... Ну что тут непонятного? Цвет фона - clWindow, цвет текста - clWindowText, цвет выделения - clHighlight. Где проблема?
← →
Bez (2004-05-12 16:07) [18]проблема здесь
ComboBox2.Canvas.Brush.Color:=clHighlight;
если так, то становится цвета clHighlight не тот участок, где располагается мышь, вернее не выделенный Item подсвечивается, а просто область вокруг текста становится такого цвета...
Т.е. представим, что цвет области у нас белый (область - выпадающий список). Когда в нормальном ComboBoxe (без картинок) наводишь мышь на определенный Item, то обасть, где располагается Item становится синего цвета, а шрифт белого.
А у меня - при раскрытии ComboBoxa получается цвет области синий, а текст черный, а под текстом (background под буквой) - белый
← →
SPeller © (2004-05-12 16:55) [19]Я немного ошибся - цвет выделения clHighlight, а текста при этом clHighlightText.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.055 c