对话框

模态对话框的创建:

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();
    }
    
}
posted @ 2012-07-30 15:06  lmy4710  阅读(215)  评论(0)    收藏  举报