Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.036 c
14-1101881980
BiN
2004-12-01 09:19
2004.12.19
1 декабря - всемирный день борьбы со СПИД-ом.


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


1-1102151015
The Vizit0r!
2004-12-04 12:03
2004.12.19
Тормозит графический интерфейс, цикл как процесс


1-1102255656
Andrick
2004-12-05 17:07
2004.12.19
Создание конструктора класса


3-1100752786
Vladik
2004-11-18 07:39
2004.12.19
Настройки соединения для ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский