孙鑫视频教程第八课——对话框(二)

  

            逃跑按钮的巧妙实现。如何制作属性页对话框和向导对话框,融合讲解组合框(如何调整组合框的大小)、列表框、单选按钮、复选按钮等常用对话框控件的多种使用方法。如何限制用户在不满足设定的条件时切换到其他属性页和向导页。

1.逃跑按钮的巧妙实现:在一个基于对话框的文档上,当你点击一个按钮的时候,把另一个按钮就隐藏起来,这样就可以实现了好像按钮逃跑的功能!其代码主要如下:

void CWeiXinBtn::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
       ShowWindow(SW_HIDE);//先让一个窗口隐藏
	m_pbtn->ShowWindow(SW_SHOW);//再显示另一个窗口
       CButton::OnMouseMove(nFlags, point);
}

CWeixinBtn 是一个从CButton中派生出来的类,由这个类来捕获鼠标移动的消息响应函数功能!还需要给两个按钮添加两个关联变量,类型为CWeixinBtn,主要是贮存其按钮的地址,交换地址!地址的交换在对话框的oninitdialog中完成!

2.属性表单的创建:

其步骤主要如下:

a.首先在资源中添加三个属性页资源,并在上面添加一些控件:如静态文本框,组合框,列表框等等控件!

b.为属性页新建三个类,它们的基类都是:cpropertysheet

c.创建一个属性表单,用函数addpage()将属性页添加到属性表单中去!

d.最后在view类中显示出表单就可以!

CPropSheet::CPropSheet(void)
{
	AddPage(&m_prop1);//将属性页添加到表单中!
	AddPage(&m_prop2);
	AddPage(&m_prop3);
}
void CID084View::OnPropertysheet()//通过菜单的消息响应函数来实现!
{
	CPropSheet propsheet;//定义一个对象
	propsheet.DoModal();//对象去创建一个对话框!
}


 

3.向导的创建:向导的创建只要在属性表单的创建过程之中加上函数setwizardmode()即可!代码如下:

void CID084View::OnPropertysheet()
{
	// TODO: 在此添加命令处理程序代码
	CPropSheet propsheet;//定义一个对象
	propsheet.SetWizardMode();//创建一个向导
	propsheet.DoModal();//对象去创建一个对话框!
}

4.对向导对话框上面的按钮的修改:在第一页中只有向下的按钮,而在第二页中有向上和向下的按钮,在第三页中有向上和完成的按钮!这就需要在三个类中添加虚函数onsetactive(),在函数中的代码为如下:

BOOL CProp1::OnSetActive()
{
	((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);//在第一页中设置只有向下的按钮!

	return CPropertyPage::OnSetActive();
}
BOOL CProp2::OnSetActive()
{
	((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);//在第二页中设置向上和向下按钮!
	return CPropertyPage::OnSetActive();
}
BOOL CProp3::OnSetActive()
{
       ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);//在第三页设置向上和完成按钮!
	return CPropertyPage::OnSetActive();
}


5.对向导中的选项的修改(即是有了选择才可以向下进行):

a.对第一页面的修改:

LRESULT CProp1::OnWizardNext()
{
	// TODO: 在此添加专用代码和/或调用基类
	UpdateData();//当一个控件中关联有值的时候,一定要记得调用这个函数才可以更新值!
    if (m_occupation == -1)//对单选按钮的判断
	{
		MessageBox(TEXT("请选择你的职业!"));
		return -1;//防止页面的改变
	}
	if (m_workAddr == "")//对列表框的判断
	{
		MessageBox(TEXT("请选择你的工作地址!"));
		return -1;
	}
	return CPropertyPage::OnWizardNext();
}
BOOL CProp1::OnInitDialog()
{
	CPropertyPage::OnInitDialog();

	// TODO:  在此添加额外的初始化
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("北京"));//在列表框中添加一些选项!
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("上海"));
	((CListBox*)GetDlgItem(IDC_LIST1))->AddString(TEXT("天津"));

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

b.对第二页面的修改:

LRESULT CProp2::OnWizardNext()
{
	// TODO: 在此添加专用代码和/或调用基类
	UpdateData();
    if (m_football || m_basketball || m_volleyball || m_swim)//对第二个页面的判断
	{
		return CPropertyPage::OnWizardNext();
	}
	else
	{
		MessageBox(TEXT("请选择你的兴趣爱好!"));
		return -1;
	}
}


c.对第三页面的修改:

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

	// TODO:  在此添加额外的初始化
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("1000元以下"));//向组合框中添加内容
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("1000--2000元"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("2000--3000元"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(TEXT("3000元以上"));
	((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);//将第一个选项为默认选项
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}


6.将向导中所选择的内容在view类中显示出来:

a.首先是对第三页所选的内容的获取:

BOOL CProp3::OnWizardFinish()
{
	// TODO: 在此添加专用代码和/或调用基类
    int index;
	index = ((CComboBox*)GetDlgItem(IDC_COMBO1))->GetCurSel();//从组合框中取得索引值
	((CComboBox*)GetDlgItem(IDC_COMBO1))->GetLBText(index, m_strSalary);//传递索引值,将结果放到变量m_strSalary中!
	return CPropertyPage::OnWizardFinish();
}


b.然后是对第一,第二页面的内容的获取:需要在view类中定义相对应的变量来储存所选的内容

void CID084View::OnPropertysheet()
{
	// TODO: 在此添加命令处理程序代码
	CPropSheet propsheet;//定义一个对象
	propsheet.SetWizardMode();//创建一个向导
	if (ID_WIZFINISH == propsheet.DoModal())//对象去创建一个对话框!判断是否点击完成按钮!
	{
		m_ioccupation = propsheet.m_prop1.m_occupation;//在view类中接受在表单中所选择的内容!
		m_strwork = propsheet.m_prop1.m_workAddr;
		m_strSalary = propsheet.m_prop3.m_strSalary;
		m_bLike[0] = propsheet.m_prop2.m_football;
		m_bLike[1] = propsheet.m_prop2.m_basketball;
		m_bLike[2] = propsheet.m_prop2.m_volleyball;
		m_bLike[3] = propsheet.m_prop2.m_swim;
		Invalidate();//让窗口无效,引起窗口的重绘
	}
}


c.最后在view类中的ondraw()函数中完成输出功能:

void CID084View::OnDraw(CDC* pDC)
{
	CID084Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CFont font;
	font.CreatePointFont(200, TEXT("宋体"));

	CFont *pOldFont;
	pOldFont = pDC->SelectObject(&font);

	CString strtemp;
	strtemp = TEXT("你的职业是:");
    //显示第一页的所选内容
	switch(m_ioccupation)
	{
	case 0:
		strtemp += "程序员";
		break;
	case 1:
		strtemp += "系统工程师";
		break;
	case 2:
		strtemp += "项目经理";
		break;
	default:
		break;
	}
	pDC->TextOutW(0, 0, strtemp);

	strtemp = TEXT("你的工作地址是:");
	strtemp += m_strwork;

	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);

	pDC->TextOutW(0, tm.tmHeight, strtemp);
	//显示第二页面的内容
    strtemp = TEXT("你的兴趣爱好是:");
	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 = TEXT("你的薪资水平是:");
	strtemp += m_strSalary;
	pDC->TextOutW(0, tm.tmHeight * 3, strtemp);

	pDC->SelectObject(pOldFont);
}





 

你可能感兴趣的:(MFC,list,工作,文档)