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

Вниз

Как избавиться от стандартной прорисовки в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-23041
Дельфятник
2003-04-18 10:42
2003.05.08
Можно ли в одном SQL-запросе сделать удаление из связанных таблиц


3-22988
zom
2003-04-14 12:54
2003.05.08
Поиск по индексу или Select, что быстрее через ADO?


1-23227
AlexKost
2003-04-25 14:59
2003.05.08
TMethod


3-23030
Некто2002
2003-04-18 11:42
2003.05.08
Почему sqldmo не видит ms sql сервер?


1-23181
scorpi
2003-04-23 18:04
2003.05.08
Пауза