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

Вниз

ListBox.Selected   Найти похожие ветки 

 
Тролль   (2003-11-27 08:35) [0]

Доброе время суток, мастера! Мне вот тут нужно сделать так, чтобы в ListBox итемы выделялись как в Вынампе, т.е. без рамки вокруг и выделенные итемы оставались всегда выделенными. Спасибо.


 
мыш ©   (2003-11-27 11:03) [1]

В событии ondrawitem (или что-то подобное) рисуй сам все как нравится на канве.


 
Тролль   (2003-11-28 06:32) [2]

2 мыш
Это понятно дело, я так и делаю. Но есть пара приколов: при выделении всех (или части) итемов он рисует рамку не на всю ширину ЛистБокса, а обрезает под последнюю букву каждого итема, ну и рамку вокруг квадрата я тоже не могу убрать. В общем, так:

procedure TMainForm.ShortNamePlsDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
with ShortNamePls do
begin
Rect:=ItemRect(Index);
Canvas.Font.Color:=clLime;
if Selected[Index] then Canvas.FillRect(Rect);
Canvas.TextOut(Rect.TopLeft.X+2, Rect.Top, Items[Index]);
end;
end;


 
Мыш ©   (2003-11-28 07:28) [3]

А ownerdraw установил?


 
Тролль   (2003-11-28 15:27) [4]

Ну да, конечно!


 
Тролль   (2003-11-29 06:21) [5]

Народ! Н уподскожите, пожалуйста, что делать, а то я совсем запутался!


 
mike.dld ©   (2003-11-29 06:44) [6]

> чтобы в ListBox итемы выделялись как в Вынампе

В Винампе нет никаких ЛистБоксов, там всё рисуется вручную, так что думай...


 
Мыш ©   (2003-11-29 07:14) [7]

Делай через стринггрид, там можно как угодно отрисовать все


 
Тролль   (2003-11-29 12:15) [8]

2 мыш
Извини, но что ето такое?


 
jack128 ©   (2003-11-29 12:18) [9]


> Извини, но что ето такое?

TStringGrid


 
Тролль   (2003-12-01 08:25) [10]

Понятно, понятно. Но он мне не подходит. Мож есть другие варианты.


 
Zergling ©   (2003-12-01 09:27) [11]

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
if not (Control is TListBox) then EXIT;
if not TListBox(Control).Selected[Index] then
begin
TListBox(Control).Canvas.Font.Color := clLime;
TListBox(Control).Canvas.Brush.Color := clBlack;
end else
begin
TListBox(Control).Canvas.Font.Color := clBlack;
TListBox(Control).Canvas.Brush.Color := clLime;
end;
TListBox(Control).Canvas.TextRect(Rect, Rect.Left, Rect.Top, TListBox(Control).Items.Strings[Index]);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
if (Sender is TListBox) then (Sender as TListBox).Repaint;
end;


 
Тролль   (2003-12-02 07:03) [12]

Посмотрел я твой вариант, но нашёл косячки (которые как раз то и надо убрать): эта рамка вокруг выделения так и осталась, а при выделении более одного итема сначала появляется рамка, а потом только закрашывается. Я переделал свой вариант вместо
if Selected[Index] then Canvas.FillRect(Rect);
поставил просто
Canvas.FillRect(Rect);
но проблема с рамкой осталась :(((


 
NAlexey ©   (2003-12-02 08:17) [13]

Попробуй так:
на

CustomDrawItem(
Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
var
ItemRect, TextRect: TRect;
Flags: Longint;
Data: string;
OldColor, NewColor: TColorRef;
I: Integer;
begin
DefaultDraw := False;
ItemRect := Item.DisplayRect(drBounds);
NewColor := GetTextColor(Sender.Canvas.Handle);
if (Item = Sender.ItemFocused) and (Item <> Sender.Selected) then
begin
Windows.FillRect(Sender.Canvas.Handle, ItemRect, GetSysColorBrush(COLOR_BTNFACE));
Windows.FrameRect(Sender.Canvas.Handle, ItemRect , GetSysColorBrush(COLOR_WINDOWFRAME));
end else if Item = Sender.Selected then
begin
NewColor := clWhite;
Windows.FillRect(Sender.Canvas.Handle, ItemRect, GetSysColorBrush(COLOR_HIGHLIGHT));
end else
Windows.FillRect(Sender.Canvas.Handle, ItemRect, GetSysColorBrush(COLOR_WINDOW));

if Item.Index < TListView(Sender).Items.Count then
begin
Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or
DT_NOPREFIX or DT_WORD_ELLIPSIS);
TextRect := Item.DisplayRect(drLabel);
Data := "";
Data := Item.Caption;

OldColor := GetTextColor(Sender.Canvas.Handle);
if NewColor <> OldColor then
SetTextColor(Sender.Canvas.Handle, NewColor);
SetBkMode(Sender.Canvas.Handle, TRANSPARENT);

DrawText(Sender.Canvas.Handle, PChar(Data), Length(Data), TextRect, Flags);
if Item.Subitems.Count > 0 then
begin
Data := "";
for I := 0 to Item.Subitems.Count - 1 do
begin
ListView_GetSubItemRect(Sender.Handle, Item.Index, I + 1, LVIR_LABEL, @TextRect);
Data := Item.Subitems[I];
DrawText(Sender.Canvas.Handle, PChar(Data), Length(Data), TextRect, Flags);
Data := "";
end;
end;

if NewColor <> OldColor then
SetTextColor(Sender.Canvas.Handle, OldColor);
end;
end;


 
TrollXP ©   (2003-12-03 16:11) [14]

Что-то никак! Ругается вот на эту строчку:
ListView_ GetSubItemRect(Sender.Handle, Item.Index, I + 1, LVIR_LABEL, @TextRect);
То, что подчёркнуто, он не знает.


 
Семен Сорокин ©   (2003-12-03 16:30) [15]

uses
CommCtrl;


 
хамло   (2003-12-03 17:38) [16]

ListBox<>ListView


 
Тролль   (2003-12-04 04:56) [17]

2 хамло
Не понял.


 
NAlexey ©   (2003-12-04 08:15) [18]

>Тролль
хамло прав, виноват...


 
Тролль   (2003-12-07 07:00) [19]

2 NAlexey
Ничего, но мож у тебя для ListBoxа что-нибудь найдётся??



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
1-62051
PVOzerski
2003-12-05 18:29
2003.12.19
Проблема с TreeView, или почему приходится


3-61929
alst
2003-11-27 08:42
2003.12.19
Удаление записи из БД Interbse.


3-61963
Andy
2003-11-26 12:58
2003.12.19
Каким способом закинуть CSV файл в таблицу (TTable)


3-61976
AlexGreG
2003-11-26 11:59
2003.12.19
... ODAC + FastReport = Love ? ...


4-62313
demonyator
2003-10-26 01:49
2003.12.19
Код украинского языка.