CAD中非模態對話方塊內容被擦除

2021-10-08 04:38:06 字數 1841 閱讀 3480

對話方塊內容不顯示原因是對話方塊失效後內容不顯示。

第一步, 解決游標使得對話方塊失效。如果不重新整理,當前游標焦點離開非模態對話方塊後,對話方塊會處於失效狀態。既然這樣,可以在當前游標離開對話方塊後,仍然把對話方塊設定成當前焦點。

在巨集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 父母...