今天子類化edit控制項碰到乙個問題,子類化時在attach中的斷言錯誤
試出兩個方法:
第一:在oninitdialog函式中的cdialog::oninitdialog()前執行子類化過程
m_meremotemac.subclassdlgitem(idc_maskedit_rmac, this);
//m_meremotemac.subclasswindow(getdlgitem(idc_maskedit_rmac)->m_hwnd);
第二:subclassdlgitem中的pparent指定為子視窗的父視窗cwnd(父視窗也是非模態對話方塊)
m_meremotemac.subclassdlgitem(idc_maskedit_rmac, this->getparent());
對此還沒有深究,改天有空研究一下
參考了以下內容
void cmyedit::onkeydown(uint nchar, uint nrepcnt, uint nflags)
else
if ( oldpos==4 || oldpos==7 )
return ;
}else
cedit::onkeydown(nchar, nrepcnt, nflags);
}三、在對話方塊類中新增變數 cmyedit,m_myedit,在初始化函式中新增動態子類化函式 :
子類化:
void cadeditdlg::onbtnsub()
反子類化:
void cadeditdlg::onbtnunsub()
附加說明:
1、子類化函式的引數說明:
bool subclassdlgitem( uint nid, cwnd* pparent);
將乙個 windows 控制項與 cwnd 或 cwnd 派生類的物件連線,然後使它通過 cwnd 或 cwnd 派生類的訊息對映**訊息。其中nid為該控制項的id,pparent為控制項的父視窗。
bool subclasswindow( hwnd hwnd );
作用同subclassdlgitem,只是該函式通過創後的控制代碼來完成子類化操作。hwnd為需要子類化的視窗控制代碼 hwnd
unsubclasswindow();
反子類化,該函式使視窗與子類化所連線的類脫離,使用該控制項視窗預設的訊息處理函式wndproc來處理。函式返回取消子類化的視窗控制代碼。
2、如果使採用classwizard將編輯框與cmyedit變數對映後,classwizard已經通過ddx_control巨集完成了子類化的過程,如果此時再在對話方塊的初始化函式中進行子類化的時候,將會發生錯誤。本文發表於http://bianceng.cn(程式設計入門網)
3、反子類化後,m_myedit物件已經與視窗分離,此時不能通過m_myedit來處理該視窗需要訊息類完成的操作,比如setfocus(),否則,也會發生錯誤。
注:部分地方參考了《ms vc++ 6.0 mfc類庫參考手冊》
結束語本文簡單的講了一下如何動態的使控制項子類化,從而使控制項完成自己需要的功能。這是我前段時間做一套管理軟體時所碰到的問題,雖然比較簡單,但我想對於初級讀者來說,還使又一定幫助的。很希望和大家**一些更深層次的問題。
VC中edit控制項使用
setsel start,end 作用 定製edit的所選擇內容.間接地可以用於定位游標位置.使用例子 exp1 設定游標 cedit pedit cedit getdlgitem idc edit1 pedit setsel 2,2 pedit setfocus exp2 選擇內容 cedit p...
VC中edit控制項使用
vc中edit控制項使用 setsel start,end 作用 定製edit的所選擇內容.間接地可以用於定位游標位置.使用例子 exp1 設定游標 cedit pedit cedit getdlgitem idc edit1 pedit setsel 2,2 pedit setfocus exp2...
VC 之Edit控制項自動換行
vc 中edit控制項中的文字換行標誌是 r n,而不是一般的 n。所以說,如果想在edit控制項中顯示兩行文字,可以使用如下方法 cstring str name r n pedit setwindowtext str 這樣就可以在edit空間中顯示兩行文字。前提是 該edit控制項必須設定為es...