Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListBox убрать рамку в выделенной строке [D7, WinXP]


Страницы:   1 2

Дмитрий_05 ©   (2005-12-01 13:44:00) 

Как в ListBox-е убрать рамку в выделенной строке? она рисуется вокруг строки как бы пунктиром... вот как от нее можно избавиться?


Джо   (2005-12-03 02:08:00) [21]


> [8] XCoder ©   (03.12.05 02:00)
> Так просто рамку не убереш, так как она рисуется после вызова
> OnDrawItem.

Вот как раз потому, если мы в OnDrawItem нарисуем focused-рамку, то следующий вызов DrawFocusRect (уже после OnDrawItem) на этом же месте даст чистую картинку, там же xor используется :)


Джо   (2005-12-03 02:06:00) [22]


> [9] Джо ©   (03.12.05 02:01)

Лучше это условие записать вот так (возможно, еще пару флагов проверить, посмотри сам):

   if (odSelected in State) and (odFocused in State) then
     DrawFocusRect (Rect);


Джо   (2005-12-03 02:01:00) [23]


> рамка рисуется на всех строках сразу

Так ты же ее и рисуешь на ВСЕХ строках. А тебе нужно рисовать только на выделенных, т.е, как-то в таком роде:
 with TListBox(Control).Canvas do
 begin
   if odSelected in State then
   begin
     Brush.Color := clActiveCaption;
     Font.Color := clHighlightText;
   end
   else
   begin
     Brush.Color := clWindow;
     Font.Color := clWindowText;
   end;
   ListBox1.Canvas. FillRect (Rect);

   TextOut(Rect.Left,Rect.Top,TListBox(Control).Items[Index]);

   // рамку затираем только на выделенной строке
   if (odSelected in State) then
     DrawFocusRect (Rect);
 end;


XCoder   (2005-12-03 02:00:00) [24]

Так просто рамку не убереш, так как она рисуется после вызова OnDrawItem. Я использовал TCustomListBox. Перекрыл ему обработчик WM_PAINT и написал свой. Установил новый компонент в палитру и использовал его. Вот и все.


Дмитрий_05   (2005-12-03 01:44:00) [25]

свойстро Style = lbOwnerDrawVariable, рамка рисуется на всех строках сразу...(((


Дмитрий_05   (2005-12-03 01:41:00) [26]

Не помогло:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
begin
DrawFocusRect(ListBox1.Canvas.Handle, Rect);
end;


Igor_thief   (2005-12-02 17:16:00) [27]

Дмитрий_05   (02.12.05 17:14) [4]
В OnDrawItem.


Дмитрий_05   (2005-12-02 17:14:00) [28]

это в самом событии ListBox-а OnDrawItem? или всеже в своем компоненте унаследованно от TListBox?


Igor_thief   (2005-12-02 12:46:00) [29]

При прорисовке элемента просто вызови DrawFoсusRect. Все!


Дмитрий_05   (2005-12-01 20:01:00) [30]

Т.е. так? И все какие переменные потребуются в procedure TMyListBox.CNDrawItemмне их нужно будет объявить в своем типе TMyListBox и тогда WM_PAINT переписывать придется...? или я неправильно понял?

type
TMyListBox = class(TListBox)
 protected
   procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
 end;

...

procedure TMyListBox.CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
begin
.........................все скопировать из ListBox CNDrawItem, кроме вызова DrawFocusRect
end;


Игорь Шевченко   (2005-12-01 14:14:00) [31]

В OnwerDraw ListBox переписать метод CNDrawItem, убрав оттуда вызов DrawFocusRect, в стандартном - не знаю :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо