對話方塊內容不顯示原因是對話方塊失效後內容不顯示。
第一步, 解決游標使得對話方塊失效。如果不重新整理,當前游標焦點離開非模態對話方塊後,對話方塊會處於失效狀態。既然這樣,可以在當前游標離開對話方塊後,仍然把對話方塊設定成當前焦點。
在巨集begin_message_map(class,baseclass) 和 巨集end_message_map()中間定義wm_acad_keepfocus訊息對映
on_message
(wm_acad_keepfocus, onacadkeepfocus)
定義訊息函式
afx_msg lresult onacadkeepfocus
(wparam wparam, lparam lparam)
;
實現
//當前游標
point pt;
::getcursorpos
(&pt)
;//控制項相對與對話方塊或者(裝置螢幕)的座標大小,即整個對話方塊大小
crect rect;
::getwindowrect
(this
->m_hwnd, rect)
;再比較pt是否在rect範圍內,在返回true,不在返回false
..
第二步,解決程式切換後對話方塊失效。該情況需要重繪視窗
使用on_wm_size 和 on_wm_paint訊息
on_wm_size()
on_wm_paint
()
// 在onsize函式中重繪redrawwindow();
afx_msg void
onsize
(uint ntype,
int cx,
int cy)
;//在onpaint函式中重繪updatewindow() -- 失效才會重繪
afx_msg void
onpaint()
;
invalidaterect(null); //設定無效區 和 updatewindow(); //立即重新整理
與 redrawwindow()等價。
如果不呼叫 invalidaterect就呼叫 updatewindow,那麼updatewindow什麼都不做。
如果呼叫 invalidaterect 後不呼叫updatewindow,則系統會自動在視窗訊息隊列為空的時候,系統自動傳送wm_paint訊息。
呼叫updatewindow()時將會傳送乙個wm_paint訊息,而應用程式在接收到wm_paint訊息後,將自動地呼叫invalidate()。
updatewindow()就是立即傳送wm_paint訊息,updatewindow要求系統對區域進行立即重繪,其只對宣告為無效的區域起作用,而invalidate()是宣告無效區域的方式之一。
invalidate()表示客戶區域無效,在下次wm_paint發生時重繪。
而wm_paint是由系統進行維護的,每當cwnd的更新區域不為空,並且在應用程式的視窗訊息佇列中沒有其它訊息時,windows就傳送一條wm_paint訊息。
invalidat最後也是呼叫invalidatrect。
redrawwindow()則是具有invalidate()和updatewindow()的雙特性。宣告視窗的狀態為無效,並立即更新視窗,立即呼叫wm_paint訊息處理。
redrawwindow 強制重新整理,會呼叫wm_paint,但如果你強制重新整理的部分不存在就不會呼叫wm_paint。若不帶任何引數,則本視窗全部重新整理。
非模態對話方塊記憶體釋放問題
分類 vc 2009 08 31 18 48 4220人閱讀收藏 舉報dialog windows null delete任務 對於乙個非模態子對話方塊的記憶體釋放,一般的處理方法是在onclose 函式中新增destroywindow 然後在postncdestroy 中delete this。當...
MFC中非模態對話方塊的建立
在資源檢視dialog下新建視窗資源,右鍵視窗,新增類,設定其類為cdlg11,預設繼承視窗類cdialogex,設定id為 idd dlg11,其他屬性有需求可修改 在程式中cdemodlg的類中新增cdemodlg pdlg11 在構造裡對其初始化 pdlg11 null void cdemod...
更改對話方塊內容的簡單方法
指令 首先你要建立父視窗,將變化的內容,並將行政管理變化的元素。讓下降列表 組合框 控制的變化父視窗的內容。子視窗將被放置到區域框架矩形控制項 型別 幀 現在是時候建立子視窗,對話方塊視窗風格 孩子的特點,邊境,沒有和相應的尺寸。每個對話方塊建立子類,孩子從cdialog。cdialogdlg 父母...