duilib中實現彈出模態框時要注意的地方

2021-08-19 23:58:49 字數 2056 閱讀 7572

在duilib中,可以呼叫cwindowwnd::showmodal()來實現模態框的顯示,該介面的**如下所示:

[cpp] 

view plain

copy

uint

cwindowwnd::showmodal()  

;  while

( ::iswindow(m_hwnd) && ::getmessage(&msg, null, 0, 0) )   

if( !cpaintmanagerui::translatemessage(&msg) )   

if( wm_quit == msg.message )   

}  ::enablewindow( hwndparent, true );  

::setfocus( hwndparent );  

if( wm_quit == msg.message )   

return

nret;  

}  由**可以看出,先將父視窗disable掉,然後接管ui主線程的訊息迴圈,在模態框關閉後,再將訊息迴圈放歸ui主線程。但在使用時要要稍微注意一下,下面就簡單的說明一下。

先給出幾段有問題的**,先假設cdemodlg是待顯示的模態框視窗,由dui派生而來,如下所示:

[cpp] 

view plain

copy

class

cdemodlg : 

public

cwindowimplbase  

**段1如下所示:(下面的**均是放置在某乙個函式中,即在某一函式中彈出模態框)

[cpp] 

view plain

copy

cdemodlg demodlg( idr_xml_demo_dlg );  

demodlg.create( hparentwnd, _t("cdemodlg"

), ui_wndstyle_box, ui_wndstyle_ex_frame );  

demodlg.centerwindow();  

demodlg.showmodal();  

**中可以看出,cdemodlg在建立時將使用預設值bool bdeleteself = true,所以在windowimplbase::onfinalmessage函式中視窗物件會自動被delete掉,看上去好像是沒問題。實際上,demodlg是區域性物件,使用的是棧上的記憶體,但是delete刪除的是堆上的記憶體,這肯定是有問題的,會引起異常。所以這種方法是有問題。

**段2如下所示:

[cpp] 

view plain

copy

cdemodlg* pdlg = 

newcdemodlg ( idr_xml_demo_dlg, 255, 

false

);  

pdlg->create( hparentwnd, _t("cdemodlg"

), ui_wndstyle_box, ui_wndstyle_ex_frame );  

pdlg->centerwindow();  

pdlg->showmodal();  

**1中的自動銷毀有問題,那我們就將bdeleteself設定為false,不讓自動被銷毀。但還是有問題,new出來的物件沒有釋放,會有記憶體洩漏,其實在showmodal執行完後把new來的物件delete就好了。

那麼如果不用new的方式,用**1中的方式如何實現呢?也簡單,構造物件時將bdeleteself設定為false,不讓其自動被銷毀,由於是區域性變數,函式退出時會被銷毀掉,即如下的**:

[cpp] 

view plain

copy

cdemodlg demodlg( idr_xml_demo_dlg,255, 

false

);  

demodlg.create( hparentwnd, _t("cdemodlg"

), ui_wndstyle_box, ui_wndstyle_ex_frame );  

demodlg.centerwindow();  

demodlg.showmodal();  

duilib中實現彈出模態框時要注意的地方

在duilib中,可以呼叫cwindowwnd showmodal 來實現模態框的顯示,該介面的 如下所示 uint cwindowwnd showmodal while iswindow m hwnd getmessage msg,null,0,0 if cpaintmanagerui trans...

彈出新增模態框

在我們所做的專案中,增刪查改是非常常見的,而我現在要講的是新增裡面的乙個小的知識 點,我們新增的時候,首先要彈出乙個新增的框體,我們把它稱為模態框,下面我開始詳細講 解一下如何彈出新增的模態框,下面是乙個關於考生錄入的新增。彈出新增模態框 function openinsertmodal 專業下拉框...

Duilib 模態對話方塊和非模態對話方塊

cpp view plain copy void cmaindlg dotask pdlg create 的引數1,開始寫成了null,子視窗彈出後,還可以操作主視窗.因為要彈出模態對話方塊,跟進 pdlg showmodal 看到了duilib禁止主視窗的 才想到引數1應為父視窗視窗控制代碼.可以...