在duilib中,可以调用CWindowWnd::ShowModal()来实现模态框的显示,该接口的代码如下所示:
- UINT CWindowWnd::ShowModal()
- {
- ASSERT( ::IsWindow(m_hWnd) );
- UINT nRet = 0;
- HWND hWndParent = GetWindowOwner( m_hWnd );
- ::ShowWindow( m_hWnd, SW_SHOWNORMAL );
- ::EnableWindow( hWndParent, FALSE );
- MSG msg = { 0 };
- while( ::IsWindow(m_hWnd) && ::GetMessage(&msg, NULL, 0, 0) )
- {
- if( WM_CLOSE == msg.message && msg.hwnd == m_hWnd )
- {
- nRet = msg.wParam;
- ::EnableWindow( hWndParent, TRUE );
- ::SetFocus( hWndParent );
- }
- if( !CPaintManagerUI::TranslateMessage(&msg) )
- {
- ::TranslateMessage( &msg );
- ::DispatchMessage( &msg );
- }
- if( WM_QUIT == msg.message )
- {
- break;
- }
- }
- ::EnableWindow( hWndParent, TRUE );
- ::SetFocus( hWndParent );
- if( WM_QUIT == msg.message )
- {
- ::PostQuitMessage( msg.wParam );
- }
- return nRet;
- }
先给出几段有问题的代码,先假设CDemoDlg是待显示的模态框窗口,由DUI派生而来,如下所示:
- class CDemoDlg : public CWindowImplBase
- {
- public:
- CDemoDlg( STRINGorID strUI, unsigned int dwTransparent = 255, bool bDeleteSelf = true );
- virtual ~CDemoDlg();
- ......
- }
代码段1如下所示:(下面的代码均是放置在某一个函数中,即在某一函数中弹出模态框)
- CDemoDlg demoDlg( IDR_XML_DEMO_DLG );
- demoDlg.Create( hParentWnd, _T("CDemoDlg"), UI_WNDSTYLE_BOX, UI_WNDSTYLE_EX_FRAME );
- demoDlg.CenterWindow();
- demoDlg.ShowModal();
代码段2如下所示:
- CDemoDlg* pDlg = new CDemoDlg ( IDR_XML_DEMO_DLG, 255, false );
- pDlg->Create( hParentWnd, _T("CDemoDlg"), UI_WNDSTYLE_BOX, UI_WNDSTYLE_EX_FRAME );
- pDlg->CenterWindow();
- pDlg->ShowModal();
那么如果不用new的方式,用代码1中的方式如何实现呢?也简单,构造对象时将bDeleteSelf设置为false,不让其自动被销毁,由于是局部变量,函数退出时会被销毁掉,即如下的代码:
- CDemoDlg demoDlg( IDR_XML_DEMO_DLG,255, false );
- demoDlg.Create( hParentWnd, _T("CDemoDlg"), UI_WNDSTYLE_BOX, UI_WNDSTYLE_EX_FRAME );
- demoDlg.CenterWindow();
- demoDlg.ShowModal();