Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
3-1100700940
stud
2004-11-17 17:15
2004.12.19
имя таблицы в качестве параметра


3-1101121950
Aleksandr.
2004-11-22 14:12
2004.12.19
Не удается избавиться от ошибки "Не удалось найти строку..." ADO


1-1102411491
vvv_spb
2004-12-07 12:24
2004.12.19
Resize


3-1100618289
denis24
2004-11-16 18:18
2004.12.19
паковка *.mdb


1-1101876349
Vladik
2004-12-01 07:45
2004.12.19
Наследование форм и свойства в инспекторе объектов