亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入VCL理解BCB的消息機制2

2019-11-17 05:32:44
字體:
來源:轉載
供稿:網友

  重載TControl的WndPRoc方法

還是先談談VCL的繼續策略。VCL中的繼續鏈的頂部是TObject基類。一切的VCL組件和對象都繼續自TObject。

打開BCB幫助查看TControl的繼續關系:

TObject->TPersistent->TComponent->TControl

呵呵,原來TControl是從TPersistent類的子類TComponent類繼續而來的。TPersistent抽象基類具有使用流stream來存取類的屬性的能力。

TComponent類則是所有VCL組件的父類。

這就是所有的VCL組件包括您的自定義組件可以使用dfm文件存取屬性的原因『當然要是TPersistent的子類,我想您很少需要直接從TObject類來派生您的自定義組件吧』。

TControl類的重要性并不亞于它的父類們。在BCB的繼續關系中,TControl類的是所有VCL可視化組件的父類。實際上就是控件的意思吧。所謂可視化是指您可以在運行期間看到和操縱的控件。這類控件所具有的一些基本屬性和方法都在TControl類中進行定義。

TControl的實現在/Borland/CBuilder5/Source/Vcl/control.pas中可以找到?!嚎赡軙信笥褑柲阍趺粗涝谀抢??使用BCB提供的Search -> Find in files很輕易找到?;蛘呤褂玫谌讲寮膅rep功能?!?

好了,進入VCL的源碼吧。說到這里免不了要抱怨一下Borland。哎,為什么要用pascal實現這一切.....:-(

TControl繼續但并沒有重寫TObject的Dispatch()方法。反而提供了一個新的方法就是xycleo提到的WndProc()。一起來看看Borland的工程師們是怎么寫的吧。

procedure TControl.WndProc(var Message: TMessage);
var
  Form: TCustomForm;
begin
//由擁有control的窗體來處理設計期間的消息
  if (csDesigning in ComponentState) then
  begin
    Form := GetParentForm(Self);
    if (Form <> nil) and (Form.Designer <> nil) and
      Form.Designer.IsDesignMsg(Self, Message) then Exit;
  end
//假如需要,鍵盤消息交由擁有control的窗體來處理
  else if (Message.Msg >= WM_KEYFIRST) and (Message.Msg <= WM_KEYLAST) then
  begin
    Form := GetParentForm(Self);
    if (Form <> nil) and Form.WantChildKey(Self, Message) then Exit;
  end
//處理鼠標消息
  else if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
  begin
    if not (csDoubleClicks in ControlStyle) then
      case Message.Msg of
        WM_LBUTTONDBLCLK, WM_RBUTTONDBLCLK, WM_MBUTTONDBLCLK:
          Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);
      end;
    case Message.Msg of
      WM_MOUSEMOVE: application.HintMouseMessage(Self, Message);
      WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
        begin
          if FDragMode = dmAutomatic then
          begin
            BeginAutoDrag;

            Exit;
          end;
          Include(FControlState, csLButtonDown);
        end;
      WM_LBUTTONUP:
        Exclude(FControlState, csLButtonDown);
    end;
  end
// 下面一行有點非凡。假如您仔細的話會看到這個消息是CM_VISIBLECHANGED.
// 而不是我們熟悉的WM_開頭的標準Windows消息.
// 盡管Borland沒有在它的幫助中提到有這一類的CM消息存在。但很顯然這是BCB的
// 自定義消息。呵呵,假如您對此有愛好可以在VCL源碼中查找相關的內容。一定會有不小的收獲。
  else if Message.Msg = CM_VISIBLECHANGED then
    with Message do
      SendDockNotification(Msg, WParam, LParam);
// 最后調用dispatch方法。
  Dispatch(Message);
end;
看完這段代碼,你會發現TControl類實際上只處理了鼠標消息,沒有處理的消息最后都轉入Dispatch()來處理。

但這里需要強調指出的是TControl自己并沒有獲得焦點Focus的能力。TControl的子類TWinControl才具有這樣的能力。我憑什么這樣講?呵呵,還是打開BCB的幫助。很多朋友抱怨BCB的幫助實在不如VC的MSDN。毋庸諱言,的確差遠了。而且這個幫助還經常有問題。但有總比沒有好啊。

言歸正傳,在幫助的The TWinControl Branch 分支下,您可以看到關于TWinControl類的簡介。指出TWinControl類是所有窗體類控件的基類。所謂窗體類控件指的是這樣一類控件:

1. 可以在程序運行時取得焦點的控件。

2. 其他的控件可以顯示數據,但只有窗體類控件才能和用戶發生鍵盤交互。

3. 窗體類控件能夠包含其他控件(容器)。

4. 包含其他控件的控件又稱做父控件。只有窗體類控件才能夠作為其他控件的父控件。

5. 窗體類控件擁有句柄。

除了能夠接受焦點之外,TWinControl的一切都跟TControl沒什么分別。這一點意味著TwinControl可以對許多的標準事件作出響應,Windows也必須為它分配一個句柄。并且與這個主題相關的最重要的是,這里提到是由BCB負責來對控件進行重畫以及消息處理。這就是說,TwinControl封裝了這一切。

似乎扯的太遠了。但我要提出來的問題是TControl類的WndProc方法中處理了鼠標消息。但這個消息只有它的子類TwinControl才能夠得到啊!?

這怎么可以呢... Borland是如何實現這一切的呢?這個問題實在很奧妙。為了看個究竟,再次深入VCL吧。

還是在control.pas中,TWinControl繼續了TControl的WndProc方法。源碼如下:

procedure TWinControl.WndProc(var Message: TMessage);
var
  Form: TCustomForm;
  KeyState: TKeyboardState;
  WheelMsg: TCMMouseWheel;
begin
  case Message.Msg of
    WM_SETFOCUS:
      begin
        Form := GetParentForm(Self);
        if (Form <> nil) and not Form.SetFocusedControl(Self) then Exit;
      end;
    WM_KILLFOCUS:
      if csFocusing in ControlState then Exit;
    WM_NCH99vTEST:
      begin
        inherited WndProc(Message);
        if (Message.Result = HTTRANSPARENT) and (ControlAtPos(ScreenToClient(

          SmallPointToPoint(TWMNCHitTest(Message).Pos)), False) <> nil) then
          Message.Result := HTCLIENT;
        Exit;
      end;
    WM_MOUSEFIRST..WM_MOUSELAST:
      //下面這一句話指出,鼠標消息實際上轉入IsControlMouseMsg方法來處理了。
      if IsControlMouseMsg(TWMMouse(Message)) then
      begin
        if Message.Result = 0 then
          DefWindowProc(Handle, Message.Msg, Message.wParam, Message.lParam);
        Exit;
      en

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕在线| 国产精品老女人视频| 日韩av资源在线播放| 久久福利视频网| 欧美一二三视频| 久久天堂电影网| 不用播放器成人网| 欧美激情一区二区三区在线视频观看| 久久国产加勒比精品无码| 97国产suv精品一区二区62| 国产日韩欧美影视| 不用播放器成人网| 91成人天堂久久成人| 欧美福利视频在线| 久久99久久亚洲国产| 亚洲在线第一页| 久久久久国产精品www| 午夜精品久久久久久久99热| 最新日韩中文字幕| 国产91精品久久久久久久| 亚洲欧美在线磁力| 亚洲欧洲国产精品| 中文字幕少妇一区二区三区| 国产999视频| 欧美激情视频三区| 欧美一级免费看| 国产精品久久久久久久久免费| 久久6免费高清热精品| www.xxxx精品| 欧美三级欧美成人高清www| 久久久久九九九九| 国产日韩精品入口| 国产成人一区二区在线| 自拍偷拍免费精品| 日韩久久午夜影院| 亚洲午夜精品久久久久久久久久久久| 国内久久久精品| 欧美电影在线观看网站| 亚洲精品久久久久久久久| 国产91对白在线播放| 亚洲人成在线观看| 欧美日韩国产丝袜另类| 欧美成年人视频网站欧美| 欧美日韩精品在线视频| 久久69精品久久久久久久电影好| 日韩av电影免费观看高清| 欧美成aaa人片在线观看蜜臀| 美日韩精品免费观看视频| 国产成人aa精品一区在线播放| 国产女精品视频网站免费| 最新69国产成人精品视频免费| 久久777国产线看观看精品| 最新国产成人av网站网址麻豆| 国产综合久久久久久| 久久久免费精品视频| 一本色道久久88综合日韩精品| 亚洲激情视频网| 成人有码在线播放| 北条麻妃久久精品| 国产欧美日韩综合精品| 国产精品久久久av久久久| 亚洲欧美激情精品一区二区| 欧美日韩国产影院| 精品中文字幕在线2019| 久久国产精品久久久久久| 日韩欧美亚洲成人| 日韩三级成人av网| 日韩欧亚中文在线| 亚洲图中文字幕| 国产精品美女呻吟| 精品国产乱码久久久久酒店| 国产一区二区三区三区在线观看| 日韩专区在线观看| 精品丝袜一区二区三区| 国产91对白在线播放| 亚洲影院色无极综合| 国产精品久久中文| 国产xxx69麻豆国语对白| 日韩精品极品在线观看播放免费视频| 亚洲国产精品yw在线观看| 久久天天躁狠狠躁夜夜躁2014| 欧美另类xxx| 日韩色av导航| 欧美美最猛性xxxxxx| 中文字幕亚洲天堂| 国产午夜精品一区二区三区| 亚洲欧美中文日韩在线v日本| 国产成人精品久久亚洲高清不卡| 国产精品大片wwwwww| 97国产精品视频| 国产亚洲欧洲高清一区| 久久国产精品电影| 国产色视频一区| 91国语精品自产拍在线观看性色| 国产成人免费av电影| 欧美成人精品在线观看| 精品国产电影一区| 国产成人综合亚洲| 欧美日韩国产成人在线观看| 国产男女猛烈无遮挡91| 亚洲跨种族黑人xxx| 成人免费视频97| 国产精品高清网站| 夜夜嗨av色一区二区不卡| 欧美一区二三区| 久久久久国产一区二区三区| 91天堂在线视频| 国产精品视频地址| 中文字幕视频一区二区在线有码| 精品无人区太爽高潮在线播放| 亚洲影院色在线观看免费| 成人国产在线视频| 亚洲欧美精品在线| 久久久久久免费精品| 福利精品视频在线| 欧美成人精品在线| 亚洲精品影视在线观看| 久热爱精品视频线路一| 性色av一区二区三区| 久久久久久久久久久久久久久久久久av| 亚洲欧洲国产精品| 日韩av免费观影| 午夜精品久久久久久99热| 午夜欧美不卡精品aaaaa| 久久中文字幕在线| 欧美精品18videosex性欧美| 亚洲jizzjizz日本少妇| 欧美华人在线视频| 欧美专区日韩视频| 精品福利在线观看| 国产成人综合一区二区三区| 日韩激情视频在线| 亚洲国产精品va在线| 日韩精品在线看| 这里只有精品丝袜| 国产精品第一页在线| 欧美黄色三级网站| 欧美成人精品在线播放| 久久九九免费视频| 亚洲美女福利视频网站| 日本高清不卡在线| 日韩福利视频在线观看| 日韩中文字幕在线免费观看| 精品一区电影国产| 亚洲一区免费网站| 中文字幕精品久久久久| 久久精品小视频| 日韩视频―中文字幕| 插插插亚洲综合网| 国产亚洲综合久久| 色偷偷av一区二区三区乱| 午夜精品久久久久久久久久久久久| 国产精品久久久久久久久久东京| 精品久久久久久久久久国产| 97免费中文视频在线观看| 日产日韩在线亚洲欧美| 国产男女猛烈无遮挡91| 久久精品国产久精国产一老狼| 国产在线98福利播放视频| 欧美巨猛xxxx猛交黑人97人| 少妇高潮久久77777| 国产成人高潮免费观看精品| 国产精品欧美日韩一区二区| 国产欧美精品va在线观看|