第八章(对话框2)

这章主要是前一章对话框的应用,利用对话框做简单的软件

逃跑按钮的实现

逃跑按钮:就是你把鼠标移向那个按钮的时候,它就会消失,出现在对话框的其他地方,总之你就是没办法点到那个按钮,这个按钮就叫逃跑按钮。

创建的基于对话框的工程

可以看到基于对话框的工程没有view类与Doc类,其中CCatchDlg就是与创建出来的对话框相关联的类了。

 

首先把对话框上一些无关的控件(例如确定,取消,静态文本)删除掉,插入我们需要的控件:

创建了2个一样的按钮,事实上逃跑按钮的原理就在于这里,2个一模一样的按钮,一开始显示一个隐藏一个,当鼠标移向显示的按钮的时候,就把显示的按钮隐藏起来,把原本隐藏的按钮显示出来,这样就实现了逃跑按钮的功能了。

 

接下来的是重点,处理消息的,上面也提到了当鼠标移向按钮,按钮消失,那么捕获的消息就应该是WM_MOUSEMOVE,而谁去捕获才是最重要的。显然不能扔CCatchDlg来响应的,那样鼠标一移动就会把按钮消失,应该由按钮本身来捕获,我们都知道,按钮是CButton类的,但是这个类是别人写好的,修改不容易,而且修改CButton类的话,以后加入再在这个对话框插入其他按钮,而插入的新按钮并不需要逃跑,但因修改了CButton类,不想逃跑也得逃了,所以修改CButton类是不明智的。我们只是想令那2个按钮有捕获WM_MOUSEMOVE的能力,那么就令这2个按钮与派生于CButton类的新类CNewButton关联起来,在CNewButton类中添加捕获响应函数。

在类向导中选添加类,基类写CButton,建立新类CNewButton类。之后把按钮添加变量,变量的类型就是CNewButton类:

这样子,m_btn1,m_btn2分别就代表了那2个按钮了,而这个按钮是CNewButton类的。

 

添加捕获消息函数:添加WM_MOUSEMOVE消息响应函数

捕获到鼠标移动,调用ShowWindow(SW_HIDE);就能把当前按钮给隐藏起来,但是如何把另一个按钮显示出来呢。在CNewButton类中加一个CNewButton *pNext指针指向另一个按钮,利用pNext->ShowWindow(SW_SHOW);就能把另一个按钮显示出来。在哪里设置pNext指针好呢,CNewButton的构造函数是肯定不行的,它不知道m_btn1,m_btn2这些变量,知道这些变量的只有CCatchDlg类,应该在这个类里的OnInitDialog()里设置。

这样就能在CNewButton的鼠标移动响应函数中通过m_pNext来找到需要显示的按钮了。

 

void CNewButton::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	ShowWindow(SW_HIDE);
	m_pNext->ShowWindow(SW_SHOW);
	CButton::OnMouseMove(nFlags, point);
}

这样当鼠标移向CNewButton类的m_btn1或者m_btn2的时候,就会调用这个函数来响应,把当前的按钮隐藏,把m_pNext指向的按钮显示,实现了逃跑的功能,最后记得设置一下最初的时候一个按钮是显示的一个是隐藏的:

 

 

 

/属性表单与向导
这就是一个属性表单,其中红框中命令,消息,虚函数这些是这个表单的一个属性页,可以看出属性表单就是由属性页构成,属性页的类就是CPropertyPage类,它是CDialog的派生类,所以,事实上,属性页也是一个对话框(只是在对话框的基础上设置了一些属性,其实创建一个CDialog类的对话框,设置一下也能变成属性页) 

 

向导的创建就在属性表单的DoModal()函数之前调用CPropertySheet的SetWizardMode()函数,那么这个属性表单就会变成向导了。

创建属性页的时候资源选择:

这些就是创建属性页的

 

下面是我做的一个属性页:

Caption改为Page1,还有用到了Group Box和Radio Button2个控件

其中Group Box的作用与静态文本差不多,只是显示个框,把同类型的框起来这样而已。再来看Radio Button控件,单选按钮,众所周知,单选是在一群选择中选一个,那么如果我对属性页有2个单选按钮群,一个群只能选一个,怎样区分这些群呢,靠的的就是Radio Button中的Group属性,Group一般设置为false,一个群的第一个设置为true,后面false的就是与这个true同属一个群的,按照Tab顺序直至遇到下一个Group属性为true的按钮这个群就结束了(当然最后那个true的按钮是下一个群的开头),如果把群头的按钮关联变量(只有int型的变量能关联),那么这个int的变量保存的就是你选的第几个,int变量为0,你选的是群头第一个,为1则选了Tab顺序群头的后面一个,如此类推。

 

 

接着再介绍其他一些控件:

这是我做的第二个属性页,圈中的是Combo Box控件,这个控件的Type属性有3个选项,

Simple属性就会变成简单的编辑框,Dropdown属性还是会有下拉的效果,但是同样是可以像编辑框那样输入,最后就是Drop List属性,就是我选用的属性,下拉效果加不可编辑,最普遍的使用方式了吧,还有个问题,它的选项怎么添加上去,与按钮相关联的是CButton类,与Combo Box相关联的的是CComboBox类,这个类有AddString函数来添加CString作为选项,还有SetCursel函数来设置默认选项(参数是int ,为默认选项的索引),还有GetCursel函数来获取当前选项的索引,还有GetLbText(索引,用来存选项的CString)来获取选项信息,取消了Combo Box的Sort属性,AddString添加顺序就是索引了。

BOOL CProp2::OnInitDialog()//在这个函数来插入选项内容
{
	CPropertyPage::OnInitDialog();

	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("2月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("4月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("5月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("6月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("7月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("8月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("9月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("10月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("11月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("12月"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
	return TRUE;  // return TRUE unless you set the focus to a control

}
BOOL CProp2::OnWizardFinish()//在按完成的时候调用该函数来获取Combo Box选的选项内容
{
	// TODO: 在此添加专用代码和/或调用基类
	
	int index=((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();
	((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index,m_month);
	return CPropertyPage::OnWizardFinish();
}



 

2个属性页都处理好,就要订装起来组成一个属性表单,新建一个CPropertySheet类的派生类CPropSheet,在它的构造函数中把刚才那两个属性页所关联的类加进来

CPropSheet::CPropSheet(void)//用AddPage函数来插入属性页
{
	AddPage(&m_prop1);//m_prop1是CProp1类,这个类派生于CPropertyPage类
	AddPage(&m_prop2);
}


 到此为止,我们运行就能出现一个属性表单,并且每个属性页所作的选择都有变量记录下来,例如prop1这种属性页,有个int型变量与Radio Button关联,它保存的就是选的第几个,再来prop2这种属性页,有个CString类的变量,通过CComboBox类的GetLBText()函数来获取你所选的字符串。那么就能利用这些变量来处理选择结果了。

例如按完向导的Finish按钮之后,希望在view的窗口输出结果:

void C心理测试View::OnTest()
{
	// TODO: 在此添加命令处理程序代码
	CPropSheet propsheet;
	propsheet.SetWizardMode();
	if(propsheet.DoModal()==ID_WIZFINISH)
	{
		m_color=propsheet.m_prop1.m_color;//用view类的m_color保存prop1的m_color
		m_month=propsheet.m_prop2.m_month;
		Invalidate();//使view类调用Ondraw函数来重绘Client区
	}
}
在Ondraw()函数中:
CString temp=_T("你选的颜色为:");
	switch(m_color)
	{
	case 0:temp+=_T("红色,你是很警戒的人,你的一生中充满了爱");break;
	case 1:temp+=_T("黑色,你很保守,但很自负");break;
	case 2:temp+=_T("蓝色,你是个八爪鱼,同时爱很多人,而且你喜欢你的爱人的吻和爱");break;
	case 3:temp+=_T("绿色,你的灵魂很散懒,而且你是个比较放松的人");break;
	default:
		break;
	}
	pDC->TextOutW(0,0,temp);
	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);
	temp=_T("你选的月份:");
	temp+=m_month;
	pDC->TextOutW(0,tm.tmHeight,temp);
	if(m_month==_T("1月") || m_month==_T("2月") || m_month==_T("3月"))
	{
		pDC->TextOutW(0,2*tm.tmHeight,_T("今年你会很走运,而且你会发现你会以外的爱上一个人"));
	}
	else if(m_month==_T("4月") || m_month==_T("5月") || m_month==_T("6月"))
	{
		pDC->TextOutW(0,2*tm.tmHeight,_T("你会有个很强的爱情,这段感情不会很长,但那美好的回忆会让你永生不忘"));
	}
	else if(m_month==_T("7月") || m_month==_T("8月") || m_month==_T("9月"))
	{
		pDC->TextOutW(0,2*tm.tmHeight,_T("你会有个很快乐的一年且会经历一个在你一生中好的,很大的改变"));
	}
	else if(m_month==_T("10月") || m_month==_T("11月") || m_month==_T("12月"))
	{
		pDC->TextOutW(0,2*tm.tmHeight,_T("你的爱情不会很好,但最终你会找到你一生的伴侣"));
	}



这样一个心理测试就做好了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值