国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入C++ Builder之編寫自己的元件(1)

深入C++ Builder之編寫自己的元件(1)

  深入C++ Builder之編寫自己的元件-深入分析VCL繼承、消息機(jī)制(1)
 
  這篇文章提及內(nèi)容可能大家已經(jīng)在很多地方看到過了,作者也是如此,只不過還看了很多VCL源代碼,加上自己實際編寫元件的經(jīng)驗,拼湊了這么一篇文章。所以所有言論都是個人觀點、經(jīng)驗的描述,僅供參考。
 
  你可轉(zhuǎn)載,拷貝,但必須加入作者署名Aweay,如果用于商業(yè)目的,必須經(jīng)過作者同意。
 
  系統(tǒng)要求
 
  如果你想一起跟著做的話,那么你應(yīng)該看看這里,否則你可以直接跳過。
 
  C++ Builder6 + updata4 (上帝造人的工具,以下簡稱BCB)
 
  Windows2k or higher (必要)
 
  作者強(qiáng)烈建議你使用WinNT,BCB在Win9x下有非常多的問題,而且非常不穩(wěn)定,就算你不在乎這個,還有一個非常致命的問題,BCB的幫助文件在Win9x下顯示不完全(因為BCB的幫助索引關(guān)鍵字?jǐn)?shù)量超過Win9x的限制),這樣非常難于參考幫助。
 
  Delphi6 :( (必要)
 
  什么?是不是寫錯了,完全沒有寫錯,如果你要深入VCL查看源代碼的話,在沒有比用Delphi6更合適的了,在全部安裝Delphi6后,把VCL Source的目錄加入Search Path中,這樣你可以在編輯器中按住Ctrl鍵,點擊鼠標(biāo)直接跳轉(zhuǎn)到源代碼處非常方便,比什么grep好用多了。
 
  起步
 
  對于VCL的消息機(jī)制,大家可以參考CKER的
 
  http://www.csdn.net/develop/read_article.asp?id=8131
 
  重復(fù)的內(nèi)容我就不介紹了,但是對于編寫元件來說上面的消息機(jī)制還是很模糊,而且很多時候并不是用那些方法來處理消息的,還有就是元件特有的CM_XXXXXXXX消息如何處理呢?如何加入自己的事件呢?這些問題我會在后面的討論中做詳細(xì)介紹。
 
  站在巨人的肩膀
 
  編寫元件的第一件事情就是確定我們從那里繼承的問題,選取一個好的祖先類是編寫一個好的元件的第一步,那么到底如何選取他山之石呢?一般性的規(guī)則是這樣的:
 
  1.對于有界面的顯示的,需要處理鍵盤事件的,又不是容器的組件從TCustomControl繼承
 
  2.對于有界面的顯示的,需要不處理鍵盤事件的,需要處理鼠標(biāo)事件的從TGraphicsControl繼承
 
  3.對于沒有界面顯示的,類似與TOpenDialog/TXpMenu這樣的控件從TComponent繼承
 
  4.如果你想擴(kuò)展某個指定的控件,比如TPanel,你最好從TCustomPanel繼承,而不要從TPanel直接繼承。
 
  注意上面第4條規(guī)則,基本上所有組件都有TCustomXXX的父類,這也是VCL鼓勵的繼承對象,原因在于你可以定制元件屬性的可見性,最重要的是他們的構(gòu)造函數(shù)和析構(gòu)函數(shù)是虛擬的。
 
  這篇文章主要針對1,2規(guī)則的元件進(jìn)行介紹,3,4相對簡單就不作深入討論了。
 
  畫出自己
 
  元件要顯示在窗體上,必須以一定的樣子出現(xiàn),那么可定要畫出自己,大家都知道處理WM_PAINT消息就可以了,從CKER的文章里,我們可以得出很多方法來處理這個消息,比如:
 
 __fastcall WndProc(TMessage msg)
{
  switch(msg->msg)
  {
   case WM_PAINT:
    //我們的處理代碼
  ...
}

  或者干脆用消息映射的宏,但這些都不是最好的方法。
 
  從TControl以后的組件都有Paint這個虛擬方法,我們只要重載這個方法就可以自動繪制,相當(dāng)于處理了WM_PAINT,這是因為:

 procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
  if Message.DC <> 0 then
  begin
   Canvas.Lock;
   try
    Canvas.Handle := Message.DC;
    try
     Paint;
    finally
     Canvas.Handle := 0;
    end;
   finally
    Canvas.Unlock;
   end;
  end;
end;

    以上代碼片斷說明了這一點,據(jù)我所研究過的專業(yè)級組件都是通過重載這個函數(shù)來繪制自己的。

  注意上面的代碼片斷就是用我上面提到的方法(裝delphi6)按了幾次鼠標(biāo)左鍵得到的,是不是很實惠。

  在Paint方里我們可以自由繪制,在后面的文章里我會交大家如何高效率繪制。

  在很多時候,我們需要重繪自己,比如我前幾天給網(wǎng)友做的劃線的組件,當(dāng)線的寬度改變時我們必須重繪自己,否則無法反映屬性的改變,我見很多朋友使用repaint()方法,這也不是最好的方法,我們應(yīng)該用Invalidate(),為什么?留給大家看源代碼吧,就算復(fù)習(xí)上面的知識了。

  代碼演示:

 void __fastcall TLine::SetLineWidth(int value)
{
  //TODO: Add your source code here
  if(FLineWidth!=value)
  {
   FLineWidth=value;
   Invalidate();
  }
}
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
delphi XE2 回到古老的 delphi7 桌面方法。。。
脫離vcl的windows程序
Canvas的paint方法
CSDN技術(shù)中心 Delphi背后---初學(xué)者參考之二(2)
Delphi組件開發(fā)教程指南(6)實現(xiàn)一個模擬動畫顯示控件
抗鋸齒方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服