摘自:
做乙個透明的edit控制項的主要問題是字元的輸出,在edit裡輸出的重新整理有幾個時機,乙個是在接收到鍵盤或滑鼠訊息的時候 ,還有就是在接收到wm_paint訊息。重新整理的時候也不是全部重畫,所以想通過在繼承的edit類中處理wm_paint訊息是行不通的。但是edit控制項自己總是知道怎麼去重新整理,因此只要給控制項發訊息,讓其自己來重新整理就可以了。通過使用spy++的得知需要重新整理有幾個時機,乙個是按鍵的時候,內容變化,另乙個是選擇變化的時候,前者edit控制項會接收到getctlcode和keyup 訊息,後者會接收到getctlcode和capturechange訊息或keyup訊息,因此在getctlcode裡呼叫redrawwindow來強迫edit重新整理 整個控制項。在redrawwindow中通過使用引數rdw_erase可以使控制項重畫背景,即呼叫onerasebkgnd(cdc* pdc),在該函式中重 畫背景。比較特殊的情況是按住滑鼠左鍵並來回拖動滑鼠的時候,這時候選擇要改變,接收的訊息是mousemove,為了正 確響應也要處理該訊息,但是在每乙個mousemove中都重新整理顯示的開銷太大,而且不可避免地有閃爍感,因此只有在滑鼠左 鍵按下的時候才重新整理顯示。
大概的**如下,主要是繼承了乙個cedit的物件ctpedit,使用的時候可以動態建立,或者採用subclass的方法。我用的是後者。
class ctestdlg : public cdialog
;
//在oninitdialog中subclass對話方塊模板中的edit控制項
bool ctestdlg::oninitdialog()
//在onctlcolor中設定背景的透明,要改變edit控制項字型的顏色也在這裡
hbrush ctestdlg::onctlcolor(cdc* pdc, cwnd* pwnd, uint nctlcolor)
return hbr;
}
//ctpedit物件
#ifndef _ccolor_edit_h_
#define _ccolor_edit_h_
class ctpedit : public cedit
}afx_msg
declare_message_map()
};
//}
#endif
//ctpedit的訊息響應函式如下
#include "stdafx.h"
#include "coloredit.h"
//畫背景圖
bool ctpedit::onerasebkgnd(cdc* pdc)
//強迫edit控制項擦除背景,重寫字元
uint ctpedit::ongetdlgcode()
//記錄滑鼠左鍵是否按下
void ctpedit::onlbuttondown(uint nflags, cpoint point)
void ctpedit::onlbuttonup(uint nflags, cpoint point)
//如果左鍵按下並且拖動滑鼠就要重新整理顯示
void ctpedit::onmousemove(uint nflags, cpoint point)
//初始化成員變數
ctpedit::ctpedit()
關於CEdit控制項的透明
關於cedit控制項的透明 前幾天和風在這裡討論關於cedit控制項的透明問題。主要的目的就是要做乙個有圖形背景的edit控制項,經過一番努,終於做出了乙個還算象樣的edit控制項。做乙個透明的edit控制項的主要問題是字元的輸出,在edit裡輸出的重新整理有幾個時機,乙個是在接收到鍵盤或滑鼠訊息的...
重繪編輯框CEdit 繼承CEdit方式
編輯框是常用控制項之一,同時也是一種完全自實現較為繁瑣的控制項。本例實現了對編輯框的簡單的自繪製,在保留其自身的強大功能的前提下,實現了編輯框的邊框 背景 文字顏色以及禁用態的各種顏色的替換。要想重繪,我們必須知道要繪什麼。通過觀察預設的編輯框我們可以很清楚的看到編輯框有三個最基礎的部分需要我們繪製...
MFC控制項背景重繪
mfc中改變dialog背景色和控制項底色,一般採取過載onctlcolor cdc pdc,cwnd pwnd,uint nctlcolor onctlcolor是控制項視窗函式 其畫刷控制代碼效果提示資訊函式 afx msg hbrush onctlcolor 構成 返回值,onctlcolor...