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

2022-09-26 21:24:14 字數 2657 閱讀 3804

相信學過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 msgboxparams, *pmsgboxparams;

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

上面我們也講到不能定製messagebox對話方塊的原因是沒有辦法得到它的視窗控制代碼,但我們真的沒有辦法了嗎?當然有辦法,那就是使用hook(鉤子)機制。在windbxiuqkzfbqows系統中有多種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)

// 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)

其實你也可以鉤住wm_create訊息,不過那樣處理要複雜一些。在早期的windows platform sdk中就有這樣乙個例子。

你可能說,定製乙個messagebox有什麼用處,我想有下面的用途:

1.你可以用createwindowex()給messagebox新增乙個check box程式設計客棧控制項,並子類化messagebox來處理check box的訊息

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

只要有了messagebox對話方塊的控制代碼,你能做的很多,很多...

另外,如果你對模式對話方塊的機理很了解,你可以自己寫出乙個"messagebwww.cppcns.comox"來代替系統messagebox用在你的程式中。你可以參考jeffrey richter的《windows 95程式設計指南》,在書中給出了模式對話方塊的偽碼。這本書的繁體電子版可以在候捷的個人**上**。這種方法也比較簡單(新增乙個訊息迴圈,enable/disable owner視窗),示例**這裡就不實現了。讀者可以參考相關資料加以完善。

本文標題: vc定製個性化的messagebox解決方法

本文位址:

QMenu的個性化定製

經常使用選單,選單的定製相當重要,普通的樣式設定不難,一般需求足以實現 qmenu qaction 如果要足夠個性,則需要進行一定的定製。說起定製,其實也是利用qt中現成的元件進行組裝而已,使用qmenu qwidgetaction qaction 再加上qss美化就可實現個性的qmenu。先看效果...

中國個性化定製聯盟舉辦的個性化定製成果展圓滿落幕

11 月 16 日,個性化定製成果展在福州成功舉辦。本次成果展由工業和資訊化部電子第五研究所 中國賽寶實驗室 牽頭成立的中國個性化定製聯盟舉辦,吸引了數百人次參觀。工業和資訊化部電子服務業司兩化融合推進處程式設計客棧馮偉副處長 工業和資訊化部電子第五研究所彭曉雷副總工程師等一行領導參觀了成果展,並給...

GSON屬性個性化定製

有時候我們不需要把實體的所有屬性都匯出,只想把一部分屬性匯出為json.有時候我們的實體類會隨著版本的公升級而修改.有時候我們想對輸出的json預設排好格式.請看下面的例子吧 實體類 public enum clientidenum public int getvalue public string...