欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2014年07月16日 14:54:43   投稿:shichen2014  
這篇文章主要介紹了VC定制個性化的MessageBox解決方法,有助于進一步的了解windows應(yīng)用程序的消息機制及運行原理,需要的朋友可以參考下

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

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

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

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

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結(jié)構(gòu)中的lpszIcon吧,在使用過程中你應(yīng)當準備一個合適的MSGBOXPARAMS結(jié)構(gòu),如果你要用自己的icon,你一定要用MB_USERICON這個flag。

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

1.安裝HK_CBT鉤子;
2.調(diào)用MessageBox()函數(shù);
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()函數(shù)的后邊兩個參數(shù),用它可以區(qū)別安裝是一個全局鉤子還是一個線程鉤子,在這里我們只要安裝一個線程鉤子。所以我們將Module handle設(shè)置為NULL,同時將thread ID設(shè)為本線程的ID

在SetWindowHookEx()函數(shù)中有一個hook procedure,這是window調(diào)用的一個回調(diào)函數(shù),在windows系統(tǒng)中有一個HOOK鏈,我們在編寫hook procedure時要注意保證此鏈的完整,所以我們的hook procedure要調(diào)用CallNextHookEx()函數(shù)。下面就是我們的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:
    // 現(xiàn)在wParam中就是message box的句柄
    hwnd = (HWND)wParam;
    // 我們已經(jīng)有了message box的句柄,在這里我們就可以定制message box了!
    return 0;
  }
  // Call the next hook, if there is one
  return CallNextHookEx(hMsgBoxHook, nCode, wParam, lParam);
}

移除HK_CBT鉤子:

只要調(diào)用UnhookWindowsHookEx()函數(shù)就可以了

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

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消息,不過那樣處理要復(fù)雜一些。在早期的windows platform SDK中就有這樣一個例子。

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

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

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

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

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

相關(guān)文章

  • 聊一聊C++虛函數(shù)表的問題

    聊一聊C++虛函數(shù)表的問題

    C++是面向?qū)ο蟮恼Z言(與C語言主要區(qū)別),所以C++也擁有多態(tài)的特性。下面通過代碼看下C++虛函數(shù)表的問題,感興趣的朋友一起看看吧
    2021-10-10
  • C++中命名空間的概念及使用詳解

    C++中命名空間的概念及使用詳解

    這篇文章主要介紹了C++中命名空間的概念及使用詳解,使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字就是針對這種問題而出現(xiàn)的,需要的朋友可以參考下
    2023-08-08
  • Qt音視頻開發(fā)之視頻文件保存功能的實現(xiàn)

    Qt音視頻開發(fā)之視頻文件保存功能的實現(xiàn)

    和音頻存儲類似,視頻的存儲也對應(yīng)三種格式,視頻最原始的數(shù)據(jù)是yuv(音頻對應(yīng)pcm),視頻壓縮后的數(shù)據(jù)是h264(音頻對應(yīng)aac)。本文將利用Qt實現(xiàn)視頻文件保存功能,感興趣的可以了解一下
    2022-12-12
  • 二叉搜索樹源碼分享

    二叉搜索樹源碼分享

    這篇文章主要介紹了二叉搜索樹源碼,需要的朋友可以參考下
    2014-04-04
  • C++中rapidjson組裝繼續(xù)簡化的方法

    C++中rapidjson組裝繼續(xù)簡化的方法

    今天小編就為大家分享一篇關(guān)于C++中rapidjson組裝繼續(xù)簡化的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言實現(xiàn)定時器控制LED燈閃爍

    C語言實現(xiàn)定時器控制LED燈閃爍

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)定時器控制LED燈閃爍,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++中memcpy和memmove的區(qū)別總結(jié)

    C++中memcpy和memmove的區(qū)別總結(jié)

    這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個問題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下
    2014-10-10
  • VScode搭建C/C++開發(fā)環(huán)境的詳細過程

    VScode搭建C/C++開發(fā)環(huán)境的詳細過程

    最近迷上了vscode,小巧美觀,最主要的是全平臺,但是vscode并不是ide,必須得自己配置環(huán)境,下面這篇文章主要給大家介紹了關(guān)于VScode搭建C/C++開發(fā)環(huán)境的詳細過程,需要的朋友可以參考下
    2023-06-06
  • C++中Boost庫裁剪與其應(yīng)用詳解

    C++中Boost庫裁剪與其應(yīng)用詳解

    大家都知道STL全稱"標準模板庫(Standard Template Library)",其實它是一套標準,可能有不同的實現(xiàn),它是 C++ 的"標準庫"。Boost 則是一個 C++ 庫,被稱為"C++ 準標準庫"。那么這篇文章文章我們就來詳細的介紹C++Boost庫的裁剪與其應(yīng)用,感興趣的朋友可以一起學(xué)習(xí)。
    2016-10-10
  • Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論