孙鑫VC学习(第8课--对话框的编程(逃跑按钮,属性表单,属性页))

选择一个基于对话框的MFC工程。
下面做一个逃跑按钮。
在对话框上添加两个按钮。
新建一个CBtn,基类是CButton.为这个类添加:CBtn *pbtn;
为这两个按钮关联新建立的这个按钮类。
在BOOL CTestDlg::OnInitDialog()中添加:
      m_btn1.pbtn=&m_btn2;
      m_btn2.pbtn=&m_btn1;
 
void CBtn::OnMouseMove(UINT nFlags, CPoint point)
{
      // TODO: Add your message handler code here and/or call    default
      ShowWindow(SW_HIDE);
      pbtn->ShowWindow(SW_SHOW);
      CButton::OnMouseMove(nFlags, point);
}
运行,达到效果,但是初始化运行的时候能看到两个按钮。为此做如下修改:
将其中一个按钮的可见性不选。或者在对话框的OnInitDialog()函数中m_btn1.ShowWindow(SW_HIDE);
或者用setwindowpos来实现这个操作,代码如下所示:
void CBtn::OnMouseMove(UINT nFlags, CPoint point)
{
      // TODO: Add your message handler code here and/or call default
CRect reBtnscreen;
CRect reDlgscreen;
GetWindowRect(&reBtnscreen);
GetParent()->GetWindowRect(&reDlgscreen);//GetWindowRect用的是屏幕坐标

ScreenToClient(&reBtnscreen);
ScreenToClient(&reDlgscreen);

int x = rand()%reDlgscreen.right;
int y = rand()%reDlgscreen.bottom;

SetWindowPos(NULL,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER );//SetWindowPos用的是客户坐标
CButton::OnMouseMove(nFlags, point);
}

下面是属性表单和向导的创建:
创建一个MFC的单文档程序。,新加入三个属性表单的DIALOG,可以添加普通的对话框,然后按照属性表单对话框的属性来更改新加入的对话框的属性。对话框的属性为disable表示这个对话框在初始显示后是不能使用的,如果新加入的类,CLASSWIZARD不认识,可以在文件目录下,删除工程名.clw文件,再回到工作,打开工作,再CTRL+W打开,系统会提示重新建立一个CLW的文件,选是,新建立的名字不变,就可以了。
为菜单增加一个显示属性表单的按钮,并添加VIEW类中响应。
添加三个属性页对话框。(由于在上面要写中文,将属性改为中文),并为这三个属性页创建一个类,再新建一个对话框,为它创建一个属性表单类。
在属性表单的头文件中添加:(要包含三个属性页的头文件)
public:
      CPage1 m_page1;
      CPage2 m_page2;
      CPage3 m_page3;
为属性表单的构造函数:
 
CPageSheet::CPageSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
      :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
      AddPage(&m_page1);
      AddPage(&m_page2);
      AddPage(&m_page3);
}
 
CPageSheet::CPageSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
      :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
      AddPage(&m_page1);
      AddPage(&m_page2);
      AddPage(&m_page3);
}
 
void CTestView::OnPage()
{
      // TODO: Add your command handler code here
      CPageSheet ps("属性表单");
      ps.SetWizardMode();//设置向导,如没这句,不是设置向导。
      ps.DoModal();
}
CPageSheet类不用关联任何的对话框,直接创建这个类。
为单选按钮关联一个成员变量。
BOOL CPage1::OnSetActive()
{
      // TODO: Add your specialized code here and/or call the base class
      CPageSheet* psheet = (CPageSheet*) GetParent();  
      psheet->SetWizardButtons(PSWIZB_NEXT);
      return CPropertyPage::OnSetActive();
}
BOOL CPage2::OnSetActive()
{
      CPropertySheet* psheet = (CPropertySheet*) GetParent();  
      psheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
      return TRUE;
}
BOOL CPage3::OnSetActive()
{
      // TODO: Add your specialized code here and/or call the base class
      CPropertySheet* psheet = (CPropertySheet*) GetParent();  
      psheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
      return CPropertyPage::OnSetActive();
}
 
BOOL CPage1::OnInitDialog()
{
      CPropertyPage::OnInitDialog();
      // TODO: Add extra initialization here
      ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( "北京" );
      ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( "上海" );
      ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( "广州" );
      return TRUE; // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
}
为列表框控件关联一个列表框成员变量(CSTRING类型)。
LRESULT CPage1::OnWizardNext()
{
      // TODO: Add your specialized code here and/or call the base class
      //GetText( int nIndex, LPTSTR lpszBuffer ) int GetCurSel( )
      UpdateData();
      if (-1==m_radio1)
      {
             MessageBox("请选择你的职业!!");
             return -1;
      }
      if (m_list=="")
      {
             MessageBox("请选择你的工作地点!!");
             return -1;
      }
      ((CListBox*)GetDlgItem(IDC_LIST1))->GetText(((CListBox*)GetDlgItem(IDC_LIST1))->GetCurSel( ),
             m_list );
      UpdateData(FALSE);
      return CPropertyPage::OnWizardNext();
} LRESULT CPage2::OnWizardNext()
{
      // TODO: Add your specialized code here and/or call the base class
      UpdateData();
      if (m_check1==FALSE&&m_check2==FALSE&&m_check3==FALSE&&m_check4==FALSE)
      {
             MessageBox("请选择你的兴趣爱好");
             return -1;
      }
      UpdateData(FALSE);
      return CPropertyPage::OnWizardNext();
}
将COMBO的SORT项取消。
BOOL CPage3::OnInitDialog()
{
      CPropertyPage::OnInitDialog();
      
      // TODO: Add extra initialization here IDC_COMBO1
      ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元以下");
      ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("1000元--2000元");
      ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("2000元--3000元");
      ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000元--4000元");
      return TRUE; // return TRUE unless you set the focus to a control
             // EXCEPTION: OCX Property Pages should return FALSE
}
为Page3增加:
private:
      CString m_strsalary;
 
BOOL CPage3::OnWizardFinish()
{
      // TODO: Add your specialized code here and/or call the base class
      //GetLBText( int nIndex, CString& rString ) const
      int nIndex=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
      ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText( nIndex, m_strsalary );
      return CPropertyPage::OnWizardFinish();
}下面是VIEW类中将用户的选择在VIEW中输出。
为VIEW类增加
:private:
      CString m_zhiye;
      CString m_strworkaddr;
      CString m_aihao;
      CString m_xinzhi;
并初始化。
 
void CTestView::OnPage()
{
      // TODO: Add your command handler code here 篮球,足球,游泳,排球
      CPageSheet ps("属性表单");
      ps.SetWizardMode();
      if(ID_WIZFINISH==ps.DoModal())
      {
       if(ps.m_page1.m_radio1==0)
             {
           m_zhiye="程序员";
             }
             if(ps.m_page1.m_radio1==1)
             {
           m_zhiye="系统工程师";
             }
             if(ps.m_page1.m_radio1==2)
             {
           m_zhiye="项目经理";
             }
             m_strworkaddr=ps.m_page1.m_list;
             if (ps.m_page2.m_check1==TRUE)
             {
                    m_aihao+="篮球";
             }
             if (ps.m_page2.m_check2==TRUE)
             {
                    m_aihao+="足球";
             }
             if (ps.m_page2.m_check3==TRUE)
             {
                    m_aihao+="游泳";
             }
             if (ps.m_page2.m_check4==TRUE)
             {
                    m_aihao+="排球";
             }
             m_xinzhi=ps.m_page3.m_strsalary;
             
      }
Invalidate();
}
 
void CTestView::OnDraw(CDC* pDC)
{
      CTestDoc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      CFont font;
    font.CreatePointFont(300,"华文行楷");
   CFont *poldfont=pDC->SelectObject(&font);
   TEXTMETRIC tm;
   pDC->GetTextMetrics(&tm) ;
   pDC->TextOut(0,0,m_zhiye);
   pDC->TextOut(0,tm.tmHeight,m_strworkaddr);
   pDC->TextOut(0,tm.tmHeight*2,m_aihao);
   pDC->TextOut(0,tm.tmHeight*3,m_xinzhi);
   pDC->SelectObject(poldfont);
}

你可能感兴趣的:(编程,exception,list,Class,initialization)