国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

C++ BUILDER 消息處理的深入探索

C++ BUILDER 消息處理的深入探索

更新時間:2022-05-02 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

在本文中我將告訴你如何以C++Builder來處理Windows訊息,並透過此一能力,來達(dá)成在一般VCL元件所無法做到的功能。


何謂Window訊息(Message)


大家都知道 Windows是一套以訊息驅(qū)動(Message Driven)的作業(yè)系統(tǒng)。然而對於訊息本身卻諱莫如深,只知其然而不知其所以然,雖然C++Builder將某些Windows訊息封裝於事件(Event)系統(tǒng)中,但身為一個Windows程式設(shè)計師,實有必要瞭解Windows的訊息系統(tǒng)。


所謂訊息是由Windows作業(yè)系統(tǒng)送往程式的事件。它是系統(tǒng)中各個物件溝通的方式,舉例來說,當(dāng)移動滑鼠、按下滑鼠鍵、改變視窗大小時,Windows都會送出訊息以通知程式。當(dāng)然,為了要辨別事件的內(nèi)容,Windows系統(tǒng)中定義了許多的訊息,如WM_PAINT,WM_CHAR等等。


當(dāng)事件發(fā)生時,Windows會判斷該事件必須由那個程式接收,然後將事件以訊息的方式送往程式的視窗中。雖然在Windows系統(tǒng)中包含了數(shù)以百計的事件,但是作業(yè)系統(tǒng)並沒有為各個事件設(shè)計不同的訊息結(jié)構(gòu),而是以一個一般性的結(jié)構(gòu)來描述訊息,這個結(jié)構(gòu)在C++Builder就稱是TMessage。


當(dāng)然,隨著事件的不同,對於訊息的解釋也有所不同,在C++Builder中也為各種常用的訊息定義了專屬的結(jié)構(gòu),你可以直接使用它們來解釋訊息。這些訊息定義在C++Builder目錄下的Include\vcl\messages.hpp中,你可以決定要自行解釋TMessage參數(shù)或是直接將其轉(zhuǎn)換成專屬的結(jié)構(gòu)。很抽象嗎?我舉個例子吧,以WM_NCHITTEST訊息來說,C++Builder為它定義了TWMNCHitTest的專屬結(jié)構(gòu),所以你可以直接經(jīng)由它來得到XPos、YPos等值。或者你也可以直接由TMessage的LParam取得其值,端看你使用的方便。仔細(xì)觀察TMessage及TWMNCHitTest兩個結(jié)構(gòu),你會發(fā)現(xiàn)它們是等價的,也就是說它們的大小是一致的,因此你可以直接用強(qiáng)制轉(zhuǎn)型互相轉(zhuǎn)換(這有點類似union的方法)。


struct TMessage

{

Cardinal Msg;

union

{

struct

{

Word WParamLo;

Word WParamHi;

Word LParamLo;

Word LParamHi;

Word ResultLo;

Word ResultHi;

};

struct

{

long WParam;

long LParam;

long Result;

};

};

};

struct TWMNCHitTest

{

Cardinal Msg;

long Unused;

union

{

struct

{

Windows::TSmallPoint Pos;

long Result;

};

struct

{

short XPos;

short YPos;

};

};

} ;


在收到訊息後,程式必須處理該訊息,若是不處理,則可直接將它交給Windows的內(nèi)定處理程序來處理之,若是程式需要傳回值,也可以在此時傳回,Windows會將該值傳回給呼叫方。如此就完成了訊息傳遞的程序。

WM_NCHITTEST訊息的奧秘


WM_NCHITTEST訊息是一個很特殊的訊息。它是用來決定目前滑鼠所在位置屬性的訊息,因此我們可以利用此特性,當(dāng)滑鼠移至指定的位置時,傳回 HTCAPTION,使得系統(tǒng)以為滑鼠目前位於標(biāo)題棒,如此你就可以移動視窗了。如何?是不是很神奇呢?


由上可知,只要我們適時地攔截WM_NCHITTEST訊息,然後傳回HTCAPTION,就可以順利地欺騙系統(tǒng),達(dá)成在任何位置模擬出標(biāo)題棒的效果。


C++ Builder的處理訊息的巨集


在C++Builder為了處理訊息的方便,因此定義了三個處理訊息的巨集(Macro)。


BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_NCHITTEST,TMessage,OnNcHitTest)

END_MESSAGE_MAP(TForm)


以上的三個巨集BEGIN_MESSAGE_MAP、MESSAGE_HANDLER及END_MESSAGE就是C++ Builder定義的巨集,其中比較重要的是MESSAGE_HANDLER;它共需要三個參數(shù),第一個參數(shù)代表訊息的ID,第二個代表參數(shù)型態(tài),最後一個則是訊息事件處理函數(shù)。


乍看之下,這個巨集似乎和MFC及OWL所使用的巨集有幾分神似,沒錯,不過其機(jī)制卻更為簡單及簡潔,我們可以看看C++Builder對於這三個巨集的原始定義:


#define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void *Message) \

{ \

switch (((PMessage)Message)->Msg) \

{

#define MESSAGE_HANDLER(msg,type,meth) \

case msg: \

meth(*((type *)Message)); \

break;

#define END_MESSAGE_MAP(base) default: \

base::Dispatch(Message); \

break; \

} \

}


相較於MFC或 OWL的可怕巨集,它實在是簡單多了,這是因為C++Builder已替你完成了大部份的工作。其實若我們把以上的巨集展開後,可以得到以下的結(jié)果:


virtual void __fastcall Dispatch(void *Message)

{

switch (((PMessage)Message)->Msg)

{

case WM_NCHITTEST:

OnNcHitTest(*((TMessage *)Message));

break;

default:

TForm::Dispatch(Message);

break;

}

}


怎麼樣?展開之後是不是有恍然大悟的感覺,要弄清楚這個巨集在賣啥膏藥是很容易的,如果你玩過MFC的訊息處理機(jī)制,再看到以上的巨集,相較之下,實在是小兒科,不過也就因其簡單,所以C++Builder的優(yōu)勢益加彰顯。


我簡單地說明以上的程式:在每個TForm中都定義一個名為Dispatch的虛擬函式,它就是用來處理Windows的訊息的,在大部份情況下,訊息都是呼叫C++Builder所提供的處理函式,因此你不需要修改它。


換句話說,我們只要改寫Dispatch函式,就可以藉以處理指定的訊息了。前面提到的三個巨集只是將這個程序簡化而已,沒什麼大不了。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        日韩精品电影在线| 欧美一区二区精品久久911| 欧美高清视频不卡网| 91小宝寻花一区二区三区| 欧美三级视频在线| 懂色av一区二区三区免费看| 国产一区二区在线看| 天天影视色香欲综合网老头| 99久久免费视频.com| 久久超级碰视频| 久久精品国产99久久6| 亚洲一卡二卡三卡四卡五卡| 一级女性全黄久久生活片免费| 亚洲午夜久久久久中文字幕久| 一区二区三区日韩欧美| 天堂av在线一区| 激情都市一区二区| 成人v精品蜜桃久久一区| 北条麻妃一区二区三区| 国产精品18久久久久久久久| 国产不卡免费视频| 日韩精品一区二| 91国在线观看| 3d成人h动漫网站入口| 日韩免费视频一区二区| 欧美日产在线观看| 久久蜜臀中文字幕| 亚洲一区二区三区四区不卡| 亚洲精品欧美二区三区中文字幕| 亚洲无人区一区| 国产成人精品免费看| 欧美三级蜜桃2在线观看| 精品国一区二区三区| 亚洲欧洲韩国日本视频| 美女精品自拍一二三四| av激情综合网| 精品国产一区二区三区久久久蜜月| 国产精品国产三级国产aⅴ原创| 亚洲一区二区三区中文字幕| 国产精品中文字幕日韩精品| 日韩一区二区免费电影| 成人欧美一区二区三区黑人麻豆| 青青草97国产精品免费观看 | 色一情一乱一乱一91av| 日韩一区和二区| 精品欧美黑人一区二区三区| 亚洲国产精品久久久久秋霞影院| 国产成人午夜99999| 日韩一区二区三免费高清| 亚洲免费av在线| 五月综合激情日本mⅴ| www.99精品| 国产精品成人免费| 奇米影视一区二区三区| 国产成人精品网址| 8v天堂国产在线一区二区| 国产精品成人一区二区三区夜夜夜 | 91福利视频久久久久| 欧美日韩小视频| 国产91露脸合集magnet| 久久久欧美精品sm网站| 国产精品久久久久天堂| 日韩一区二区三区免费观看| 91欧美激情一区二区三区成人| 91亚洲精品久久久蜜桃| 丁香网亚洲国际| 欧美福利电影网| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 亚洲成人av电影| 成人福利在线看| 日韩精品最新网址| 色综合久久久久综合99| 亚洲黄色在线视频| 欧美最猛性xxxxx直播| 一区二区三区资源| 精品欧美一区二区久久| 91蝌蚪porny| 国产一区二区女| 亚洲午夜久久久久中文字幕久| 精品福利一区二区三区免费视频| 成人国产在线观看| 午夜欧美一区二区三区在线播放| 26uuu亚洲综合色欧美 | 欧美久久久久久久久| 免费在线观看精品| 中文字幕一区二区三区蜜月| 欧美久久久久免费| 91老司机福利 在线| 精品午夜久久福利影院 | 亚洲欧美视频在线观看| 欧美mv日韩mv亚洲| 777奇米四色成人影色区| 日本韩国视频一区二区| 成人高清伦理免费影院在线观看| 亚洲va韩国va欧美va| 国产欧美日韩激情| 久久综合精品国产一区二区三区| 欧美日韩成人在线| 日本韩国一区二区| 91丨九色丨国产丨porny| 粉嫩嫩av羞羞动漫久久久 | 国产一区二区三区四| 免费av网站大全久久| 亚洲高清不卡在线| 亚洲综合丝袜美腿| 一区二区三区欧美| 亚洲欧美另类图片小说| 亚洲天堂免费在线观看视频| 综合色中文字幕| 亚洲欧洲美洲综合色网| 综合久久给合久久狠狠狠97色| 国产精品福利电影一区二区三区四区| 久久先锋资源网| 国产欧美视频一区二区三区| 国产欧美一区二区精品性色超碰 | 久久精品一区八戒影视| 久久综合一区二区| 国产清纯白嫩初高生在线观看91| ww亚洲ww在线观看国产| 久久精品亚洲乱码伦伦中文| 2024国产精品| 18成人在线视频| 亚洲久本草在线中文字幕| 亚洲欧美激情在线| 亚洲国产日韩a在线播放性色| 午夜日韩在线观看| 久久99久久99| www.色综合.com| 欧美日韩三级在线| 欧美一区二区视频在线观看2022| 欧美不卡视频一区| 国产欧美精品一区aⅴ影院 | 91碰在线视频| 欧美日韩精品免费| 精品动漫一区二区三区在线观看| 欧美激情一区二区在线| 亚洲人被黑人高潮完整版| 日本美女一区二区| 成人免费毛片嘿嘿连载视频| 欧美午夜不卡视频| 久久综合av免费| 亚洲人一二三区| 久久成人久久爱| 91丨九色丨国产丨porny| 在线成人av网站| 国产女人aaa级久久久级| 亚洲大片精品永久免费| 国产乱码精品一区二区三区五月婷| 99re成人在线| 精品捆绑美女sm三区| 一区二区三区不卡视频| 精品一区二区三区视频在线观看| 大胆亚洲人体视频| 91精品在线免费观看| 中文字幕亚洲区| 毛片一区二区三区| 在线视频综合导航| 亚洲国产精品国自产拍av| 亚洲成人黄色小说| 91丝袜美女网| 国产欧美一区二区三区沐欲| 日韩电影免费一区| 91高清视频免费看| 久久久久久久精| 久久国产人妖系列| 欧美高清dvd| 亚洲国产精品久久不卡毛片| eeuss鲁片一区二区三区在线看| 日韩免费性生活视频播放| 亚洲免费av观看| 成人久久久精品乱码一区二区三区| 欧美一区二区三区男人的天堂| 亚洲欧美另类小说视频| 成人免费黄色大片| 久久一区二区视频| 久久精品国产一区二区三区免费看| 91蜜桃在线观看| 欧美在线免费观看亚洲| 国产人久久人人人人爽| 麻豆精品视频在线| 69久久99精品久久久久婷婷| 亚洲男同性视频| 97久久超碰精品国产| 国产精品无码永久免费888| 国产一区二区h| 久久综合九色综合97婷婷女人| 精品一区精品二区高清| 欧美成人性福生活免费看| 美女精品一区二区| 精品国精品自拍自在线| 久久精品国产**网站演员| 欧美www视频| 国产在线乱码一区二区三区| 欧美一区二区视频在线观看2022| 日韩黄色片在线观看| 精品美女在线播放| 国产成人在线视频网站| 一区二区在线看| 91亚洲精品乱码久久久久久蜜桃| 樱花草国产18久久久久|