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

        ?

        VCL Framework窗口消息機(jī)制研究

        2014-07-01 23:28:24
        關(guān)鍵詞:機(jī)制方法

        肖 巍

        (長(zhǎng)春師范大學(xué)傳媒學(xué)院,吉林長(zhǎng)春 130032)

        VCL Framework窗口消息機(jī)制研究

        肖 巍

        (長(zhǎng)春師范大學(xué)傳媒學(xué)院,吉林長(zhǎng)春 130032)

        本文介紹了傳統(tǒng)Windows消息機(jī)制及處理過程,重點(diǎn)闡述了對(duì)VCL Framework消息機(jī)制的研究,對(duì)VCL Framework窗口消息封裝機(jī)制、窗口消息分派機(jī)制的實(shí)現(xiàn)方法和實(shí)現(xiàn)技術(shù)進(jìn)行了詳細(xì)的論述。

        VCL Framework;消息機(jī)制;消息封裝;消息分派

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

        1 傳統(tǒng)的Windows消息機(jī)制

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

        消息循環(huán)往往是Windows應(yīng)用程序的核心,因?yàn)橄⒀h(huán)使一個(gè)應(yīng)用程序能夠響應(yīng)外部的事件,消息循環(huán)的任務(wù)就是從應(yīng)用程序消息隊(duì)列中檢索消息,把消息傳遞給適當(dāng)?shù)拇翱?,然后從消息?duì)列中檢索下一條消息,再分派給適當(dāng)?shù)拇翱?,依次進(jìn)行。一般形式如下:

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

        {

        TranslateMessage(msg);

        DispatchMessage(msg);

        }

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

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

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

        2 VCL Framework窗口消息機(jī)制

        VCL Framework不但實(shí)現(xiàn)了窗口消息封裝和窗口消息分派,也使用了VCL類來封裝窗口控件,讓每一個(gè)VCL封裝類都能夠在其中實(shí)現(xiàn)處理窗口消息的工作,而不需要像傳統(tǒng)Windows程序設(shè)計(jì)一樣在一個(gè)冗長(zhǎng)繁雜的窗口回調(diào)函數(shù)中撰寫所有的程序代碼。

        2.1 VCL Framework的窗口消息封裝機(jī)制

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

        表1 VCL Framework中處理消息種類

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

        表2 調(diào)用慣例對(duì)于參數(shù)和棧的處理方式

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

        Procedure WMLButtonUp(var Message:TWMLButtonUp);message WM_LBUTTONUP

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

        Procedure CMParentFontChanged(var M:TMessage);message CM_PARENTFONTCHANGED

        2.2 VCL Framework的窗口消息分派機(jī)制

        VCL Framework使用虛擬方法來解決分派窗口消息的機(jī)制,只要調(diào)用一個(gè)標(biāo)準(zhǔn)的虛擬方法,然后不同的VCL封裝類覆寫此虛擬方法,就可以被VCL的分配消息機(jī)制調(diào)用并傳遞窗口消息作為此虛擬方法的參數(shù)。

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

        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;

        當(dāng)VCL Framework找到了相應(yīng)的目標(biāo)VCL組件后,就可以正確地分派窗口消息給封裝窗口控件的VCL組件了:

        Var

        aControl:TWinControl;

        Begin

        GetWindowMessage(Message);

        aControl:=GetTargetControl(Message);

        aControl.WndProc(Message);

        End;

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

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

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

        3 結(jié)語(yǔ)

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

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

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

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

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

        2014-09-06

        肖 巍(1975- ),男,吉林長(zhǎng)春人,長(zhǎng)春師范大學(xué)傳媒學(xué)院副教授,從事圖像處理與模式識(shí)別、自動(dòng)識(shí)別技術(shù)、嵌入式系統(tǒng)研究。

        TP311

        A

        2095-7602(2014)06-0052-03

        猜你喜歡
        機(jī)制方法
        構(gòu)建“不敢腐、不能腐、不想腐”機(jī)制的思考
        學(xué)習(xí)方法
        自制力是一種很好的篩選機(jī)制
        文苑(2018年21期)2018-11-09 01:23:06
        可能是方法不對(duì)
        定向培養(yǎng) 還需完善安置機(jī)制
        用對(duì)方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        破除舊機(jī)制要分步推進(jìn)
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        賺錢方法
        捕魚
        日韩国产欧美视频| 国产精品白浆在线观看免费| 国内精品卡一卡二卡三| 国产精品国产三级农村妇女| 国产大陆av一区二区三区| 国产啪精品视频网站免| 亚洲精品不卡av在线免费| 午夜精品久久久久久久99老熟妇| 亚洲精品国产suv一区88| 粉嫩少妇内射浓精videos| AV无码人妻一区二区三区牛牛| 国产大片在线观看91| 2021国产精品视频网站| 性生交大全免费看| 国产精品视频一区日韩丝袜| 视频一区中文字幕日韩| 久久天堂av综合合色| 精品人妻系列无码人妻免费视频| 最新在线观看精品国产福利片| 亚洲视频一区二区蜜桃| 亚洲字幕中文综合久久| 亚洲人成人无码www影院| 国产黑色丝袜在线观看下| 扒下语文老师的丝袜美腿| 国产在线一区二区三区四区不卡| www插插插无码视频网站| 国产午夜精品一区二区三区不| 久久青青草原亚洲av| 欧美男生射精高潮视频网站 | 亚洲啪啪视频一区二区| 特级婬片国产高清视频| 国产又黄又爽视频| 一级午夜理论片日本中文在线| 91九色最新国产在线观看| 东京热人妻无码一区二区av | 亚洲精品午夜精品国产| 日韩精品极品免费视频观看| 伊人久久大香线蕉综合网站| 中文字幕久久久久久精| 国内精品毛片av在线播放| 亚洲国产成人av在线观看|