?? 011.htm
字號:
<font face="宋體" lang="ZH-CN"><p> </font> <font face="宋體"
lang="ZH-CN">由運行數據決定 </font>
csOwnerDrawVarible</p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p> </font>tab-set<font face="宋體" lang="ZH-CN">與字符串網格的</font>Style<font
face="宋體" lang="ZH-CN">屬性通常是</font>Varible.</p>
<p><font face="宋體" lang="ZH-CN">在</font>Strlist<font face="宋體" lang="ZH-CN">程序中,列表框與</font>tab-set<font
face="宋體" lang="ZH-CN">取值如表</font>3.3<font face="宋體" lang="ZH-CN">: </p>
</font><p><font face="宋體" lang="ZH-CN">表</font>3.3 <font face="宋體" lang="ZH-CN">列表框與</font>tab-set<font
face="宋體" lang="ZH-CN">的取值</font></p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> 名稱 </font>style</p>
<p><font face="宋體" lang="ZH-CN">──────────────────────────</font></p>
<p>ListBox1
lbOwnerDrawVariable</p>
<p>Tabset1
tsOwnerDrawVariable
</p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
</font><p>3.2.2 <font face="宋體" lang="ZH-CN">把圖像加入字符串列表 </p>
<p> 上節已介紹如何把對象加入字符串列表,例程把位圖對象加入</font>Tabset1<font
face="宋體" lang="ZH-CN">的</font>Tabs<font face="宋體" lang="ZH-CN">中: </p>
</font><p>procedure TForm1.FormCreate(Sender: TObject);</p>
<p>var</p>
<p>Bitmap: TBitMap;</p>
<p>begin</p>
<p>Listbox1.Items := Screen.Fonts;</p>
<p>Bitmap := TBitmap.Create;</p>
<p>Bitmap.LoadFromFile('PHONE.BMP');</p>
<p>Tabset1.Tabs.AddObject('phone',Bitmap);</p>
<p>Bitmap := TBitmap.Create;</p>
<p>Bitmap.LoadFromFile('PRINTER.BMP');</p>
<p>Tabset1.Tabs.AddObject('printer ',Bitmap);</p>
<p>end; </p>
<p>3.2.3 <font face="宋體" lang="ZH-CN">繪制自畫項目 </p>
<p> 當部件的</font>Style<font face="宋體" lang="ZH-CN">屬性是自畫式時,</font>Windows<font
face="宋體" lang="ZH-CN">不再繪制部件,相反</font>Windows<font face="宋體"
lang="ZH-CN">為每個可視項目產生事件,而應用程序必須在事件中繪制項目。</p>
<p> 在應用程序繪制自畫控制之前,</font>Windows<font face="宋體"
lang="ZH-CN">產生測量項目事件,這個事件告訴程序項目顯示的位置</font>
<font face="宋體" lang="ZH-CN">。</p>
<p> 通常由</font>Windows<font face="宋體" lang="ZH-CN">決定項目顯示的大小,但應用程序可以處理這個事件并自己選擇顯示區域。例如,程序要用位圖代替文本顯示,則需要把區域設置成位圖的大小。測量項目事件的名稱隨部件的名稱不同而不同,對于列表框和組合框,該事件叫</font>OnMeasureItem<font
face="宋體" lang="ZH-CN">。對于</font>Tabset<font face="宋體" lang="ZH-CN">,該事件叫</font>OnMeasureTab<font
face="宋體" lang="ZH-CN">。</p>
<p> 測量項目事件有兩個重要參數</font>: <font face="宋體" lang="ZH-CN">項目索引號與項目的大小。這個大小是變化的。后繼項目的輸出位置由前面項目的大小決定。例如,在自畫式列表框中,如果應用程序把第一個項目的高度設置成</font>5<font
face="宋體" lang="ZH-CN">個象素點,則第二個項目在第六個象素點開始輸出。列表框和組合框中,應用程序只能設置成項目的高度,而項目的寬度就是部件的高度。在</font>Tabset<font
face="宋體" lang="ZH-CN">中,</font>tabs<font face="宋體" lang="ZH-CN">的寬度是可變的,而高度則是固定的。自畫式網格允許應用程序改變網格單元的高度和寬度。</p>
<p> </font>OnMeasureItem<font face="宋體" lang="ZH-CN">的聲明如下:</font></p>
<p>ListBox1 MeasureItem(Control: TwinControl;Index: Integer; var Height: Integer);</p>
<font face="宋體" lang="ZH-CN"><p> 例程中響應</font>OnMeasureItem<font
face="宋體" lang="ZH-CN">事件的代碼如下</font>: </p>
<p>procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;</p>
<p>var Height: Integer);</p>
<p>begin</p>
<p>with ListBox1.Canvas do</p>
<p>begin</p>
<p>Font.Name := ListBox1.Items[Index];</p>
<p>Height := TextHeight('A');</p>
<p>end;</p>
<p>end; </p>
<p>procedure TForm1.TabSetMeasureTab(Sender: TObject; Index: Integer;</p>
<p>var TabWidth: Integer);</p>
<p>var</p>
<p>BitmapWidth: Integer;</p>
<p>begin</p>
<p>BitmapWidth := TBitmap( TabSet1.Tabs.Objects[Index]).Width;</p>
<p>Inc(TabWidth, 2 + BitmapWidth);</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN"> 在</font>OnMeasureItem<font face="宋體"
lang="ZH-CN">事件發生后,</font>Windows<font face="宋體" lang="ZH-CN">激發一個叫</font>OnDrawItem<font
face="宋體" lang="ZH-CN">的事件,這個事件也隨部件名稱不同而不同,常見的有</font>OnDrawItem<font
face="宋體" lang="ZH-CN">、</font>OnDrawTab<font face="宋體" lang="ZH-CN">、</font>OnDrawCell<font
face="宋體" lang="ZH-CN">。</p>
<p> </font>OnMeasureItem<font face="宋體" lang="ZH-CN">的聲明如下:</font></p>
<font face="宋體" lang="ZH-CN"><p> </font>DrawItem( Control: TWinControl; Index:
integer; Rect: TRect; State: TOwnerDraw); </p>
<p><font face="宋體" lang="ZH-CN">其中</font>Control<font face="宋體" lang="ZH-CN">是包含項目的部件引用</p>
<p> </font>Index<font face="宋體" lang="ZH-CN"> 是項目的索引號</p>
<p> </font>Rect<font face="宋體" lang="ZH-CN"> </font> <font face="宋體"
lang="ZH-CN">是繪制的矩形</p>
<p> </font>State <font face="宋體" lang="ZH-CN">是項目的狀態,如選中,得到焦點等。 </p>
<p> 在例程的列表框中,所列項目是屏幕支持的各種字體名稱,當列表框發生</font>OnDrawItem<font
face="宋體" lang="ZH-CN">事件時,程序把輸出字體設置成該項目所代表的字體,因而列表框的項目呈現出不同的字體,其代碼如下:</font>
</p>
<p>procedure TForm1.DrawItem(Control: TWinControl; Index: Integer;</p>
<p>Rect: TRect; State: TOwnerDrawState);</p>
<p>begin</p>
<p>with ListBox1.Canvas do</p>
<p>begin</p>
<p>FillRect(Rect);</p>
<p>Font.Name := ListBox1.Items[Index];</p>
<p>TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);</p>
<p>end;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 在</font>Tabset<font face="宋體" lang="ZH-CN">部件中,則把位圖與文本同時輸出,其代碼如下: </p>
</font><p>procedure TForm1.TabSet1DrawTab(Sender: TObject; TabCanvas: TCanvas;</p>
<p>R: TRect; Index: Integer; Selected: Boolean);</p>
<p>var</p>
<p>Bitmap: TBitmap;</p>
<p>begin</p>
<p>Bitmap := TBitmap(TabSet1.Tabs.Objects[Index]);</p>
<p>with TabCanvas do</p>
<p>begin</p>
<p>Draw(R.Left, R.Top + 4, Bitmap);</p>
<p>TextOut(R.Left + 2 + Bitmap.Width,</p>
<p>R.Top + 2, TabSet1.Tabs[Index]); </p>
<p>end;</p>
<p>end;</p>
<BR>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="012.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="010.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -