View视图类与Dialog对话框通信实例

1.实例任务

探究视图与对话框的数据交流关系。具体功能如下图所示:

具体研究的问题包括:
1.如何建立菜单菜单栏子项与子对话框的关联
2.如何建立视图类中数据(计算、绘图等)与子对话框数据的交流

2.逐步实现

建立MFC应用项目(单文档结构非文档视图):

单独建立视图类(ChildView)中的数据应用:
CChilView.h文件中定义数据变量:

class CChildView : public CWnd
{
public:// 构造
	CChildView();
// 操作
public:// 重写	
	protected:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
// 实现
public:
	virtual ~CChildView();
	// 生成的消息映射函数
protected:
	afx_msg void OnPaint();
	DECLARE_MESSAGE_MAP()
	int m_nWidth;
	int m_nHeight;
	int m_nUnits;
};
CChildView.cpp文件中进行数据初始化以及功能实现:
CChildView::CChildView()
{//构造函数进行数据初始化
	m_nWidth  = 4;
	m_nHeight = 2;
	m_nUnits  = 0;
}
void CChildView::OnPaint() 
{//数据用途
	CPaintDC dc(this); // 用于绘制的设备上下文
	CBrush brush(RGB(255, 0, 255));
	CBrush* pOldBrush = dc.SelectObject(&brush);
	
	switch (m_nUnits)
	{
	case 0://Inches
		dc.SetMapMode(MM_LOENGLISH);
		dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);
		break;
	case 1:
		dc.SetMapMode(MM_LOMETRIC);
		dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);
		break;
	case 2:
		dc.SetMapMode(MM_TEXT);
		dc.Rectangle(0, 0, m_nWidth * 100, -m_nHeight * 100);
	}
	dc.SelectObject(pOldBrush);
}
单独建立子对话框的功能关系
构建/设计对话框面板:
更改名称以及ID号。此处只需注意一点,对于单选按钮组合情况,应该每一组的第一个设为Group=True;Tabstop=True。
为对话框构建新类,命名定义为“COptionsDlg”.
在OptionsDlg.h文件中添加数据成员:

OptionsDlg.h
class OptionsDlg : public CDialogEx
{
	DECLARE_DYNAMIC(OptionsDlg)

public:
	OptionsDlg(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~OptionsDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButtonReset();
	int m_nHeight;
	int m_nWidth;
	int m_nUnits;
};
OptionsDlg.cpp
void OptionsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight);
	DDV_MinMaxInt(pDX, m_nHeight, 1, 128);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth);
	DDV_MinMaxInt(pDX, m_nWidth, 1, 128);
	DDX_Radio(pDX, IDC_RADIO_INCHES, m_nUnits);
}
在进行Reset按钮功能设置:
void OptionsDlg::OnBnClickedButtonReset()
{
	m_nWidth  = 4;
	m_nHeight = 2;
	m_nUnits  = 0;
	UpdateData(FALSE);//内存向空间传递数据
}
建立视图框与子对话框的联系(弹出机制)
构建面板:
构建视图与对话框的命令消息COMMAND

建立视图与Options子对话框的数据交流关系:
在ChildView.cpp文件中:
void CChildView::OnOnFileOptions()
{
	OptionsDlg dlg;
	//向子对话框传递初始化参数
	dlg.m_nWidth  = m_nWidth;
	dlg.m_nHeight = m_nHeight;
	dlg.m_nUnits  = m_nUnits;
	if ( dlg.DoModal() == IDOK) //打开模态对话框
	{//将子对话框的数据传递到主视图 并进行图像绘制
		m_nWidth  = dlg.m_nWidth;
		m_nHeight = dlg.m_nHeight;
		m_nUnits  = dlg.m_nUnits;
		Invalidate(); //强行刷新 触发WM_OPAIN消息
	}	
}
这里我要十分强调一点,就是子对话框的调用机理
首先看一下子对话框的构造函数(OptionsDlg.cpp):
OptionsDlg::OptionsDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(IDD_OPTIONS, pParent)
	, m_nHeight(0)
	, m_nWidth(0)
	, m_nUnits(0)
{

}
机理:(主视图文件 ChildView.cpp)->点击Options菜单->执行OptionsDlg dlg,构造子对话框对象,实例化->调用子对话框构造函数OptionsDlg::OptionsDlg(){}->初始化CDialogEx(IDD_OPTIONS,pParent)   IDD_OPTIONS就是子对话框ID号!

3.心得感受

独立构建两个视图板块
关键在如何进行是关联,核心思想在于主视图中进行对象实例化,子文件中构造函数构造子对话框,关键是子对话框ID号要正确
所谓的数据交流,就是进行两套数据进行互相传递
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFC的视图打印/预览功能基于CView::OnFilePrint和CView::OnFilePrintPreview这两个函数。 如果要对用户自定义对话框(模态)内的子视图进行打印,直接调用该视图的CView::OnFilePrint即可,弹出的“选择打印机”对话框同样也是模态对话框,覆盖在用户对话框上。 如果要对用户对话框内的视图进行预览,直接调用该视图的CView::OnFilePrintPreview后,预览视图(MFC CPreviewView实例)内虽然预览正常,但是挡住了用户对话框。由于用户对话框是模态的,导致预览视图上的“打印...”、“上一页”、“下一页”、“放大”、“缩小”、“单页/双页”和“关闭”等按钮均无法响应鼠标点击,处于“假死”状态。 解决方法: 第一个解决方法是先关闭用户对话框,再启动预览,详见http://download.csdn.net/detail/oliver_zheng/7639379 第二个解决方法仍然保持用户对话框,但是由于对话框为模态,无法利用主框架窗口CMainFrame作为预览框架,因此要另外创建并显示一个框架窗口(CFrameWnd的派生),作为预览窗口。 另外创建的框架窗口名为CPrintPreviewFrameWnd,其对应的单文档视图是CViewPrintPreview,利用这些关联信息创建一个单文档模板,利用此单文档模板创建框架窗口,并在其内嵌视图(CViewPrintPreview)中保存原主框架(CMainFrame)、用户对话框和其上需要打印的视图(CTestView)。然后基于CViewPrintPreview启动预览和打印(具体过程详见第一个解决办法)。由于CViewPrintPreview的各个相关虚函数诸如OnPreparePrinting、OnBeginPrinting、OnPrepareDC、OnPrint和OnEndPrinting都被重载,用于调用真正需要打印的视图CTestView的各自函数,因此CViewPrintPreview实际上只是个“中介”视图,是连接预览视图(MFC CPreviewView)和CTestView的桥梁。 当打印或者预览结束后,关闭自行创建的框架窗口CPrintPreviewFrameWnd,利用CViewPrintPreview中实现保存的信息恢复主框架和用户对话框,恢复打印/预览前的环境。 代码(实现了第二个解决方法)在VC2010下编译通过。第一个解决方法的源码详见http://download.csdn.net/detail/oliver_zheng/7639379
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值