Child风格对话框转换成Popup风格对话框

来源:互联网 发布:max809焊盘数据 编辑:程序博客网 时间:2024/06/10 11:08

        对于同一个Dialog资源,在不同的环境中可能需要显示的方式不一样。本人在开发中遇到的就是这种问题,在一种环境中需要的是对话框做嵌入式child显示,而另一处环境需要的是popup弹出式显示,有的人说弄两个资源,一个是子对话内嵌另一个是弹出式对话框,这样又不免重复了。

       首先,资源里的对话框设置为CHILD类型嵌入式对话框,对话框类重写虚函数virtual void PreSubclassWindow(),类中增加一个标识变量(是否模态显示) BOOL  m_bIsModal,

void CMyDlg::PreSubclassWindow() 
{
if ( m_bIsModal)
    {
        if(m_hWnd  !=  NULL)
        {
            //获得当前的风格
            LONG lStyle = GetWindowLong(m_hWnd,  GWL_STYLE);
            
            lStyle &= ~WS_CHILD;        //去除CHILD 风格
            lStyle &= ~WS_DISABLED;    //去除DISABLED 风格


            lStyle |= WS_POPUP;          //添加POPUP 风格
            lStyle |= WS_VISIBLE;        //添加VISIBLE 风格
            lStyle |= WS_SYSMENU;        //添加SYSMENU 风格
lStyle |= WS_CAPTION;
                        
             //设置修改的风格
            SetWindowLong(m_hWnd,  GWL_STYLE,  lStyle);  
        }
    }
CSubUIDlg::PreSubclassWindow();
}

其次,在OnInitDialog中调整对话显示位置

void CMyDlg::OnInitDialog()

{

if(m_bIsModal && m_hWnd)

{

CRect rectFrame, rectDlg;
CWnd* pMainWnd = AfxGetMainWnd();
if(pMainWnd != NULL)
{
pMainWnd->GetClientRect(rectFrame);
pMainWnd->ClientToScreen(rectFrame);
GetWindowRect(rectDlg);

int nXPos = rectFrame.left + (rectFrame.Width() / 2) - (rectDlg.Width() / 2);
int nYPos = rectFrame.top + (rectFrame.Height() / 2) - (rectDlg.Height() / 2);
::SetWindowPos(m_hWnd, HWND_TOP, nXPos, nYPos, rectDlg.Width(), rectDlg.Height(), SWP_NOCOPYBITS);
}

}

}

这样,就可以把内嵌风格对话框资源转变成模态对话框显示了。

原创粉丝点击