Dr.Wing

心翼的技术笔记本

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、对于同一个类,可以定义多个这个类的对象;然后再定义一个该类的指针,这样,这些对象都可以调用这个指针,实现首地址互换的操作。

一个类定义了两个对象:

CNewBtn m_btn1;
CNewBtn m_btn2;

然后定义一个指针变量:

public:
	CNewBtn* m_pBtn;

然后在构造函数中互换首地址:

m_btn1.m_pBtn=&m_btn2;
m_btn2.m_pBtn
=&m_btn1;

然后在这个类中,写上响应的函数如下,本例实现的是一个“逃跑按钮的功能”:

void CNewBtn::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
ShowWindow(SW_HIDE);
m_pBtn
->ShowWindow(SW_SHOWNORMAL);
CButton::OnMouseMove(nFlags, point);
}

注意上述代码中,ShowWindow()函数是一开始的这个对象,然后用指针调用的,是首地址另外一个对象的,以此实现了“互换”

//-------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------------------//

创建一个属性页的流程总结:

1、新增一些资源,如下图所示,三者任意一个均可:

2、然后可以就添加的这些对话框,进行控件的摆放或者编辑,就是设计窗体:

3、注意这几个对话框,依旧需要建立它们的类,然后定义各自的对象。而各自的对象,应该建立在CPropertySheet这个类中。这里我们可以建立一个新类,如CPropSheet,集成基类CPropertySheet类,然后在这个类里面,即可定义三个属性对话框的对象如下:

class CPropSheet : public CPropertySheet  //注意新建的这个类继承于CPropertySheet 
{
DECLARE_DYNAMIC(CPropSheet)
public:
CProp1 m_prop1;
CProp2 m_prop2;
CProp3 m_prop3;

4、然后就可以在这个新类的构造函数中,调用CPropertySheet这个类的成员函数AddPage添加这些属性页进去了,注意前后顺序:

CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(
&m_prop1);
AddPage(
&m_prop2);
AddPage(
&m_prop3);
}

5、最后,我们就可以在如菜单响应、或者按钮事件中,可以显示出这个“属性页”了。如下所示:

void Cself_7Dlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
CPropSheet pro(_T("路网属性绘制向导"));
pro.DoModal();

//-------------------------------------------------分割线-----------------------------------------------//

属性页一般设置来是为了要建立一个向导。就类似于我们新建一个MFC APPWIZERD 所看到的向导一样。

建立向导一般比较简单,就需要在上面我们建好的属性页面里面,在它DoModal以前,调用SetWizardMode()函数即可,如下所示:

void Cself_7Dlg::OnBnClickedButton3()
{
// TODO: Add your control notification handler code here
CPropSheet pro(_T("路网属性绘制向导"));
pro.SetWizardMode();
pro.DoModal();
}

在创建的向导里面,诸如第一页不应该有“上一步”,最后一页的“下一步”应该写“完成”这些特殊要求,所以,我们需要在相关的属性页的类里面(哪个属性页要改,就改哪个属性页的类)来重载它的OnSetActive()函数,在其中对SetWizardButtons进行编辑,如下所示:

//这里是设置第一页,只有下一步按钮,没有上一步
BOOL CProp1::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
//这里是设置第二页,既有上一步,也有下一步
BOOL CProp2::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
//这里是设置最后一页,只有完成,而不是下一步
BOOL CProp3::OnSetActive()
{
// TODO: Add your specialized code here and/or call the base class
((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}

这里请注意一种语法的写作,这也是这几个控件添加数据的方式,如下:

((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_FINISH);

((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("西直门"));

  ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("<500"));

//-------------------------------------------------分割线-----------------------------------------------//


下面注意两种控件的使用:

①、RadioBox控件

如有5个RadioBox,那么一般把第一个的Group设置为TURE,然后给其绑定一个int变量,并将这个int变量在构造函数中赋值为-1那么,往后的按钮点击中,第一个是0,第二个是1,第三个是2,第四个是3,第五个是4(是有点啰嗦了~)。设置为TRUE的那一项,最后会一直沿着TAB的顺序,直到遇到另一个Group属性也是TRUE的控件为止。


②、ComboBOX控件

首先,是这个控件在添加数据项时候的写法,如下所示:

BOOL CProp3::OnInitDialog()
{
CPropertyPage::OnInitDialog();

// TODO: Add extra initialization here

((CComboBox
*)GetDlgItem(IDC_COMBO1))->AddString(_T("<500"));
((CComboBox
*)GetDlgItem(IDC_COMBO1))->AddString(_T("500<X<800"));
((CComboBox
*)GetDlgItem(IDC_COMBO1))->AddString(_T("800<X<1000"));
((CComboBox
*)GetDlgItem(IDC_COMBO1))->AddString(_T(">1000"));

((CComboBox
*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

2、获取目前的索引,及获取选中的字符串变量

BOOL CProp3::OnWizardFinish()
{
// TODO: Add your specialized code here and/or call the base class
int index;
index
=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel(); //用GetCurSel获取选中的项的索引
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_Drawsize);//用GetLBText获取index这个索引下的字符串
return CPropertyPage::OnWizardFinish();
}
posted on 2011-08-04 18:07  心翼  阅读(686)  评论(0编辑  收藏  举报