建立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号!