逃跑按钮的巧妙实现。如何制作属性页对话框和向导对话框,融合讲解组合框(如何调整组合框的大小)、列表框、单选按钮、复选按钮等常用对话框控件的多种使用方法。如何限制用户在不满足设定的条件时切换到其他属性页和向导页。
1.逃跑按钮的巧妙实现:在一个基于对话框的文档上,当你点击一个按钮的时候,把另一个按钮就隐藏起来,这样就可以实现了好像按钮逃跑的功能!其代码主要如下:
void CWeiXinBtn::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 ShowWindow(SW_HIDE);//先让一个窗口隐藏 m_pbtn->ShowWindow(SW_SHOW);//再显示另一个窗口 CButton::OnMouseMove(nFlags, point); }
CWeixinBtn 是一个从CButton中派生出来的类,由这个类来捕获鼠标移动的消息响应函数功能!还需要给两个按钮添加两个关联变量,类型为CWeixinBtn,主要是贮存其按钮的地址,交换地址!地址的交换在对话框的oninitdialog中完成!
2.属性表单的创建:
其步骤主要如下:
a.首先在资源中添加三个属性页资源,并在上面添加一些控件:如静态文本框,组合框,列表框等等控件!
b.为属性页新建三个类,它们的基类都是:cpropertysheet
c.创建一个属性表单,用函数addpage()将属性页添加到属性表单中去!
d.最后在view类中显示出表单就可以!
CPropSheet::CPropSheet(void) { AddPage(&m_prop1);//将属性页添加到表单中! AddPage(&m_prop2); AddPage(&m_prop3); } void CID084View::OnPropertysheet()//通过菜单的消息响应函数来实现! { CPropSheet propsheet;//定义一个对象 propsheet.DoModal();//对象去创建一个对话框! }
3.向导的创建:向导的创建只要在属性表单的创建过程之中加上函数setwizardmode()即可!代码如下:
void CID084View::OnPropertysheet() { // TODO: 在此添加命令处理程序代码 CPropSheet propsheet;//定义一个对象 propsheet.SetWizardMode();//创建一个向导 propsheet.DoModal();//对象去创建一个对话框! }
4.对向导对话框上面的按钮的修改:在第一页中只有向下的按钮,而在第二页中有向上和向下的按钮,在第三页中有向上和完成的按钮!这就需要在三个类中添加虚函数onsetactive(),在函数中的代码为如下:
BOOL CProp1::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);//在第一页中设置只有向下的按钮! return CPropertyPage::OnSetActive(); } BOOL CProp2::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);//在第二页中设置向上和向下按钮! return CPropertyPage::OnSetActive(); } BOOL CProp3::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);//在第三页设置向上和完成按钮! return CPropertyPage::OnSetActive(); }
5.对向导中的选项的修改(即是有了选择才可以向下进行):
a.对第一页面的修改:
LRESULT CProp1::OnWizardNext() { // TODO: 在此添加专用代码和/或调用基类 UpdateData();//当一个控件中关联有值的时候,一定要记得调用这个函数才可以更新值! if (m_occupation == -1)//对单选按钮的判断 { MessageBox(TEXT("请选择你的职业!")); return -1;//防止页面的改变 } if (m_workAddr == "")//对列表框的判断 { MessageBox(TEXT("请选择你的工作地址!")); return -1; } return CPropertyPage::OnWizardNext(); } BOOL CProp1::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: 在此添加额外的初始化 ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("北京"));//在列表框中添加一些选项! ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("上海")); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("天津")); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
b.对第二页面的修改:
LRESULT CProp2::OnWizardNext() { // TODO: 在此添加专用代码和/或调用基类 UpdateData(); if (m_football || m_basketball || m_volleyball || m_swim)//对第二个页面的判断 { return CPropertyPage::OnWizardNext(); } else { MessageBox(TEXT("请选择你的兴趣爱好!")); return -1; } }
c.对第三页面的修改:BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: 在此添加额外的初始化 ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("1000元以下"));//向组合框中添加内容 ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("1000--2000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("2000--3000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("3000元以上")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);//将第一个选项为默认选项 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
6.将向导中所选择的内容在view类中显示出来:
a.首先是对第三页所选的内容的获取:
BOOL CProp3::OnWizardFinish() { // TODO: 在此添加专用代码和/或调用基类 int index; index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();//从组合框中取得索引值 ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index, m_strSalary);//传递索引值,将结果放到变量m_strSalary中! return CPropertyPage::OnWizardFinish(); }
b.然后是对第一,第二页面的内容的获取:需要在view类中定义相对应的变量来储存所选的内容void CID084View::OnPropertysheet() { // TODO: 在此添加命令处理程序代码 CPropSheet propsheet;//定义一个对象 propsheet.SetWizardMode();//创建一个向导 if (ID_WIZFINISH == propsheet.DoModal())//对象去创建一个对话框!判断是否点击完成按钮! { m_ioccupation = propsheet.m_prop1.m_occupation;//在view类中接受在表单中所选择的内容! m_strwork = propsheet.m_prop1.m_workAddr; m_strSalary = propsheet.m_prop3.m_strSalary; m_bLike[0] = propsheet.m_prop2.m_football; m_bLike[1] = propsheet.m_prop2.m_basketball; m_bLike[2] = propsheet.m_prop2.m_volleyball; m_bLike[3] = propsheet.m_prop2.m_swim; Invalidate();//让窗口无效,引起窗口的重绘 } }
c.最后在view类中的ondraw()函数中完成输出功能:void CID084View::OnDraw(CDC* pDC) { CID084Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 CFont font; font.CreatePointFont(200, TEXT("宋体")); CFont *pOldFont; pOldFont = pDC->SelectObject(&font); CString strtemp; strtemp = TEXT("你的职业是:"); //显示第一页的所选内容 switch(m_ioccupation) { case 0: strtemp += "程序员"; break; case 1: strtemp += "系统工程师"; break; case 2: strtemp += "项目经理"; break; default: break; } pDC->TextOutW(0, 0, strtemp); strtemp = TEXT("你的工作地址是:"); strtemp += m_strwork; TEXTMETRIC tm; pDC->GetTextMetrics(&tm); pDC->TextOutW(0, tm.tmHeight, strtemp); //显示第二页面的内容 strtemp = TEXT("你的兴趣爱好是:"); if (m_bLike[0]) { strtemp += "足球 "; } if (m_bLike[1]) { strtemp += "篮球 "; } if (m_bLike[2]) { strtemp += "排球 "; } if (m_bLike[3]) { strtemp += "游泳 "; } pDC->TextOutW(0, tm.tmHeight * 2, strtemp); //显示第三页面的内容 strtemp = TEXT("你的薪资水平是:"); strtemp += m_strSalary; pDC->TextOutW(0, tm.tmHeight * 3, strtemp); pDC->SelectObject(pOldFont); }