MFC之自繪控制項

2021-09-06 22:21:24 字數 1915 閱讀 9721

在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。

所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。

在採用自繪前介面樣式

採用自繪後介面樣式

是不是自繪控制項後看起來正常了很多?

自繪控制項的步驟:

我們以做乙個關閉按鈕為例

先建立乙個mfc類繼承自cbutton。

給這個類新增 乙個虛函式drawitem(),乙個虛函式presubclasswindow()和 乙個afx bool onerasebkgnd()函式(一般以afx開頭的函式都會在訊息對映裡面有一條對映)

drawitem()是控制項的自繪處理函式,在這個函式中可以對控制項的樣式進行描繪。

附一段**為例: 

1

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 }

新增onerasebkgnd()函式**,一般都是固定的

bool cdhsbutton::onerasebkgnd(cdc*pdc)

新增虛函式presubclasswindow函式**(presubclasswindow函式實際上是在cwnd::ceateex方法中的

afxhookwindowcreate(this)

方法中實現的,

afxhookwindowcreate

作用是設定鉤子函式,所以你如果想在建立視窗之前將視窗與自己的派生類進行關聯,這時候建立前的處理就要在

presubclasswindow

中寫。)

具體來說,

在presubclasswindow函式中,設定modifystyle(0, bs_ownerdraw);

**如下

1

void

cdhsbutton::presubclasswindow()

2

使用bs_ownerdraw

屬性 是要求建立

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...