首先,在哪里捕获鼠标移动的消息?肯定不能是CTestDlg类中,否则以移动到对话框上,就会显示或者隐藏按钮了。我们可以创建一个从CButton派生来的新类CNewButton,使用classWizard来完成;然后将按钮控件与这种新类相关联。在这两个按钮上点击右键,使用类向导添加CNewButton类的变量m_btn1,m_btn2.我们需要在CTestDlg类的头文件中包含:#include "NewButton.h"。下面让CNewButton捕获鼠标移动消息。为这个类添加WM_MOUSEMOVE的消息响应函数,在其中调用ShowWindow,参数选择SW_SHOW来显示一个窗口,SW_HIDE来隐藏一个窗口。但是,我们要隐藏自己时,也得显示另外一个窗口,所以我们需要为我们的CTestDlg添加一个成员变量,这个变量中有一个指向CNewButton的指针,里面保存的是另一个按钮的地址。这个初始化工作在OnInitDialog中添加:
m_btn1.m_pBtn = &m_btn2; m_btn2.m_pBtn = &m_btn1;
void CNewButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ShowWindow(SW_HIDE); m_pBtn->ShowWindow(SW_SHOW); CButton::OnMouseMove(nFlags, point); }
void CPropView::OnPropertysheet() { // TODO: Add your command handler code here CPropSheet propSheet("微信"); propSheet.DoModal(); }
BOOL CProp1::OnSetActive() { // TODO: Add your specialized code here and/or call the base class ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); }注意,通过GetParent获取基类指针以后,应将它们转化为CPropertySheet*类型。
LRESULT CProp1::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class //获取值的时候需要使用这个函数 UpdateData(); if(-1 == m_occupation) { MessageBox("请选择一个职业!"); return -1; } else return CPropertyPage::OnWizardNext(); }
BOOL CProp1::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 }与列表框对应的类是CListBox,通过它的AddString函数来增加选项。然后进行判断,同样的,我们需要将它和CString类型的成员变量m_workAddr关联起来:
if("" == m_workAddr) { MessageBox("请选择一个工作地点!"); return -1; }
LRESULT CProp2::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class UpdateData(); if(m_basketball | m_football | m_volleyball | m_swim) { return CPropertyPage::OnWizardNext(); } else { MessageBox("请选择一个爱好!"); return -1; } }下面我们处理第3页。与第1页的列表框相似,与组合框相对应的类是CComboBox,通过AddString函数来添加下拉列表的成员:
BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here ((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元以上"); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
BOOL CProp3::OnWizardFinish() { // TODO: Add your specialized code here and/or call the base class int index; index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel(); ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_strSalary); return CPropertyPage::OnWizardFinish(); }
int m_iOccupation; CString m_strWorkAddr; BOOL m_bLie[4]; CString m_strSalary;
CCH_8_PROPView::CCH_8_PROPView() { // TODO: add construction code here m_iOccupation = -1; m_strWorkAddr = ""; memset(m_bLike,0,sizeof(m_bLike)); m_strSalary = ""; }
void CCH_8_PROPView::OnPropertysheet() { // TODO: Add your command handler code here CPropSheet propSHeet("属性表单"); 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[0] = propSHeet.m_prop2.m_basketball; m_bLike[0] = propSHeet.m_prop2.m_volleyball; m_bLike[0] = propSHeet.m_prop2.m_swim; m_strSalary = propSHeet.m_prop3.m_strSalary; Invalidate(); } }
void CCH_8_PROPView::OnDraw(CDC* pDC) { CCH_8_PROPDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CString strtmp; strtmp = "你的职业:"; switch(m_iOccupation) { case 0: strtmp += "程序员"; break; case 1: strtmp += "系统工程师"; break; case 2: strtmp += "项目经理"; break; default: break; } pDC->TextOut(0,0,strtmp); strtmp = "你的工作地点:"; strtmp += m_strWorkAddr; TEXTMETRIC tm; pDC->GetTextMetrics (&tm); pDC->TextOut(0,tm.tmHeight, strtmp); strtmp = "你的兴趣爱好:"; if(m_bLike[0]) strtmp += "足球"; if(m_bLike[1]) strtmp += "篮球"; if(m_bLike[2]) strtmp += "排球"; if(m_bLike[3]) strtmp += "游泳"; pDC->TextOut(0,tm.tmHeight*2, strtmp); strtmp = "你的薪资水平:"; strtmp += m_strSalary; pDC->TextOut(0,tm.tmHeight*3, strtmp); }