Показать сообщение отдельно
  #5  
Старый 20.03.2012, 16:28
Аватар для Amgsys HQ
Amgsys HQ Amgsys HQ вне форума
Начинающий
 
Регистрация: 11.11.2011
Адрес: Загрузочный сектор
Сообщения: 115
Версия Delphi: 7, XE
Репутация: 538
По умолчанию

Информационная структура элемента, откуда берется информация при
отрисовке элемента.

Код:
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аботает.
Ответить с цитированием