之前的计算界面,是一个个的独立窗体,都是popup的弹出窗体。
现在是想以子窗体的形式体现出来,并且保证代码不需要大量更改或者再创建一份资源。
这就需要使用一些办法解决问题。
//独立窗口显示
CDataDlg dlg;
dlg.Domodal();
//子对话框的形式显示
CDataDlg dlg;
dlg.Create(CDataDlg::IDD, this);
dlg.ShowWindow(SW_SHOW);
这就意味着需要在窗体未创建之前修改窗体样式。这里涉及到一个函数PreSubclassWindow:
class CDataDlg: public CDialog
{
CDataDlg(CWnd* parent/*, bool isChildWnd*/);//也可以做为参数传递,这样就不需要RegisterChildStyle
//其余代码保持不变
void SetChildStyle()
{
m_idChildWnd = true;
}
private:
bool m_isChildWnd;//默认FALSE
virtual void PreSubclassWindow();
}
void CDataDlg::PreSubclassWindow()
{
if (m_isChildWnd)
{
ModifyStyle(WS_POPUP|WS_OVERLAPPED, WS_CHILD);
ModifyStyle(WS_CAPTION, 0);
ModifyStyleEx(WS_EX_DLGMODALFRAME, 0);
}
CDialog::PreSubclassWindow();
}
然后在后续使用主窗体调用的时候
CDataDlg dlg;
dlg.SetChildStyle();
dlg.Create(CDataDlg::IDD, this);
dlg.ShowWindow(SW_SHOW);
这样子就既不影响独立使用,也不影响作为子窗体使用。
当然,还有一个更好的办法,就是创建一个基类的CBaseDialog,重载PreSubclassWindow,然后修改的代码可能更少了。现在的代码,需要在各个弹出窗体内添加变量m_idChildWnd , 添加PreSubclassWindow函数,也不是很方便,后续会改回来。
子窗体案例:
//用于子对话框
class CChildPage : public CDialog
{
DECLARE_DYNAMIC(CChildPage)
public:
CChildPage(UINT nIDD,CWnd* pParent = NULL); // standard constructor
virtual ~CChildPage();
// Dialog Data
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void OnCancel();
virtual void OnOK();
int m_nSendMsgEscapeMsg;
};
IMPLEMENT_DYNAMIC(CChildPage, CDialog)
CChildPage::CChildPage(UINT nIDD,CWnd* pParent /*=NULL*/): CDialog(nIDD, pParent) ,m_nSendMsgEscapeMsg(0)
{
}
CChildPage::~CChildPage()
{
}
void CChildPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CChildPage, CDialog)
END_MESSAGE_MAP()
// CChildPage message handlers
BOOL CChildPage::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)
{
case WM_KEYDOWN:
{
if(m_nSendMsgEscapeMsg)
{
if(pMsg->wParam==VK_ESCAPE)//VK_RETURN, VK_SPACE
{
this->GetParent()->PreTranslateMessage(pMsg);
return FALSE;
}
}
}
break;
default:
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CChildPage::OnCancel()
{
// TODO: Add your specialized code here and/or call the base class
//CDialog::OnCancel();
}
void CChildPage::OnOK()
{
// TODO: Add your specialized code here and/or call the base class
//CDialog::OnOK();
}