MFC中Static控制項透明,重影,長度問題

2021-05-28 11:18:13 字數 1356 閱讀 1488

做mfc程式設計,static控制項是會經常用到的了,而使static控制項背景透明,以及改變文字的內容、字型、顏色等屬性,都是會比較容易碰到的情況。

王道做法當然是繼承cstatic然後過載onpaint(),完全自己來畫,這樣能夠獲得最大的靈活性,但就是比較麻煩,像我這種比較懶的,就更喜歡用下面的懶方法了。

同樣建立乙個cstatic的派生類,處理父視窗的反射訊息wm_ctlcolor,即新增hbrush ctlcolor(cdc *pdc, uint nctlcolor)這個訊息對映函式。注意,不是hbrush onctlcolor(cdc *pdc, cwnd *pwnd, uint nctlcolor)!我也不知道具體原理,反正我用後者從來沒成功過,甚至程式都不會執行到裡面。。。

其實還有乙個方法,就是處理父視窗的onctlcolor(),更簡單一點,但是不符合封裝的原則,所以這裡就不提了。

c++**

hbrush csample::ctlcolor(cdc* pdc, uint nctlcolor)

通過上述**,就可以得到彩色的文字以及透明的背景,但是,還存在乙個問題,當該static控制項的文字內容或者屬性,在執行過程中發生變化的時候,由於背景一直沒有擦除(為了實現透明),會出現重影,導致文字模糊成一團。

解決方法是,讓父視窗進行重繪更新,對,不要看錯了,是控制項所屬的父視窗,而不是控制項本身,讓控制項本身重繪也不會解決問題的,同樣我也不太清楚原理。。。

這裡還會引出乙個問題,如果重繪整個父視窗,由於gdi並不內嵌雙緩衝,勢必造成嚴重的閃爍問題,解決辦法當然是只讓父視窗重繪控制項所佔的部分,其他部分不進行重繪,**如下:

c++**

void csample::settext(const tchar *psztext)

這樣就能夠實現動態改變文字屬性而不出現重影現象,注意這裡呼叫了父視窗的screentoclient()函式來進行座標的轉換,呼叫控制項本身的s2c函式的話,得到的座標無法用來進行下一步的重繪工作。

現在還有乙個比較隱蔽的問題,就是文字字串的長度,如果新的字串的長度比原來的長,而之前拖放static控制項長度又不足的時候,就會造成超出的部分無法顯示,當然你大可以在拖放的時候就盡量弄得長一點,但是如果能隨著文字內容而自動調整控制項長度,那不是會好得多麼。

為了實現這樣的效果,上面的**要修改如下:

c++**

void csample::settext(const tchar *psztext)

同樣,這裡也是呼叫父視窗的s2c函式,這樣得到的座標才能正確使用。**經過上述修改,就實現了控制項隨文字動態調整寬度的效果。

以上只是實現static背景透明、更改文字顏色以及動態調整控制項大小的簡單演示,實際的應用中可能還需要考慮很多情況,適當修改**,但基本原理是不變的。當然要獲得最大的靈活性,還是得自己來繪製了

MFC 設定static(標籤)控制項背景透明

1 設定控制項的屬性transparent 為true 2 過載onctlcolor函式 在該函式體中加入以下 if pwnd getdlgctrlid idc x idc device stat為static控制項的id 3 解決重影問題,新增重新整理區域性背景的函式,該函式主要用於單獨重新整理所...

MFC透明BUTTON 按鈕 控制項

簡要步驟 1.新增gdi 支援 1 stdafx.h中新增 include using namespace gdiplus 2 在所在類中新增成員 ulong ptr m gdiplustoken 3 在initinstance函式中新增 initialize gdi gdiplus gdiplus...

MFC學習 2 控制項顏色透明

1.在對話方塊的標頭檔案中加入 afx msg hbrush onctlcolor cdc pdc,cwnd pwnd,uint nctlcolor 2.在對話方塊的cpp檔案中加入 1begin message map ctransparentdlg,cdialog 2 on wm ctlcolo...