![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ComboBox
nsvi © (2004-01-03 12:17:00)Имеются 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
SPeller (2004-05-12 16:55:00) [1]Я немного ошибся - цвет выделения clHighlight, а текста при этом clHighlightText.
Bez (2004-05-12 16:07:00) [2]проблема здесь
ComboBox2.Canvas.Brush.Color:=clHighlight;
если так, то становится цвета clHighlight не тот участок, где располагается мышь, вернее не выделенный Item подсвечивается, а просто область вокруг текста становится такого цвета...
Т.е. представим, что цвет области у нас белый (область - выпадающий список). Когда в нормальном ComboBoxe (без картинок) наводишь мышь на определенный Item, то обасть, где располагается Item становится синего цвета, а шрифт белого.
А у меня - при раскрытии ComboBoxa получается цвет области синий, а текст черный, а под текстом (background под буквой) - белый
SPeller (2004-05-12 14:43:00) [3]Я думаю что не стоит использовать шрифт самого комбобокса при отрисовке. Лучше создать временный шрифт и юзать его для всех действий. А цвета..... Ну что тут непонятного? Цвет фона - clWindow, цвет текста - clWindowText, цвет выделения - clHighlight. Где проблема?
Bez (2004-05-12 14:19:00) [4]А если так сделать, то фон выпадающего списка становится цвета clHighlight; а под надписями остается старый фон....
причем при наведении мыши на Item цвета не меняются...
а если добавить изменение цвета шрифта
ComboBox2.Font.Color:= clRed;
то при раскрытии списка (выпадении) фон становится цвета clHighlight, BackGround под буквами остается старый, шрифт становится красного цвета у всех Item'ов...
А при наведении на Item шрифт изменяется на clWindowText
Вот такая трабла получачется :(
Gandalf (2004-05-12 13:37:00) [5]А почему InvertRect? Или тогда почему удивляемся?
ComboBox2.Canvas.Brush.Color:=clHighlight;
Ну и цвет шрифта не забываем менять...
Bez (2004-05-12 13:03:00) [6]Покапался, что то не получилось нормально сделать
смог вот так (то что жирным выделено), тока это как то не прикольно смотрится, цвет выделения не такой, как в системе установлен...
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;
SPeller (2004-05-07 04:52:00) [7]Проверяй ItemState, и если итем выделен, то рисуй соответствующим образом, что непонятного?
Bez (2004-05-06 23:22:00) [8]Никак не выходит у меня счастье :(
намекните хоть еще на что-нибудь... или покажите на примере
Gandalf (2004-05-06 10:54:00) [9]function TForm1.ComboBox1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
ItemIdx: Integer; DrawAction: TDrawAction;
ItemState: TDrawState): Boolean;
begin
end;
Тут тебе ItemIdx и ItemState - что еще нужно для счастья?
SPeller (2004-05-06 05:43:00) [10]Ты что, с цветами разобраться не можешь?
Bez (2004-05-06 00:48:00) [11]Я делаю это в событии DrawItem
if Combobox2.CurIndex=ItemIdx
then ComboBox2.Brush.Color:= clMenu
else ComboBox2.Brush.Color:= clWindow;
Получается следующая весчь:
Items-ы имеют фон clMenu, a выделенный Item, над которым мышка, имеет фон clWindow. Т.е. все наоборот получается.... :(
Может я просто не правильно делаю это???
Gandalf (2004-05-05 23:27:00) [12]Так.
Bez (2004-05-05 19:11:00) [13]Сорри, а в каком событии это обрабатывать надо?
Я так понимаю, что надо вычислить область над которой находится курсор и покрасить ее в нужный цвет, так или нет?
Gandalf (2004-05-05 17:07:00) [14]А как выводишь? Рисуем? Надо и выделение рисовать.
Bez (2004-05-05 15:41:00) [15]А почему когда я в ComboBox вывожу рисунки, то не выделяется тот Item, над которым находится мыша?
SPeller (2004-01-05 09:40:00) [16]Скинь мне на мыло - гляну.
nsvi (2004-01-04 02:39:00) [17]Решил поиграть с Options ComboBox-ов и когда поставил ReadOnly в true - все заработало! Да откуда же знать, что этот параметр влияет на вывод картинки в строку выбора?
nsvi (2004-01-04 02:29:00) [18]Да, включено coOwnerDrawVariable
Gandalf (2004-01-03 20:25:00) [19]А OwnerDraw включено?