MFC学习日记十二:Mfc属性表单操作(第八课)

属性表单:

一些Mfc向导介绍:

多文档:类似WordExcel都是多文档应用程序,一次可以打开多个文档。

MFC学习日记十二:Mfc属性表单操作(第八课)_第1张图片

这里说明CPropertyPage(属性页类)是从CDialog派生出来的, 所以它也是一个对话窗的类。

          MFC学习日记十二:Mfc属性表单操作(第八课)_第2张图片

  这里说明CPropertySheet(属性表单类)是从CWnd类派生出来的。

编写之前的一些必要知识:

1、对资源编辑器中的单选或者复选按钮关联一个成员变量;单选按钮关联变量用int型的value;

2、控件与变量相关联是用DoDataExchange函数来关联的。

3、当用户要点击下一个的时候来判断用户是否对属性表单进行了选择,这里我们增加一个虚函数OnWizardNext()里来判断。

4、前面对我们的变量与资源管理器中的变量做了关联,在这里我们要从控件里取回值,这里要调用到UpdateData这个函数来从控件来取值。

5、这下要做的是往框中添加工作地点,然后同样判断用户选择没有。要往这个列表框中添加字段,这里我们需要在应用程序响应WM_INITDIALOG(在窗口创建好显示之前调用的消息)这个消息的时候去添加。

6、这里讲一下为什么有时候增加的是windows消息响应函数,有时候增加的是MFC的虚函数,是因为Windows消息处理函数是系统自动调用的,而虚函数是用户做了一些操作才调用的,比如上面为什么增加的OnWizardNext()是虚函数,因为这个函数是当用户点击下一步的时候响应的函数,而上面的Windows消息WM_INITDIALOG是系统创建好窗口将要显示的时候自动会调用的函数。这样就可以看出两个有什么不同了。

这里我们完成一个属性表单的创建(效果图如下):

MFC学习日记十二:Mfc属性表单操作(第八课)_第3张图片

把用户通过属性表单所选择的内容输出到窗口中。

完成这个个人理解分为以下几步:

设计三个属性页对话框:

1、首先创建三个属性页对话框,在资源编辑器中选择插入资源-DIALOG-IDD_PROPPAGE_LARGE型的属性页对话框。并把我们要的控件添加上去。

对手动拖入的控件(三个属性页对话框)各自关联一个类:

2、要操作这个属性页对话框,那么需要对每一个对话框都关联一个类。这里建立类向导-Add New Class-》选择对应的对话框(基类选择为CPropertyPage(属性页类))创建CProp1CProp2CProp3类。

把创建好的属性页对话框放入属性表单中:

3、创建完属性页类,接下来需要把我们创建的三个属性页对话框整合到一个窗口中通过下一步或者抬头转换类型的来显示;

在这里首先增加一个基于CPropertySheet的类,通过插入-》类,选择基类类CPropertySheet,创建CPropSheet类,在里面我们就可以把自己前面创建的对话框添加进来。

添加我们前面创建的属性页对话框,首先要在这个类中添加三个分别为CProp1CProp2CProp3类型的成员变量,然后在属性表对话框中把这个三个对话框通过属性表单的成员函数AddPage()添加进去。

测试初步创建好的属性表单:

4、创建完这些,我们需要把自己设计好的属性表单显示出来,在Menu菜单中添加一个菜单项(属性表单),然后对它在view(视类)添加Windows消息处理函数ONCOMMANDOnPropertysheet(),在这里调用前面创建的属性表单类显示我们的属性向导。

对三个属性页对话框中的控件关联成员变量:

5、初步工作完成,接下来需要把我们的控件关联成员变量,以便于获取用户所选信息。只需要对控件建立类向导,在Member Variables中选择对应的控件添加成员变量即可。

完成用户所选内容的记录,并输出:

6、关联起来后只需要在View类把用户所选信息在用户点击了“完成”的时候判断if(ID_WIZFINISH==propSheet.DoModal()),把用户所选信息获取过来,在OnDraw(窗口重绘时调用的)函数中输出用户所选信息即可(这里需要在用户刚点击完成就需要发生窗口重绘,也就是要在上面判断DoModal()==ID_WIZFINISH的里面调用Invalidate(TRUE)来重绘窗口并调用OnDraw函数来输出我们在OnDraw输出的东西)。

代码实现如下:

//在CPropSheet(属性表单类)的构造函数中添加创建好的3个属性页
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
//这个构造函数是用ID来标识属性页
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
//这个构造函数是用字符串(属性页的capation(名字))来标识属性页
{
AddPage(&m_prop1);
AddPage(&m_prop2);
AddPage(&m_prop3);
}
//当用户点击下一步的时候需要做的判断并获取用户算选信息记录下来
LRESULT CProp1::OnWizardNext() 
{
// TODO: Add your specialized code here and/or call the base class
UpdateData();
if(m_occupation==-1)
{
MessageBox("请选择你的职业!");
return -1;
}
if(m_workAddr=="")
{
MessageBox("请选择你的工作地点!");
return -1;
}
switch(m_occupation)
{
case 0:
m_strJob="程序员";
break;
case 1:
m_strJob="系统工程师";
break;
case 2:
m_strJob="项目经理";
break;
default:
break;
}
return CPropertyPage::OnWizardNext();
}
//当窗口重建好并将要显示的时候调用这个函数来对“列表框”添加一些值
BOOL CProp1::OnInitDialog() 
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
((CListBox*)GetDlgItem(IDC_LIST2))->AddString("北京");
((CListBox*)GetDlgItem(IDC_LIST2))->AddString("天津");
((CListBox*)GetDlgItem(IDC_LIST2))->AddString("上海");
return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}
//点击菜单项显示属性表单并判断是否完成及获取用户所选内容:
void CPropMy4View::OnPropertysheet() 
{
// TODO: Add your command handler code here
CPropSheet propSheet("王东的属性表单");
propSheet.SetWizardMode();
if(ID_WIZFINISH==propSheet.DoModal())
{
m_iOccupation=propSheet.m_prop1.m_strJob;
m_strWorkAddr=propSheet.m_prop1.m_workAddr;
m_bLike=propSheet.m_prop2.m_favourate;
m_strSalary=propSheet.m_prop3.m_strSalary;
Invalidate(TRUE);	 //获取完用户所选内容,重绘窗口
}
}
//显示输出用户所做的选择
void CPropMy4View::OnDraw(CDC* pDC)
{
CPropMy4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CFont font;
font.CreatePointFont(300,"华文行楷");
CFont *pOldFont;
pOldFont=pDC->SelectObject(&font);
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
pDC->TextOut(0,0,"你的职业是:"+m_iOccupation);
pDC->TextOut(0,tm.tmHeight,"你的工作地点是:"+m_strWorkAddr);
pDC->TextOut(0,tm.tmHeight*2,"你的爱好是:"+m_bLike);
pDC->TextOut(0,tm.tmHeight*3,"你的薪资水平是:"+m_strSalary);
pDC->SelectObject(pOldFont);
// TODO: add draw code for native data here
}

最终输出效果:

MFC学习日记十二:Mfc属性表单操作(第八课)_第4张图片

在这些里面我们会用到上面没写到(省略掉的一些函数):

int SetCurSel( int nSelect );//在下拉列表(COMboBox)中选择一个默认值为选中项

int GetCurSel( ) const;//获取选中的下拉列表框的索引

void GetLBText( int nIndex, CString& rString ) const;

//将获取的下拉列表框的值转换为string即字符串。

void SetWizardMode( ); 

//调用这个函数在DoModal之前来建立一个向导(下一个、上一个、完成)

void SetWizardButtons( DWORDdwFlags );

// 调用这个函数来设置向导(上一个在第一个不能按,下一个在最后一个变为完成)

你可能感兴趣的:(MFC学习日记十二:Mfc属性表单操作(第八课))