Главная страница
    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.008 c
3-22930
yul
2003-04-20 23:10
2003.05.08
mdb


3-23044
Саня
2003-04-17 19:04
2003.05.08
Почему бухнут таблицы по весне?


1-23190
Denisov
2003-04-22 22:02
2003.05.08
Активность через период..


3-22907
jen_bond
2003-04-16 16:34
2003.05.08
Подстановка переменныхв отчете.


14-23321
Крот
2003-04-19 08:40
2003.05.08
COM-технологии и драки





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