一个窗体,切换Popup属性和Child属性

之前的计算界面,是一个个的独立窗体,都是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();
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值