对话框
模态对话框的创建:
CMyModalDialog dlg;
dlg.DoModal();
非模态对话框的创建:
//定义对话框指针 CMyNoModalDialog *pDlg = new CMyNoModalDialog(); //创建对话框 pDlg->Create(IDD_NOMODAL_DIALOG, this); //显示对话框 pDlg->ShowWindow(SW_SHOW);
向导对话框实例(孙鑫vc Lesson8):
1、新建单文档解决方案:Prop
2、新建三个Dialog资源:IDD_PROP1 IDD_PROP2 IDD_PROP3
3、分别添加基于CPropertyPage类CPop1 CPop2 CPop3
4、添加基于CPropertySheet类CPropSheet
5、在CPropSheet框架中定义3个属性页:
PropSheet.h
public: CProp1 m_prop1; CProp2 m_prop2; CProp3 m_prop3;
6、在CPropSheet构造函数中添加3个属性页
PropSheet.cpp
CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { AddPage(&m_prop1); AddPage(&m_prop2); AddPage(&m_prop3); } CPropSheet::CPropSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { AddPage(&m_prop1); AddPage(&m_prop2); AddPage(&m_prop3); }
7、在菜单中新建菜单项并添加事件处理函数
8、为属性页添加OnSetActive重载函数
CProp1.cpp
// Prop1.cpp : 实现文件 // #include "stdafx.h" #include "Prop.h" #include "Prop1.h" #include "afxdialogex.h" // CProp1 对话框 IMPLEMENT_DYNAMIC(CProp1, CPropertyPage) CProp1::CProp1() : CPropertyPage(CProp1::IDD) , m_occupation(-1) , m_workAddr(_T("")) { } CProp1::~CProp1() { } void CProp1::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO1, m_occupation); DDX_LBString(pDX, IDC_LIST1, m_workAddr); } BEGIN_MESSAGE_MAP(CProp1, CPropertyPage) END_MESSAGE_MAP() // CProp1 消息处理程序 BOOL CProp1::OnSetActive() { // TODO: 在此添加专用代码和/或调用基类 ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); } LRESULT CProp1::OnWizardNext() { // TODO: 在此添加专用代码和/或调用基类 UpdateData(); if(m_occupation==-1) { MessageBox(_T("请选择你的职业!")); return -1; } if(m_workAddr=="") { MessageBox(_T("请选择你的工作地点!")); return -1; } //UpdateData(FALSE); return CPropertyPage::OnWizardNext(); } BOOL CProp1::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: 在此添加额外的初始化 ((CListBox *)GetDlgItem(IDC_LIST1))->AddString(_T("北京")); ((CListBox *)GetDlgItem(IDC_LIST1))->AddString(_T("上海")); ((CListBox *)GetDlgItem(IDC_LIST1))->AddString(_T("深圳")); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
CProp2.cpp
// Prop2.cpp : 实现文件 // #include "stdafx.h" #include "Prop.h" #include "Prop2.h" #include "afxdialogex.h" // CProp2 对话框 IMPLEMENT_DYNAMIC(CProp2, CPropertyPage) CProp2::CProp2() : CPropertyPage(CProp2::IDD) , m_football(FALSE) , m_basketball(FALSE) , m_volleyball(FALSE) , m_swim(FALSE) { } CProp2::~CProp2() { } void CProp2::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK1, m_football); DDX_Check(pDX, IDC_CHECK3, m_basketball); DDX_Check(pDX, IDC_CHECK2, m_volleyball); DDX_Check(pDX, IDC_CHECK4, m_swim); } BEGIN_MESSAGE_MAP(CProp2, CPropertyPage) END_MESSAGE_MAP() // CProp2 消息处理程序 BOOL CProp2::OnSetActive() { // TODO: 在此添加专用代码和/或调用基类 ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK); return CPropertyPage::OnSetActive(); } LRESULT CProp2::OnWizardNext() { // TODO: 在此添加专用代码和/或调用基类 UpdateData(); if(m_football || m_basketball || m_volleyball || m_swim) { return CPropertyPage::OnWizardNext(); } else { MessageBox(_T("请选择你的兴趣爱好!")); return -1; } }
CProp3.cpp
// Prop3.cpp : 实现文件 // #include "stdafx.h" #include "Prop.h" #include "Prop3.h" #include "afxdialogex.h" // CProp3 对话框 IMPLEMENT_DYNAMIC(CProp3, CPropertyPage) CProp3::CProp3() : CPropertyPage(CProp3::IDD) , m_salary(_T("")) { } CProp3::~CProp3() { } void CProp3::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CProp3, CPropertyPage) END_MESSAGE_MAP() // CProp3 消息处理程序 BOOL CProp3::OnSetActive() { // TODO: 在此添加专用代码和/或调用基类 ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_FINISH); return CPropertyPage::OnSetActive(); } void CProp3::PreInitDialog() { // TODO: 在此添加专用代码和/或调用基类 ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3000元以下")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3000-5000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("5000-7000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("7000-10000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("10000元以上")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0); CPropertyPage::PreInitDialog(); } BOOL CProp3::OnWizardFinish() { // TODO: 在此添加专用代码和/或调用基类 int index; index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel(); ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index, m_salary); return CPropertyPage::OnWizardFinish(); }
CPropView.cpp
// PropView.cpp : CPropView 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "Prop.h" #endif #include "PropDoc.h" #include "PropView.h" #include "PropSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CPropView IMPLEMENT_DYNCREATE(CPropView, CView) BEGIN_MESSAGE_MAP(CPropView, CView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CPropView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_COMMAND(IDM_PROPERTY, &CPropView::OnProperty) END_MESSAGE_MAP() // CPropView 构造/析构 CPropView::CPropView() { // TODO: 在此处添加构造代码 m_iOccupation=-1; m_strWorkAddr=""; memset(m_bLike,0,(sizeof(m_bLike))); m_strSalary=""; } CPropView::~CPropView() { } BOOL CPropView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // CPropView 绘制 void CPropView::OnDraw(CDC* pDC) { CPropDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 CFont font; font.CreatePointFont(300,_T("华文行楷")); CFont *pOldFont; pOldFont=pDC->SelectObject(&font); CString strTemp; strTemp="你的职业: "; switch(m_iOccupation) { case 0: strTemp+="软件工程师"; break; case 1: strTemp+="系统工程师"; break; case 2: strTemp+="架构师"; break; default: break; } pDC->TextOutW(0,0,strTemp); strTemp="你的工作地点; "; strTemp+=m_strWorkAddr; TEXTMETRIC tm; pDC->GetTextMetrics(&tm); pDC->TextOutW(0,tm.tmHeight,strTemp); strTemp="你的兴趣爱好: "; 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="你的薪资要求: "; strTemp+=m_strSalary; pDC->TextOutW(0,tm.tmHeight*3,strTemp); pDC->SelectObject(pOldFont); } // CPropView 打印 void CPropView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif } BOOL CPropView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CPropView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CPropView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CPropView::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CPropView::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // CPropView 诊断 #ifdef _DEBUG void CPropView::AssertValid() const { CView::AssertValid(); } void CPropView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CPropDoc* CPropView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPropDoc))); return (CPropDoc*)m_pDocument; } #endif //_DEBUG // CPropView 消息处理程序 void CPropView::OnProperty() { // TODO: 在此添加命令处理程序代码 CPropSheet propSheet(_T("维新属性表单")); propSheet.SetWizardMode(); if(ID_WIZFINISH==propSheet.DoModal()) { m_iOccupation=propSheet.m_prop1.m_occupation; m_strWorkAddr=propSheet.m_prop1.m_workAddr; 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; m_strSalary=propSheet.m_prop3.m_salary; Invalidate(); } }

浙公网安备 33010602011771号