![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Доброго времени суток!
Как видно по заголовку, на форме присутствует ListBox. Задача такая: отрисовать самому пункты списка, но сделать так, чтобы выбранный пункт списка был отличного размера от невыделенных (больше) + добавить на него несколько кнопок. Можно ли такое реализовать? Использую следующий код, но он не работает: Код:
procedure MyListBoxMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin if Index = TListBox(Control).ItemIndex then Height := 50 else Height := 20; end; Заранее спасибо! Работа пpогpаммиста и шамана имеет очень много общего: оба боpмочyт непонятные слова, совеpшают непонятные действия и не могyт объяснить, как оно pаботает. |
#2
|
||||
|
||||
![]() А MyListBoxDrawItem при этом используется?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Цитата:
который используется для определения выделен элемент или нет, и, в зависимости от этого, отрисовывается требуемое содержимое. Работа пpогpаммиста и шамана имеет очень много общего: оба боpмочyт непонятные слова, совеpшают непонятные действия и не могyт объяснить, как оно pаботает. |
#4
|
||||
|
||||
![]() Ну так и выкладывай весь код ответственный за отрисовку.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
![]() Информационная структура элемента, откуда берется информация при
отрисовке элемента. Код:
TEventsListItem = packed record ItemID: Integer; Title, Text: String; EventsTime: Double; ImageIndex: Integer; BrushColor: Integer; PenColor: Integer; procedure Assign(ASource: TEventsListItem); end; Код отрисовки (EventsList - мой класс, является хранилищем record'ов). В списке EventsListBox содержатся значения TEventsListItem.ItemID Код:
procedure TEventsListFrame.EventsListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const IMAGE_TOP_MARGIN = 2; IMAGE_LEFT_MARGIN = 3; TITLE_LEFT_MARGIN = 4; TITLE_TOP_MARGIN = IMAGE_TOP_MARGIN + 1; DTIME_RIGHT_MARGIN = 4; DTIME_TOP_MARGIN = TITLE_TOP_MARGIN; TEXT_LEFT_MARGIN = IMAGE_LEFT_MARGIN; TEXT_RIGHT_MARGIN = DTIME_RIGHT_MARGIN; TEXT_TOP_MARGIN = 4; TEXT_BOTTOM_MARGIN = 2; var FCanvas: TCanvas; FList: TStrings; S: String; TempColor: Integer; TempStyle: TFontStyles; TitleHeight: Integer; TextRect: TRect; EventData: TEventsListItem; begin FCanvas := TListBox(Control).Canvas; FList := TListBox(Control).Items; FCanvas.FillRect(Rect); if Index < TListBox(Control).Items.Count then begin if not EventsList.SearchFor(StrToIntDef(FList[Index], 0), EventData) then Exit; // Поиск инфо-структуры по ItemID { Отрисовка изображения } FCanvas.Draw(Rect.Left + IMAGE_LEFT_MARGIN, Rect.Top + IMAGE_TOP_MARGIN, EventsListImages.PngImages[EventData.ImageIndex].PngImage); { Отрисовка заголовка события } TempColor := FCanvas.Font.Color; TempStyle := FCanvas.Font.Style; try if odSelected in State then begin FCanvas.Font.Color := clYellow; FCanvas.Font.Style := [fsBold]; end; TitleHeight := FCanvas.TextHeight(EventData.Title); FCanvas.TextOut(Rect.Left + IMAGE_LEFT_MARGIN + 16 + TITLE_LEFT_MARGIN, Rect.Top + TITLE_TOP_MARGIN, EventData.Title); finally FCanvas.Font.Color := TempColor; FCanvas.Font.Style := TempStyle; end; { Отрисовка времени события } TempColor := FCanvas.Font.Color; try FCanvas.Font.Color := clSilver; S := TimeToStr(EventData.EventsTime); FCanvas.TextOut(Rect.Right - DTIME_RIGHT_MARGIN - FCanvas.TextWidth(S), Rect.Top + DTIME_TOP_MARGIN, S); finally FCanvas.Font.Color := TempColor; end; if odSelected in State then begin { Отрисовка текста события } TempColor := FCanvas.Font.Color; try FCanvas.Font.Color := clWhite; S := EventData.Text; TextRect.Left := Rect.Left + TEXT_LEFT_MARGIN; TextRect.Top := Rect.Top + TITLE_TOP_MARGIN + TitleHeight + TEXT_TOP_MARGIN; TextRect.Right := Rect.Right - TEXT_RIGHT_MARGIN; TextRect.Bottom := Rect.Bottom - TEXT_BOTTOM_MARGIN; DrawText(FCanvas.Handle, PChar(S), Length(S), TextRect, DT_WORDBREAK); finally FCanvas.Font.Color := TempColor; end; end; end; end; Размеры элемента списка. Код:
procedure TEventsListFrame.EventsListBoxMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin if Index = TListBox(Control).ItemIndex then Height := 48 else Height := TListBox(COntrol).ItemHeight; end; Работа пpогpаммиста и шамана имеет очень много общего: оба боpмочyт непонятные слова, совеpшают непонятные действия и не могyт объяснить, как оно pаботает. |
#6
|
||||
|
||||
![]() ............
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |