亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        VCL Framework窗口消息機制研究

        2014-07-01 23:28:24
        長春師范大學學報 2014年12期
        關鍵詞:分派調用隊列

        肖 巍

        (長春師范大學傳媒學院,吉林長春 130032)

        VCL Framework窗口消息機制研究

        肖 巍

        (長春師范大學傳媒學院,吉林長春 130032)

        本文介紹了傳統Windows消息機制及處理過程,重點闡述了對VCL Framework消息機制的研究,對VCL Framework窗口消息封裝機制、窗口消息分派機制的實現方法和實現技術進行了詳細的論述。

        VCL Framework;消息機制;消息封裝;消息分派

        VCL(Visual Component Library) Framework是一種高效的應用程序開發(fā)框架,提供了對大多數Windows消息的處理機制。程序開發(fā)人員如果想要編寫自己的組件或更加靈活地運用現有的組件,使程序的功能更加強大靈活,就必須對VCL Framework的窗口消息機制有深入的理解。封裝窗口消息,并且結合VCL的組件模型提供更有效的Windows程序設計風格,正是VCL Framework設計的主要使命之一。

        1 傳統的Windows消息機制

        Windows的消息系統由消息隊列、消息循環(huán)和窗口過程三個部分組成。Windows定義了兩種不同的消息隊列,分別是系統消息對列和應用程序消息隊列。系統消息隊列用來儲存Windows中系統和硬件觸發(fā)的事件,應用程序消息隊列則用來儲存窗口觸發(fā)的一般事件。程序員一般不需要直接處理Windows消息隊列。Windows系統本身會幫助應用程序來管理消息隊列,消息隊列是以線程(Thread)來分組的,一般情況下每個線程都有自己的消息隊列。

        消息循環(huán)往往是Windows應用程序的核心,因為消息循環(huán)使一個應用程序能夠響應外部的事件,消息循環(huán)的任務就是從應用程序消息隊列中檢索消息,把消息傳遞給適當的窗口,然后從消息隊列中檢索下一條消息,再分派給適當的窗口,依次進行。一般形式如下:

        while GetMessage(msg, 0, 0, 0) do

        {

        TranslateMessage(msg);

        DispatchMessage(msg);

        }

        每個窗口都有一個窗口過程來接收傳遞來的消息,它的任務就是獲取消息然后響應它。窗體過程實際上是一個回調函數。所謂回調函數,就是由Windows操作系統或外部程序調用的函數。回調函數一般都有規(guī)定的參數格式,以地址方式傳遞給調用者。窗口過程中是Windows操作系統調用了,在一個窗口創(chuàng)建的時候,在分配窗體句柄的時候就需要傳入回調函數地址。其形式如下:

        Function WindowProc(Window:HWnd ; AMsg:UINT; WParam:WPARAM; LParam : LPARAM): LRESULT; stdcall;export;

        傳統的窗口回調程序設計有諸多缺點:所有的窗口過程結構都非常相似,程序員不斷重復撰寫類似代碼;不能復用,生產效率低下;使用Case逐一判斷窗口消息類別的程序代碼編譯出來后執(zhí)行效率低下;需要程序員非常了解窗口消息,增加了開發(fā)難度,降低了生產力等。

        2 VCL Framework窗口消息機制

        VCL Framework不但實現了窗口消息封裝和窗口消息分派,也使用了VCL類來封裝窗口控件,讓每一個VCL封裝類都能夠在其中實現處理窗口消息的工作,而不需要像傳統Windows程序設計一樣在一個冗長繁雜的窗口回調函數中撰寫所有的程序代碼。

        2.1 VCL Framework的窗口消息封裝機制

        VCL Framework的消息封裝和處理流程與窗口消息種類、VCL消息種類、方法調用慣例以及方法種類有著密切的關系。 VCL Framework中處理的消息種類大體可分為窗口消息和VCL內部消息,如表1所示。

        表1 VCL Framework中處理消息種類

        調用慣例(Calling Convention)影響執(zhí)行效率、參數的傳遞方式以及棧清除方式,表2列出了最常使用的調用慣例對于參數和棧的處理方式。

        表2 調用慣例對于參數和棧的處理方式

        窗口回調函數使用pascal調用慣例,而VCL組件的事件處理函數卻使用register調用慣例。因此,當VCL Framework從窗口回調函數在分派消息到VCL組件的消息處理函數時,必須把調用慣例從pascal轉換為register調用慣例,才能夠讓程序正確執(zhí)行下去。VCL Framework在消息分派時,選擇實現的消息處理函數大都偏向使用動態(tài)方法,因為可以大幅節(jié)省VCL組件使用的空間。在VCL組件實現類中,可以定義類似下面處理特定窗口消息的處理函數,其中以WM開頭的方法是直接處理特定窗口消息的函數:

        Procedure WMLButtonUp(var Message:TWMLButtonUp);message WM_LBUTTONUP

        而以CM開頭的方法則是處理VCL Framework定義的特定消息處理函數:

        Procedure CMParentFontChanged(var M:TMessage);message CM_PARENTFONTCHANGED

        2.2 VCL Framework的窗口消息分派機制

        VCL Framework使用虛擬方法來解決分派窗口消息的機制,只要調用一個標準的虛擬方法,然后不同的VCL封裝類覆寫此虛擬方法,就可以被VCL的分配消息機制調用并傳遞窗口消息作為此虛擬方法的參數。

        TWinControl是所有VCL Framework中封裝窗口控制的根類,在TWinControl類中定義了虛擬方法WndProc,WndProc接受代表窗口消息的TMessage數據結構作為參數:

        TWinControl=class(TObject)

        Procedure WndProc(var Message:TMessage);virtual;

        End;

        在TWinControl類的派生類中,封裝了窗口按鈕控件的TButton類可以重載WndProc虛擬方法并且在其中處理發(fā)生在按鈕控件中的觸發(fā)事件:

        TButton=class(TWinControl)

        Procedure WndProc(var Message:TMessage);override;

        End;

        當VCL Framework找到了相應的目標VCL組件后,就可以正確地分派窗口消息給封裝窗口控件的VCL組件了:

        Var

        aControl:TWinControl;

        Begin

        GetWindowMessage(Message);

        aControl:=GetTargetControl(Message);

        aControl.WndProc(Message);

        End;

        GetWindowMessage可根據Windows系統觸發(fā)的事件轉換為TMessage對象,最后以GetTargetControl取得的TWinControl組件以多態(tài)的機制調用到VCL組件覆寫的窗口消息處理函數。

        在傳統的Windows程序設計中,Windows調用一般的回調函數,指C語言的函數類型。在面向對象程序語言中,當調用對象的方法時,除了目標方法接受的參數之外,調用者還需要傳遞一個額外的隱藏參數,即Object Pascal語言的Self。在傳統的Windows回調函數中先找到目的VCL對象,主動把Self壓入棧中,再壓入對象方法的參數,最后調用對象方法,即可實現調用回調函數改變成調用對象方法。為了提高執(zhí)行效率,VCL Framework使用Register調用慣例,實際上是把Self壓入EAX寄存器中。VCL Framework的回調函數InitWndProc在執(zhí)行完上述的轉換動作后,會調用StdWndProc函數,再由StdWndProc分配消息給對象方法。StdWndProc是VCL Framework中分派消息的樞紐,執(zhí)行次數非常頻繁,需要很高的執(zhí)行速度,它是完全使用匯編語言編寫的,位于InitWndProc和VCL組件之間的提供窗口消息分派和轉換的通道。

        當VCL Framework把窗口消息分派到VCL組件的消息處理函數WndProc之后,真正讓窗口消息和VCL組件的事件處理函數串聯起來的樞紐是TObject的消息分派服務虛擬方法Dispatch。該虛擬方法使用兩種方式來分派消息,第一種是分派能夠被VCL組件事件處理函數處理的消息,對于這種消息Dispatch會在目標VCL組件的動態(tài)數據表中搜尋擁有相同消息ID的動態(tài)方法,找到后就直接調用相應的VCL事件處理函數來處理觸發(fā)的消息。第二種是如果Dispatch對于觸發(fā)的消息不需要分派,那么Dispatch就會調用同屬TObject消息分派服務中的DefaultHandler虛擬方法來處理,程序員可以直接使用此方法,也可以覆寫此虛擬方法,由程序員自己實現處理Dispatch不分派的消息,使VCL組件具有更好的靈活性和可擴展性。

        3 結語

        本文介紹了傳統Windows消息機制及處理過程,重點闡述了對VCL Framework消息機制的研究,通過對VCL Framework窗口消息封裝機制和分派機制實現方法和實現技術的梳理,以及與傳統方式的對比,對VCL Framework在窗口消息處理機制上的先進性和高效性有了更深的了解,對日后應用VCL Framework開發(fā)出更加強大、靈活的應用程序具有一定的指導意義。

        [1]李維.深入核心——Inside VCL架構剖析[M].北京:電子工業(yè)出版社,2003.

        [2]劉文韜,徐學洲.Delphi環(huán)境下Windows消息機制的應用分析[J].電子科技,2005(9):17-20.

        [3]張利兵,陳定方.Windows消息機制及其在Delphi中的應用[J].交通與計算機,2004(3):108-110.

        [4]王亞,宋銘利.Windows消息機制研究[J].現代計算機:下半月版,2008(2):70-71.

        2014-09-06

        肖 巍(1975- ),男,吉林長春人,長春師范大學傳媒學院副教授,從事圖像處理與模式識別、自動識別技術、嵌入式系統研究。

        TP311

        A

        2095-7602(2014)06-0052-03

        猜你喜歡
        分派調用隊列
        隊列里的小秘密
        基于多隊列切換的SDN擁塞控制*
        軟件(2020年3期)2020-04-20 00:58:44
        核電項目物項調用管理的應用研究
        在隊列里
        LabWindows/CVI下基于ActiveX技術的Excel調用
        測控技術(2018年5期)2018-12-09 09:04:46
        《宋元學案》中程頤思想的詮釋與評價——兼論二程思想的比較及其分派
        哲學評論(2018年1期)2018-09-14 02:34:36
        論勞思光對宋明儒學分派問題的研究
        豐田加速駛入自動駕駛隊列
        快遞小哥的一天
        新民周刊(2017年9期)2017-03-20 17:45:04
        基于系統調用的惡意軟件檢測技術研究
        亚洲成熟丰满熟妇高潮xxxxx| 人妖熟女少妇人妖少妇| 国产日本精品一区二区| 精品人妻av一区二区三区| 亚洲码国产精品高潮在线| 欧美专区在线| 性色av手机在线观看| 国产午夜亚洲精品国产成人av| 国产午夜福利不卡在线观看| 国产3p视频| 91国产超碰在线观看| 亚洲av区,一区二区三区色婷婷| 日韩丰满少妇无码内射| 国产最新网站| 国产精品一区二区久久毛片| 国产精品日韩经典中文字幕| 少妇无码av无码一区| 亚洲婷婷丁香激情| 97超碰中文字幕久久| 少妇真实被内射视频三四区| 国产又黄又大又粗的视频| 亚洲黄色性生活一级片| 99蜜桃在线观看免费视频| 欧美最猛黑人xxxx黑人猛交 | 无码国产亚洲日韩国精品视频一区二区三区 | 精品自拍偷拍一区二区三区| 欧美精品无码一区二区三区 | 伊人久久成人成综合网222| 岛国av一区二区三区| 久久精品人妻少妇一二三区| 99久久人妻精品免费二区| 亚洲成a人片在线播放观看国产| 亚洲精品国产av成拍色拍| 国产乱人偷精品人妻a片| 中文字幕无码免费久久| 国产伦理自拍视频在线观看| 国产乱码一区二区三区精品| 乱人伦中文无码视频在线观看| 久久99精品久久久66| av网站国产主播在线| 精品人妻无码视频中文字幕一区二区三区|