国产午夜成人免费看片无遮挡_日本免费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>

        美女www一区二区| 欧美本精品男人aⅴ天堂| www.成人网.com| 欧美xfplay| 国产一区二区不卡老阿姨| 欧美一区二区三区在线| 免费在线欧美视频| 亚洲精品一区二区精华| 激情小说欧美图片| 久久精品亚洲乱码伦伦中文| 国产在线播放一区三区四| 久久久久久电影| 94-欧美-setu| 丝袜a∨在线一区二区三区不卡 | 蜜臀av一区二区| 精品福利一区二区三区免费视频| 精品无人码麻豆乱码1区2区| 久久亚洲精品国产精品紫薇 | 一级精品视频在线观看宜春院| av午夜一区麻豆| 亚洲午夜在线电影| 2021国产精品久久精品| 成人免费毛片aaaaa**| 亚洲精品久久久蜜桃| 日韩欧美高清在线| 国产在线一区观看| **欧美大码日韩| 日韩欧美中文字幕一区| 成人久久18免费网站麻豆 | 国产一区二区调教| 亚洲乱码国产乱码精品精可以看| 精品视频色一区| 国产毛片精品国产一区二区三区| 亚洲精品乱码久久久久久黑人| 日韩三级电影网址| 色系网站成人免费| 国产99久久久久| 免费亚洲电影在线| 亚洲免费观看视频| 国产精品美女视频| 精品国产乱码久久久久久免费| 在线免费观看视频一区| 国产91丝袜在线播放0| 精品一区中文字幕| 亚洲视频资源在线| 国产精品久久久久久一区二区三区 | 国产精品嫩草99a| 欧美欧美欧美欧美| 91久久精品一区二区三| 国产成人自拍在线| 国产永久精品大片wwwapp| 亚洲电影第三页| 亚洲综合另类小说| 一区二区三区四区视频精品免费 | 欧美中文字幕亚洲一区二区va在线| 久久成人av少妇免费| 天堂午夜影视日韩欧美一区二区| 亚洲女人小视频在线观看| 欧美激情一区不卡| 国产三级一区二区| 国产亚洲欧美中文| 欧美激情综合在线| 日本一区二区三区在线观看| 久久久久久麻豆| 久久精品人人做人人爽人人| 久久久777精品电影网影网| 久久久另类综合| 国产精品乱子久久久久| 国产精品高潮呻吟| 一区二区三区自拍| 日韩1区2区日韩1区2区| 激情五月婷婷综合网| 成人激情小说乱人伦| 北条麻妃国产九九精品视频| 91在线视频免费观看| 在线视频欧美精品| 日韩一区二区在线免费观看| 精品欧美一区二区久久 | 国产精品国产三级国产| 中文字幕一区二区三区视频| 一区二区不卡在线播放 | 国产亚洲精品aa| 中文字幕在线不卡一区二区三区| 综合中文字幕亚洲| 丝袜美腿亚洲综合| 成人综合婷婷国产精品久久蜜臀 | 国产精品久久久久影院| 中文字幕一区二区视频| 洋洋av久久久久久久一区| 男女激情视频一区| 97久久超碰精品国产| 欧美写真视频网站| 久久综合av免费| 亚洲黄色小说网站| 精品一区二区免费看| 99国产精品99久久久久久| 51久久夜色精品国产麻豆| 精品国产一区久久| 一区二区三区av电影| 国产专区欧美精品| 欧美性高清videossexo| 久久精品人人做人人综合| 亚洲成在人线免费| 成人污污视频在线观看| 91精品国产乱| 亚洲精品国产精品乱码不99| 韩日精品视频一区| 欧美色中文字幕| 国产精品久久三| 久久国产精品第一页| 91国模大尺度私拍在线视频| 国产欧美1区2区3区| 久久精品国产77777蜜臀| 欧美在线一二三| 一区二区中文视频| 成人在线一区二区三区| 亚洲精品一区二区三区99| 日本亚洲电影天堂| 欧美日本在线视频| 亚洲一区二区视频| 91丨porny丨国产入口| 国产日产欧美一区| 国产精品一区二区在线观看网站 | 日本色综合中文字幕| 色欧美片视频在线观看在线视频| 久久免费精品国产久精品久久久久| 婷婷开心激情综合| 精品视频一区二区不卡| 亚洲午夜成aⅴ人片| 成人免费视频一区| 亚洲午夜免费电影| 久久精品免费看| 色综合激情五月| 色综合av在线| 成人中文字幕在线| 久久人人爽人人爽| 久久精品久久综合| 欧美一级搡bbbb搡bbbb| 亚洲成a人v欧美综合天堂| 日本道免费精品一区二区三区| 亚洲欧美综合色| 成人亚洲一区二区一| 国产日韩欧美精品综合| 国产一区二区精品久久99| 精品精品国产高清a毛片牛牛| 日本vs亚洲vs韩国一区三区 | 91精品国产福利在线观看| 亚洲一区中文在线| 欧美三级电影一区| 日日欢夜夜爽一区| 欧美一区二区播放| 精品在线观看视频| 国产亚洲一本大道中文在线| 久久成人精品无人区| 国产日韩欧美不卡在线| 国v精品久久久网| 自拍偷拍欧美精品| 欧美久久久影院| 国产在线国偷精品免费看| 国产精品伦理一区二区| 在线一区二区视频| 男女男精品视频网| 国产精品女人毛片| 欧美性生交片4| 久久99精品久久久久久动态图 | 欧美亚洲愉拍一区二区| 三级欧美韩日大片在线看| 日韩精品一区二区三区swag| 国产91精品欧美| 亚洲成人av一区| 久久精品一区二区| 欧亚一区二区三区| 国产精品99久久久久久似苏梦涵 | 亚洲精品伦理在线| 欧美成人欧美edvon| 99精品欧美一区二区三区综合在线| 一区二区欧美精品| 久久天天做天天爱综合色| 99精品久久只有精品| 捆绑调教一区二区三区| 亚洲色图欧美偷拍| 精品国产91乱码一区二区三区| 国产网红主播福利一区二区| 色婷婷久久综合| 91黄视频在线观看| 国产精品亚洲第一| 图片区小说区国产精品视频| 欧美国产综合一区二区| 7777精品伊人久久久大香线蕉完整版| 久久爱www久久做| 亚洲成av人片在www色猫咪| 久久精品日产第一区二区三区高清版| 欧美四级电影网| 成人久久18免费网站麻豆| 美日韩一级片在线观看| 亚洲色图一区二区| 国产精品女主播av| 亚洲国产高清不卡| 久久久久国产精品麻豆| 日韩精品资源二区在线|