運用無模式對話方塊

2021-05-27 11:17:06 字數 1698 閱讀 4137

windows對話方塊分為模式(mode)和無模式(modeless)兩種。通常當螢幕最前面為模式對話方塊時,後面的對話方塊均不可用,這也是模式與無模式對話方塊的區別。

最直接的創造無模式對話方塊的方法是呼叫create()函式,該函式需要傳遞乙個對話方塊模版資源以及可選的父視窗指標。如果不傳遞父視窗指標則預設主視窗為其父視窗。當建立成功時將返回true。如果需要建立完畢後即顯示該對話方塊,則需要ws_visible,否則需要呼叫showwindow(sw_show)。

cmodeless *m_pmodeless = new cmodeless(this);

m_pmodeless->create(cmodeless::idd);

m_pmodeless->showwindow(sw_show);

當建立的無模式對話方塊顯示後停留在父對話方塊(在doc/view中則是主框架)之上,可以用於自視窗與父框架的互動操作。但是有些時候並不需要該無模式對話方塊總是停留在父框架之上,解決方法是在創造該對話方塊時將create()中的父視窗指標傳遞給桌面視窗,使之成為桌面的乙個子視窗。

m_pmodeless->create(cmodeless::idd,getdesktopwindow());
建立該對話方塊後系統為該對話方塊分配了儲存空間,在該對話方塊銷毀時必須銷毀這些儲存空間。當對話方塊關閉,該對話方塊接收到的最後乙個訊息是wm_ncdestroy,onncdestroy()被呼叫並呼叫postncdestroy(),這裡才算真正刪除對話方塊。

void cmodeless::postncdestroy() 

在將無模式對話方塊宣告為父框架的乙個物件時有乙個指標指向該無模式對話方塊,現在將之刪除之後該指標處於未知狀態。一種解決方法是傳遞乙個訊息給父視窗將該指標設定為null。

void cmodeless::postncdestroy() 

lresult cmainframe::onmymethod(wparam wparam, lparam lparam)

在無模式對話方塊中要避免使用onok()和oncancel()。若要使用必須改進如下。

void cmodeless::oncancel() 

void cmodeless::onok() 

}

在模式對話方塊中當domodal()返回後依然可以訪問該對話方塊的變數,因為該對話方塊物件並沒有銷毀只是視窗銷毀了。在無模式對話方塊中依然實用。

void cmodeless::onok() 

}

如果在乙個父框架下只允許乙個該無模式對話方塊例項存在,則需要進行如下程式。成員變數m_pmodeless表示無模式對話方塊的物件,如果該變數為null時則說明沒有例項存在可以建立乙個,當不為null時則呼叫setforegroundwindow()將已存在的例項放在最視窗最前端。

if(m_pmodeless)

else

當該例項被銷毀時需要告知父視窗m_pmodeless已經失效。

void cmodeless::postncdestroy() 

模式對話方塊與無模式對話方塊

顯示子窗體 1 showdialog 無模式對話方塊 babywindow.showdialog 顯示子窗體 showdialog 無模式對話方塊 無模式 窗體讓您在此窗體與另一窗體之間變換焦點,而不必關閉初始窗體。使用者在該窗體顯示的同時可繼續在任何應用程式的其他位置工作。例如 文字編輯軟體裡面的...

模式對話方塊 無模式對話方塊 的區別

開啟乙個模式對話方塊後,其他所有對話方塊都不能用滑鼠和鍵盤操作 非模對話方塊開啟後,它下面的對話方塊還能操作。僅此而已!應用的時候,如果希望多個對話方塊能同時操作,就用非模態的,大多情況下是模態的,好控制!無模式總結 建立時用create,清除時用destroywindow,建立物件時用new,清除...

模式和無模式對話方塊

無模式對話方塊與有模式對話方塊不同的是在建立後其他視窗都可以繼續接收使用者輸入,因此無模式對話方塊有些類似乙個彈出視窗。建立無模式對話方塊需要呼叫 bool cdialog create uint nidtemplate,cwnd pparentwnd null 然後再呼叫 bool cdialog...