在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。
所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。
在採用自繪前介面樣式
採用自繪後介面樣式
是不是自繪控制項後看起來正常了很多?
自繪控制項的步驟:
我們以做乙個關閉按鈕為例
先建立乙個mfc類繼承自cbutton。
給這個類新增 乙個虛函式drawitem(),乙個虛函式presubclasswindow()和 乙個afx bool onerasebkgnd()函式(一般以afx開頭的函式都會在訊息對映裡面有一條對映)
drawitem()是控制項的自繪處理函式,在這個函式中可以對控制項的樣式進行描繪。
附一段**為例:
1新增onerasebkgnd()函式**,一般都是固定的void
cdhsbutton::drawitem(lpdrawitemstruct lpdrawitemstruct)218
else
if (m_nmousestate ==down)
1925
else
if(m_bselected)
2632
else
3336
37if (!m_strcaption.isempty())
3845
else
if(m_bselected)
4649
else
if (m_nmousestate ==over)
5053
else
5457}58
59releasedc(pdc);
60 }
bool cdhsbutton::onerasebkgnd(cdc*pdc)新增虛函式presubclasswindow函式**(presubclasswindow函式實際上是在cwnd::ceateex方法中的
afxhookwindowcreate(this)
方法中實現的,
afxhookwindowcreate
作用是設定鉤子函式,所以你如果想在建立視窗之前將視窗與自己的派生類進行關聯,這時候建立前的處理就要在
presubclasswindow
中寫。)
具體來說,
在presubclasswindow函式中,設定modifystyle(0, bs_ownerdraw);
**如下
1使用bs_ownerdrawvoid
cdhsbutton::presubclasswindow()
2
屬性 是要求建立
cbutton
的繼承類,並在其中過載
drawitem
方法才可以。你要是不想改變
button
的外觀不要用這個屬性。
意思就是如果你要過載派生類按鈕中的
drawitem
方法,必須要設定了
bs_ownerdraw
才能過載
6.因為是通過ddx關聯的方式,所以在使用上,要用dodataexchange方法將派生類與資源中的按鈕進行關聯。
7.新增按鈕事件:
MFC之自繪控制項
在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。在採用自繪前介面樣式 採用自繪後介面樣式 是不是自繪控制項後看起來正常了很多?自繪控制項的步驟 我們以做乙個關閉按鈕為例 先建立乙個mfc類繼承自cbutton。給這個類新增...
MFC自繪控制項
1.c 中drawitem 函式不被呼叫的問題 自繪乙個cmybutton的時候,在drawitem 中改變了button的顏色,但是在程式執行時,drawitem 函式並沒有被執行,原因在於按鈕的型別並不是bs ownerdraw,所以我們需要把它改為 所有者繪製 解決方法 可以過載乙個presu...
MFC控制項自繪之 七
mfc中的cdc,cclientdc,cpaintdc,cwindowdc的區別 cdc是windows繪圖裝置的基類。cclientdc 1 客戶區裝置上下文 用於客戶區的輸出,與特定視窗關聯,可以讓開發者訪問目標視窗中客戶區,其建構函式中包含了getdc,析構函式中包含了releasedc。cp...