两个例子:
1、两个按钮抓不住:新建一个从CButton派生的类,并创建一个指针变量,然后在dialog创建两个button按键的新类对象,并把各自指针指向对方。然后在新类新建一个wm_mousemove消息处理函数,用showwindow实现;
2、创建属性页(两种)并选择提示,最终把选择结果显示在窗口中:
1)创建三个属性页propertypage,并建立相应的类;
2)在菜单中添加属性表单,创建表单propertysheet类,并把三个属性页添加进去;
3)在视图中添加属性表单对应的菜单ID函数,并建立表单对象与显示;
4)各表单中添加onsetactive(哪些按钮可用),onwizardnext(下一步时判断条件),onitidialog(初始化前添加的内容)虚函数,并添加相应的内容与说明
5)在view中添加变量把对应各属性页的变量取过来,并在视图中显示textout出来。
代码:
example1:
在 CTestDlg2Dlg的OnInitDialog()中初始按钮指针,互相指向对方:
m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn=&m_btn1;
创建一个新建一个继承自button的类,并在其中添加隐藏与显示的代码
void CWeiXinBtn::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
CButton::OnMouseMove(nFlags, point);
}
example2:
propertysheet.cpp中添加三个属性页
IMPLEMENT_DYNAMIC(CPropSheet, CPropertySheet)
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);
}
propertyview中添加打开属性表单,并显示最终操作结果:
void CPropView::OnPropertysheet()
{
// TODO: 在此添加命令处理程序代码
CPropSheet propSheet(_T("维新属性表单程序"));
propSheet.SetWizardMode();
//propSheet.DoModal();
if(ID_WIZFINISH==propSheet.DoModal())
{
m_i0ccupation=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_paint;
m_bLike[3]=propSheet.m_prop2.m_swim;
m_strSalary=propSheet.m_prop3.m_strSalary;
Invalidate();
}
}
void CPropView::OnDraw(CDC* pDC)
{
CPropDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CFont font;
font.CreatePointFont(200,_T("华文行楷"));
CFont * pOldFont;
pOldFont=pDC->SelectObject(&font);
CString strTemp;
strTemp="你的职业: ";
switch(m_i0ccupation)
{
case 0:
strTemp+="程序员";
case 1:
strTemp+="系统工程师";
case 2:
strTemp+="项目经理";
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);
}
//属性页1的代码:
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;
}
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
}
//属性页2中的代码:
BOOL CProp2::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK |PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
LRESULT CProp2::OnWizardNext()
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData();
if(m_football ||m_basketball ||m_paint ||m_swim)
{
return CPropertyPage::OnWizardNext();
}
else
{
MessageBox(_T("请选择你的兴趣爱好"));
return -1;
}
}
//属性页3中的代码:
BOOL CProp3::OnSetActive()
{
// TODO: 在此添加专用代码和/或调用基类
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK |PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000元以下"));
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000~200元"));
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("2000~3000元"));
((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3000元以上"));
((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
BOOL CProp3::OnWizardFinish()
{
// TODO: 在此添加专用代码和/或调用基类
int index;
index=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_strSalary);
return CPropertyPage::OnWizardFinish();
}