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

首頁 > 編程 > C > 正文

VC定制個性化的MessageBox解決方法

2020-01-26 15:28:51
字體:
來源:轉載
供稿:網友

相信學過VC的人都知道MessageBox()函數的用法:

int MessageBox( HWND hWnd,     // handle to owner window LPCTSTR lpText,   // text in message box LPCTSTR lpCaption, // message box title UINT uType     // message box style);

雖然在參數uType中可以指定一些樣式,但你在程序中能夠對MessageBox的外觀所做的定義卻不多。原因是當調用MessageBox()函數后,它在內部有自己的消息循環(所有的模式對話框都有自己的消息循環),返回時MessageBox對話框窗口已經被Destroy,所以你沒有辦法得到MessageBox對話框的窗口句柄。但你可以根據自己的不同需求用下面的方法中去定制你的MessageBox:

如果你只是想用自己的icon去代替系統MessageBox提供的那幾種有限的icon,用MessageBoxIndirect()函數就可以了:

int MessageBoxIndirect( CONST LPMSGBOXPARAMS lpMsgBoxParams // message box parameters);typedef struct {  UINT   cbSize;  HWND   hwndOwner;  HINSTANCE hInstance;  LPCTSTR  lpszText;  LPCTSTR  lpszCaption;  DWORD   dwStyle;  LPCTSTR  lpszIcon;  DWORD_PTR dwContextHelpId;  MSGBOXCALLBACK lpfnMsgBoxCallback;  DWORD   dwLanguageId; } MSGBOXPARAMS, *PMSGBOXPARAMS;

看到MSGBOXPARAMS結構中的lpszIcon吧,在使用過程中你應當準備一個合適的MSGBOXPARAMS結構,如果你要用自己的icon,你一定要用MB_USERICON這個flag。

上面我們也講到不能定制MessageBox對話框的原因是沒有辦法得到它的窗口句柄,但我們真的沒有辦法了嗎?當然有辦法,那就是使用HOOK(鉤子)機制。在windows系統中有多種HOOK,但在這里我們只用到HK_CBT類型的鉤子。HK_CBT鉤子過程在WM_MOVE、WM_SIZE、WM_ACTIVE、WM_CREATE、WM_DESTROY時被系統調用,所以HK_CBT鉤子可以在這里用。下面讓我們看如何實現MessageBox的定制過程。

1.安裝HK_CBT鉤子;
2.調用MessageBox()函數;
3.移除HK_CBT鉤子。

整個過程很簡單吧?我們在這里介紹第一步和第三步。

安裝HK_CBT鉤子:

HHOOK hMsgBoxHook = SetWindowsHookEx( WH_CBT,        // Type of hook  CBTProc,        // Hook procedure (see below) NULL,         // Module handle. Must be NULL (see docs) GetCurrentThreadId()  // Only install for THIS thread!!!);

重要的是SetWindowHookEx()函數的后邊兩個參數,用它可以區別安裝是一個全局鉤子還是一個線程鉤子,在這里我們只要安裝一個線程鉤子。所以我們將Module handle設置為NULL,同時將thread ID設為本線程的ID。

在SetWindowHookEx()函數中有一個hook procedure,這是window調用的一個回調函數,在windows系統中有一個HOOK鏈,我們在編寫hook procedure時要注意保證此鏈的完整,所以我們的hook procedure要調用CallNextHookEx()函數。下面就是我們的hook procedure:

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){  HWND hwnd;  if(nCode < 0)    return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);  switch(nCode)  {  case HCBT_ACTIVATE:    // 現在wParam中就是message box的句柄    hwnd = (HWND)wParam;    // 我們已經有了message box的句柄,在這里我們就可以定制message box了!    return 0;  }  // Call the next hook, if there is one  return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);}

移除HK_CBT鉤子:

只要調用UnhookWindowsHookEx()函數就可以了

好了,我們將在上面的三步寫成一個函數,如下:

int MsgBoxEx(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType){    int ret;  // Install a thread hook, so we can customize it  hMsgBoxHook = SetWindowsHookEx(    WH_CBT,     CBTProc,     NULL,     GetCurrentThreadId()    );  // Display a standard message box  ret = MessageBox(hwnd, szText, szCaption, uType);  // remove the window hook  UnhookWindowsHookEx(hMsgBoxHook);  return ret;}

其實你也可以鉤住WM_CREATE消息,不過那樣處理要復雜一些。在早期的windows platform SDK中就有這樣一個例子。

你可能說,定制一個MessageBox有什么用處,我想有下面的用途:

1.你可以用CreateWindowEx()給MessageBox添加一個check box控件,并子類化MessageBox來處理check box的消息

2.通過子類化改變messagebox、button或icon,以便和你整個程序的界面風格相一致

只要有了MessageBox對話框的句柄,你能做的很多,很多...

另外,如果你對模式對話框的機理很了解,你可以自己寫出一個"MessageBox"來代替系統MessageBox用在你的程序中。你可以參考Jeffrey Richter的《Windows 95程式設計指南》,在書中給出了模式對話框的偽碼。這本書的繁體電子版可以在候捷的個人網站上下載。這種方法也比較簡單(添加一個消息循環,Enable/Disable Owner窗口),示例代碼這里就不實現了。讀者可以參考相關資料加以完善。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美疯狂做受xxxx高潮| 久久久久久这里只有精品| 精品国产一区二区三区久久久| 欧美高跟鞋交xxxxhd| 亚洲精品福利免费在线观看| 98精品国产高清在线xxxx天堂| 欧美日韩一区二区免费在线观看| 97精品一区二区三区| 亚洲国产天堂久久综合| 91国语精品自产拍在线观看性色| 欧美精品18videos性欧| www.日韩av.com| 啊v视频在线一区二区三区| 久久免费精品日本久久中文字幕| 亚洲免费影视第一页| 中文字幕在线看视频国产欧美在线看完整| 久久精品国产综合| 精品免费在线观看| 欧美xxxx综合视频| 精品国产91乱高清在线观看| 成人国产亚洲精品a区天堂华泰| 欧美xxxx综合视频| 国产精品午夜视频| 久久伊人精品一区二区三区| 欧美成人午夜免费视在线看片| 久久中文字幕在线| 国产精品美乳在线观看| 欧美亚洲视频在线看网址| 亚洲性日韩精品一区二区| 国内精品久久久久久影视8| 色777狠狠综合秋免鲁丝| 国产精品高潮呻吟久久av野狼| 国产精品88a∨| 亚洲欧美国内爽妇网| 精品久久久久久久久久久久久久| 国产精品91久久久久久| 午夜精品久久久久久久久久久久| 精品无人区太爽高潮在线播放| 亚洲国产古装精品网站| 亚洲欧美制服综合另类| 国产精品自在线| 国自在线精品视频| 国产精品久久在线观看| 欧美亚洲另类制服自拍| 国产精品久久综合av爱欲tv| 亚洲情综合五月天| 欧美精品一二区| 欧美多人爱爱视频网站| 亚洲欧美中文日韩v在线观看| 欧美日韩激情小视频| 久久av中文字幕| 国产精品老牛影院在线观看| 久久6免费高清热精品| 国产欧美va欧美va香蕉在线| 国产高清视频一区三区| 2024亚洲男人天堂| 亚洲欧美日韩中文在线| 亚洲男子天堂网| 亚洲伦理中文字幕| 日韩av最新在线观看| 最近中文字幕2019免费| 国产精品成人观看视频国产奇米| 疯狂欧美牲乱大交777| 国产精品6699| 精品国产户外野外| 国内揄拍国内精品少妇国语| 神马国产精品影院av| 黄色成人在线播放| 久久久久久中文| 国产精品99久久久久久久久| 中文字幕精品视频| 国产精品69久久| 91精品国产色综合久久不卡98| 国产一区二区黄| 国产精品亚发布| 丝袜亚洲另类欧美重口| 91老司机精品视频| 欧洲亚洲免费在线| 97色伦亚洲国产| 91在线观看免费高清完整版在线观看| 久久久久久国产精品美女| 国产精品h片在线播放| 国产成人精品视频在线| 自拍偷拍亚洲精品| 国产日本欧美一区二区三区| 裸体女人亚洲精品一区| 亚洲精品电影网| 国产精品福利在线| 欧美视频中文字幕在线| 中文字幕亚洲欧美在线| 欧美性生交xxxxxdddd| 欧洲成人性视频| 中文.日本.精品| 亚洲激情中文字幕| 日韩色av导航| 久久国产精品久久精品| 国产精品久久久久aaaa九色| 91欧美视频网站| 欧美激情小视频| 亚洲成人亚洲激情| 亚洲二区中文字幕| 在线观看国产精品日韩av| 亚洲自拍偷拍色片视频| 日韩欧美第一页| 日韩在线视频网站| 欧美成人午夜激情视频| 欧美日韩在线观看视频小说| 日韩欧美视频一区二区三区| 日韩免费精品视频| 色青青草原桃花久久综合| 亚洲一区二区三| 国内自拍欧美激情| 亚洲成人网av| 欧美日韩国产va另类| 国产69久久精品成人| 国产精品久久久久久久久久尿| 亚洲自拍偷拍区| 91精品国产色综合久久不卡98| 91久久久国产精品| 久久99精品国产99久久6尤物| 91国产视频在线| 亚洲人永久免费| 日韩黄在线观看| 国产精品男人的天堂| 影音先锋欧美在线资源| 亚洲а∨天堂久久精品喷水| 日韩欧美成人区| 日本a级片电影一区二区| 久久视频在线观看免费| 国产精品美女av| 欧美性精品220| 久久91亚洲人成电影网站| 久久91亚洲精品中文字幕| 亚洲无av在线中文字幕| 亚洲精品中文字幕有码专区| 国产91精品高潮白浆喷水| 日本精品免费观看| 亚洲欧美激情另类校园| 国产精品亚洲片夜色在线| 成人激情免费在线| 伊人久久综合97精品| 精品久久久在线观看| 91精品国产综合久久香蕉| 精品国产欧美一区二区五十路| 91国产在线精品| 国产成人av在线播放| 国产欧美久久一区二区| 在线看片第一页欧美| 另类视频在线观看| 欧美中文在线观看| 91av网站在线播放| 欧美日韩国产综合视频在线观看中文| 日韩欧美精品网址| 欧美电影院免费观看| 色噜噜亚洲精品中文字幕| 精品国产一区二区三区久久狼黑人| xvideos亚洲人网站| 日韩av电影在线网| 亚洲自拍欧美色图| 欧美一区二区影院| 91精品视频观看| 麻豆乱码国产一区二区三区| 亚洲欧美国产视频| 国内精品美女av在线播放|