选择一个基于对话框的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);
}