用MFC做漂亮介面之美化對話方塊

2021-09-10 19:08:14 字數 2588 閱讀 5939

**:

在windows開發當中做介面的主要技術之一就是使用mfc,通常我們看到的qq,360,暴風影音這些漂亮的介面都可以用mfc來實現。今天我們來說一下如何用mfc美化對話方塊,預設情況下,對話方塊的背景如下:

那麼,我們如何將它的背景變成如下介面呢,而且還要保留對話方塊的移動功能,漂亮背景如下:

為了實現美化對話方塊背景的效果,我們需要讓我們的對話方塊響應wm_ctlcolor訊息,每當我們的對話方塊或者它的子控制項需要重繪時,我們的對話方塊都會收到這個訊息,

因此,我們需要為對話方塊新增wm_ctlcolor的訊息響應函式,完成對訊息的處理,wm_ctlcolor的響應函式定義如下:

hbrush cmfcdialoguidlg::onctlcolor(cdc* pdc, cwnd* pwnd, uint nctlcolor)

return hbr;}

當我們的對話方塊需要重繪的時候,我們的對話方塊就會收到wm_ctlcolor訊息,然後我們的對話方塊處理函式會呼叫onctlcolor函式來處理該訊息,在這個函式中,pdc代表我們要繪製的上下文環境,pwnd代表我們要繪製的視窗指標,nctlcolor代表我們要繪製的視窗型別,在函式的內部我們首先呼叫父類的onctlcolor,目的是為了對該訊息做預設處理,這是mfc訊息響應函式的慣用寫法,但是在我們這裡,我們不能使用預設處理返回的畫刷,所以我們需要做乙個特殊的判斷,如果pwnd指向的視窗位址是當前對話方塊,那麼我們就返回m_bkbrush,這個畫刷是乙個影象畫刷,它會在我們的對話方塊客戶區繪製我們想讓它顯示的。下面我們看一下m_bkbrush是如何建立的,首先在我們的對話方塊的標頭檔案中增加乙個cbrush變數,變數名是m_bkbrush,然後在對話方塊的oninitdialog中初始化它,oninitdialog的定義如下:

bool cmfcdialoguidlg::oninitdialog()

}// 設定此對話方塊的圖示。 當應用程式主視窗不是對話方塊時,框架將自動

// 執行此操作

seticon(m_hicon, true); // 設定大圖示

seticon(m_hicon, false); // 設定小圖示

// todo: 在此新增額外的初始化**

cstring strbmppath = _t(".\\res\\background.png");

cimage img;

img.load(strbmppath);

movewindow(0, 0, img.getwidth(), img.getheight());

cbitmap bmptmp;

bmptmp.attach(img.detach());

m_bkbrush.createpatternbrush(&bmptmp);

return true; // 除非將焦點設定到控制項,否則返回 true}

現在我們看一下,在oninitdialog中,我們都做了什麼,首先,我們建立了乙個cstring變數strbmppath,用它指向我們的檔案,然後我們建立了乙個cimage變數img,這個變數可以方便的載入各種格式的影象檔案,所以我們使用它的目的是為了方便載入png格式的檔案,movewindow的目的是為了調整我們的對話方塊客戶區的大小,使客戶區的大小與的大小一致,然後我們建立了乙個cbitmap型別變數bmptmp,使用它是因為cbrush的成員函式createpatternbrush的引數要求輸入這種型別的引數,所以必須將img轉換成cbitmap,轉換的方法是bmptmp.attach(img.detach()),img.detach會釋放影象的控制代碼,並且返回這個控制代碼,bmptmp使用attach繫結img返回的影象控制代碼,從而完成了物件型別的轉換,最後呼叫createpatternbrush,這個函式的功能是使用傳遞給它的影象建立乙個影象畫刷,然後在onctlcolor中,使用它填充對話方塊的背景,程式執行效果如下:

border:none

再次編譯,執行程式,效果如下:

現在的對話方塊背景已經和我們設想的基本一致,還有一點小瑕疵,大家仔細觀察對話方塊的底邊,左下角和右下角有多於的畫素,下面我們通過**消除它。

在oninitdialog尾部追加如下**:

crgn rgntmp;

rect rc;

getclientrect(&rc);

rgntmp.createroundrectrgn(rc.left + 3, rc.top + 3, rc.right - rc.left - 3, rc.bottom-rc.top -3, 6, 6);

setwindowrgn(rgntmp, true);

通過以上的**可以讓對話方塊變成乙個圓角矩形,這樣就可以去掉邊角的點,程式最終執行效果如下:

現在這個對話方塊的背景已經完全符合我們的要求,但是它現在不能拖動,因為它的標題欄是假的,所以,我們最後乙個目標就是讓這個視窗可以拖動,如何才能讓它移動呢?

windows只允許我們拖動對話方塊的標題欄,當我們的滑鼠在對話方塊上拖動的時候,對話方塊會收到乙個wm_nchittest訊息,預設的訊息處理函式會判斷當前的滑鼠是否在對話方塊的標題欄,如果在就返回htcaption標誌,否則就返回其它標誌,當返回htcaption標誌的情況下,系統就會允許對話方塊拖動,所以我們可以欺騙windows系統,讓wm_nchittest的響應函式永遠返回htcaption標誌就可以了,為對話方塊新增wm_nchittest響應函式,**如下:

使用SkinMagic美化MFC對話方塊

我在看一本王艷平的 windows程式設計 裡面第七章提到了使用skinmagic美化介面的問題。書上講的不明不白網上也有各種教程,幾天終於自己把skinmagic應用到了mfc程式中,快哉快哉!一 開啟vc6.0,新建乙個mfc基於對話方塊的應用程式。把工程命名為skin。include skin...

MFC之對話方塊

對話方塊可以分為模式對話方塊和非模式對話方塊兩種。模式對話方塊是指使用者只能在當前的窗體中進行操作,在該窗體沒有關閉之前不能切換到其他的窗體。非模式對話方塊是指當前的所操作的窗體可以切換。一般情況下,用於確認資訊的操作和一般的操作的對話方塊屬於模式對話方塊。如開啟檔案對話方塊就是典型的模式對話方塊,...

MFC 做不規則對話方塊

根據顏色值來做不規則對話方塊 外圈紅色部分會被透掉,效果如下 所以這張就不會顯示了,越簡單越好 宣告乙個成員變數 cbitmap m bmpdraw 在oninitdialog 載入 m bmpdraw.loadbitmap idb bg userinfo 這個函式最好在oninitdialog 呼...