Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

Как избавиться от стандартной прорисовки в ListBox-e???   Найти похожие ветки 

 
dimonf   (2003-04-24 08:43) [0]

Я написал свою прорисовку ListBox-а, при этом использовал функцию DrawItem. Свойство Style выставил в lbOwnerDrawFixed.
Все бы хорошо работало, но возникла проблема! Когда мой ListBox не имеет фокус на форму накладываеться другая форма у меня прорисовываеться стандартный курсор "синего цвета" в том месте где в последний момент был курсор. В чем проблема??? Как этого можно избежать???


 
Игорь Шевченко   (2003-04-24 09:26) [1]

Текст DrawItem в студию


 
dimonf   (2003-04-24 09:32) [2]

Вот:

procedure Tmain.msListBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var Obj: PDBObject;
FIcon: TIcon;
OutRect: TRect;
begin
FIcon:=TIcon.Create;
with (Control as TListBox).Canvas do begin
FillRect(Rect);
if (odSelected in State) and (odFocused in State) then begin
Brush.Color := $00C66931;
Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
Font.Color := clWhite;
end;
Obj:= PDBObject(msListBox.Items.Objects[Index]);
Rect.Right:=msColumns.Sections.Items[0].Right;
OutRect:=Rect;
msIcon.GetIcon(Obj^.Icon, FIcon);
Draw(Rect.Left+1,Rect.Top,FIcon);
OutRect.Left:=OutRect.Left+18;
DrawText(Handle, PChar(Obj^.DisplayName), length(Obj^.DisplayName), OutRect, dt_Left or dt_Singleline or dt_VCenter);
Rect.Left:=msColumns.Sections.Items[1].Left;
Rect.Right:=msColumns.Sections.Items[1].Right;
OutRect:=Rect;
DrawText(Handle, PChar(AnsiLowerCase(Obj^.Description)), length(Obj^.Description), OutRect, dt_Left or dt_Singleline or dt_VCenter);
Rect.Left:=msColumns.Sections.Items[2].Left;
Rect.Right:=msColumns.Sections.Items[2].Right-5;
OutRect:=Rect;
IF TextWidth(Obj^.FreeSize)>(OutRect.Right-OutRect.Left) then
OutRect.Left:=OutRect.Right-TextWidth(Obj^.FreeSize);
DrawText(Handle, PChar(Obj^.FreeSize), length(Obj^.FreeSize), OutRect, dt_Left or dt_Singleline or dt_VCenter);
Rect.Left:=msColumns.Sections.Items[3].Left;
Rect.Right:=msColumns.Sections.Items[3].Right;
OutRect:=Rect;
DrawText(Handle, PChar(Obj^.DateTime), length(Obj^.DateTime), OutRect, dt_Left or dt_Singleline or dt_VCenter);
end;
FIcon.Free;
end;


 
Zz_   (2003-04-24 09:35) [3]

>>if (odSelected in State) and (odFocused in State)

if (odSelected in State) or (odFocused in State)


 
dimonf   (2003-04-24 09:52) [4]

Zz_ не не помогло всеравно ресуеться 8(


 
REA   (2003-04-24 10:06) [5]

with (Control as TListBox).Canvas do begin
FillRect(Rect);
- а может оно и есть синее? цвет ведь нигде не устанавливается


 
dimonf   (2003-04-24 10:16) [6]

Почему устанавливаю:
if (odSelected in State) and (odFocused in State) then begin
Brush.Color := $00C66931; - цвет фона
Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom); - рисую прямоугольник
Font.Color := clWhite; - цвет букв на синем прямоугольнике
end;


 
dimonf   (2003-04-24 10:18) [7]

Вся фишка в том что данный код ресуеться и тогда когда у меня на форму накладываеться другая форма. А мая теряет фокус. Дык как же мне сделать чтобы при прорисовке, если нет фокуса у listbox-а не рисовать этот прямоугольник???


 
REA   (2003-04-24 10:19) [8]

См. выше. На момент FillRect цвет не установлен.


 
Игорь Шевченко   (2003-04-24 11:05) [9]

REA © (24.04.03 10:19)


> На момент FillRect цвет не установлен.


Здрасте!

Установлен.

stdctrls.pas

FCanvas.Handle := hDC;
FCanvas.Font := Font;
FCanvas.Brush := Brush;
if (Integer(itemID) >= 0) and (odSelected in State) then
begin
FCanvas.Brush.Color := clHighlight;
FCanvas.Font.Color := clHighlightText
end;


 
REA   (2003-04-24 11:18) [10]

Так я про то же самое. Не установлен в самой программе, но установлен в компоненте. Эффект очень похож.


 
Игорь Шевченко   (2003-04-24 11:33) [11]

REA © (24.04.03 11:18)

А, пардон, какая разница ?


 
REA   (2003-04-24 13:30) [12]

Вопрос то в чем:
>Когда мой ListBox не имеет фокус на форму накладываеться другая форма у меня прорисовываеться стандартный курсор "синего цвета" в том месте где в последний момент был курсор.

Т.е. не вызывается кусок который хочет автор Brush.Color := $00C66931; (по каким-то причинам), а вызывается только FillRect стандартым цветом, что и соответствует "стандартному курсору".

Почему не вызывается уже второй вопрос.


 
Игорь Шевченко   (2003-04-24 17:13) [13]

REA © (24.04.03 13:30)

Почему не вызывается - понятно, потому что не focused, согласно условию "накладываеться другая форма"



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
7-23405
АндрейБ
2003-03-14 16:42
2003.05.08
Установить размер страницы для печати


1-23065
Intell
2003-04-25 10:07
2003.05.08
Компонент или прога для вытягивания *.swf из EXE.


4-23420
Sergeys
2003-03-09 23:40
2003.05.08
Как можно передать сообщение своей проге....


14-23365
kaif
2003-04-20 16:24
2003.05.08
Delphi Update качается медленно...


3-22954
Angel[Saint]
2003-04-17 08:15
2003.05.08
Как написать своего провайдера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский