熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi字符串列表及應用(四)

2022-06-13   來源: Delphi編程 

   把圖像加入字符串列表 

  上節已介紹如何把對象加入字符串列表例程把位圖對象加入Tabset的Tabs中 

  procedure TFormFormCreate(Sender: TObject);
  var
  Bitmap: TBitMap;
  begin
  ListboxItems := ScreenFonts;
  Bitmap := TBitmapCreate;
  BitmapLoadFromFile(PHONEBMP);
  TabsetTabsAddObject(phoneBitmap);
  Bitmap := TBitmapCreate;
  BitmapLoadFromFile(PRINTERBMP);
  TabsetTabsAddObject(printer Bitmap);
  end;
 
   繪制自畫項目 

  當部件的Style屬性是自畫式時Windows不再繪制部件相反Windows為每個可視項目產生事件而應用程序必須在事件中繪制項目

  在應用程序繪制自畫控制之前Windows產生測量項目事件這個事件告訴程序項目顯示的位置

  通常由Windows決定項目顯示的大小但應用程序可以處理這個事件並自己選擇顯示區域例如程序要用位圖代替文本顯示則需要把區域設置成位圖的大小測量項目事件的名稱隨部件的名稱不同而不同對於列表框和組合框該事件叫OnMeasureItem對於Tabset該事件叫OnMeasureTab

  測量項目事件有兩個重要參數: 項目索引號與項目的大小這個大小是變化的後繼項目的輸出位置由前面項目的大小決定例如在自畫式列表框中如果應用程序把第一個項目的高度設置成個象素點則第二個項目在第六個象素點開始輸出列表框和組合框中應用程序只能設置成項目的高度而項目的寬度就是部件的高度在Tabset中tabs的寬度是可變的而高度則是固定的自畫式網格允許應用程序改變網格單元的高度和寬度

  OnMeasureItem的聲明如下

  ListBox MeasureItem(Control: TwinControl;Index: Integer; var Height: Integer);

  例程中響應OnMeasureItem事件的代碼如下:  

  procedure TFormListBoxMeasureItem(Control: TWinControl; Index: Integer;
  var Height: Integer);
  begin
  with ListBoxCanvas do
  begin
  FontName := ListBoxItems[Index];
  Height := TextHeight(A);
  end;
  end; 
  procedure TFormTabSetMeasureTab(Sender: TObject; Index: Integer;
  var TabWidth: Integer);
  var
  BitmapWidth: Integer;
  begin
  BitmapWidth := TBitmap( TabSetTabsObjects[Index])Width;
  Inc(TabWidth + BitmapWidth);
  end;

  在OnMeasureItem事件發生後Windows激發一個叫OnDrawItem的事件這個事件也隨部件名稱不同而不同常見的有OnDrawItemOnDrawTabOnDrawCell

  OnMeasureItem的聲明如下

  DrawItem( Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDraw); 

  其中Control是包含項目的部件引用

  Index 是項目的索引號

  Rect  是繪制的矩形

  State 是項目的狀態如選中得到焦點等 

  在例程的列表框中所列項目是屏幕支持的各種字體名稱當列表框發生OnDrawItem事件時程序把輸出字體設置成該項目所代表的字體因而 列表框的項目呈現出不同的字體其代碼如下  

  procedure TFormDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
  begin
  with ListBoxCanvas do
  begin
  FillRect(Rect);
  FontName := ListBoxItems[Index];
  TextOut(RectLeft RectTop ListBoxItems[Index]);
  end;
  end;
  在Tabset部件中則把位圖與文本同時輸出其代碼如下 
  procedure TFormTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas;
  R: TRect; Index: Integer; Selected: Boolean);
  var
  Bitmap: TBitmap;
  begin
  Bitmap := TBitmap(TabSetTabsObjects[Index]);
  with TabCanvas do
  begin
  Draw(RLeft RTop + Bitmap);
  TextOut(RLeft + + BitmapWidth
  RTop + TabSetTabs[Index]);
  end;
  end;


From:http://tw.wingwit.com/Article/program/Delphi/201311/24764.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.