【MFC入门】之五 标准控件在可视化编程中的应用之对话框通用控件

本部分共涉及八种控件

Picture控件可以做分割线使用也可以载入位图或者ICON。  Spin控件提供了一对箭头可以微调控件所表示的数值


一. Picture控件

Picture控件主要有两个用途,第一个用途是分割线 第二个用途为插入图片

分割线的使用方法:将Picture控件压扁以后Type属性设置为Frame,Color属性设置为Etched(深灰)

插入图片(Icon和Bitmap)

首先在资源文件当中点击右键选择添加资源类型,比如说Bitmap或者是Icon


然后查看ID,以便选入ID


最后在Picture控件的属性框中将Type选项中选为Bitmap或者是Icon,然后在Image选项中选择刚才加入图片的ID


Spin控件的使用

Spin控件通常与tab order位于它前面的控件成对进行使用,可以首先拖放一个编辑框控件,然后拖放一个Spin紧挨着

将Spin的属性Allignment设置为Right Align并且选中Auto buddy属性

在InitDialog中添加初始化代码,设置Spin的范围为0~100,当前位置为50

BOOL C对话框Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:  在此添加额外的初始化代码
	//-----spin----
	CSpinButtonCtrl*pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
	pSpin->SetRange(0, 100);
	pSpin->SetPos(50);
	pSpin->GetBuddy()->SetWindowText(L"5.0");
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

使用类向导添加WM_VSCROLL消息响应代码

Edit控件显示范围为0.0~10.0每次调整步长为0.1但是Spin控件只支持整数范围,所以需要进行重映射

编写代码如下

void C对话框Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)
	{
		CString strValue;
		strValue.Format(L"%3.1f", (double)nPos / 10.0);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW(strValue);
	}
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

Spin控件


实现的程序界面如下


初始化函数要写

用什么指针控制,Spin的范围,初始位置与其配合的控件的显示问题

BOOL CSpin控件的使用Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:  在此添加额外的初始化代码
	//CSpinButtonCtrl类型指针顾名思义就是控制类型
	//GetDlgItem即获得ID
	CSpinButtonCtrl*pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);
	pSpin->SetRange(0, 100);
	pSpin->SetPos(50);
	pSpin->GetBuddy()->SetWindowTextW(L"5.0");//GetBuddy指向伙伴的指针,在这里就指向了编辑框控件
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

响应方面通过类向导添加WM_VSCROLL消息的响应(相似于滚动条控件)可以联系前面的SDK编程进行几个参数的联想

void CSpin控件的使用Dlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (pScrollBar->GetDlgCtrlID() == IDC_SPIN1)//如果获得来自Spin的消息
	{
		CString strValue;
		strValue.Format(L"%3.1f", (double)nPos / 10.0);
		//CSpinButtonCtrl*顾名思义就是Spin的控制按键,按下以后通过该指针反馈到伙伴身上
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW(strValue);
	}
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

Progress控件

该控件就是一个指示百分比的控件,也就是下面的绿的,估计具体样式根据不同操作系统而定


下列贴上代码,首先是OnInitDialog的代码,就是初始化咯

BOOL C对话框通用控件Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:  在此添加额外的初始化代码
	CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
	pProg->SetRange(0, 100);
	pProg->SetPos(50);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
第二部分就是按钮的单击事件 

这是第一个按钮

void C对话框通用控件Dlg::OnBnClickedButtonStart()
{
	// TODO:  在此添加控件通知处理程序代码
	CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
	pProg->SetPos(0);
	SetTimer(2008, 100, NULL);
	/*
	SetTimer是一种API函数,位于user32.dll中。
	你想每隔一段时间执行一件事的的时候,你可以使用它。 
	使用定时器的方法比较简单,通常告诉Windows一个时间间隔,
	然后Windows以此时间间隔周期性触发程序。
	通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。
	不需要指定定时器时,可以调用对应的KillTimer函数销毁指定的时钟。
	UINT_PTR SetTimer(
	HWND hWnd, // 窗口句柄
	UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
	UINT nElapse, // 时间间隔,单位为毫秒
	TIMERPROC lpTimerFunc // 回调函数
	);
	*/
}
这是第二个

void C对话框通用控件Dlg::OnBnClickedButtonReverse()
{
	// TODO:  在此添加控件通知处理程序代码
	CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
	pProg->SetPos(100);
	SetTimer(2009, 100, NULL);
}

最后是写WM_TIMER的响应函数,对应于前面的SetTimer中的ID

void C对话框通用控件Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (nIDEvent == 2008)
	{
		CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
		pProg->SetPos(pProg->GetPos() + 1);
		if (pProg->GetPos() >=100)
		{
			KillTimer(nIDEvent);
			AfxMessageBox(L"Boom!!!!!!!!~~~");
		}
	}
	else if (nIDEvent == 2009)
	{
		CProgressCtrl*pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
		pProg->SetPos(pProg->GetPos() - 1);
		if (pProg->GetPos() == 0)
		{
			KillTimer(nIDEvent);
			AfxMessageBox(L"有错误别墨迹,赶紧改");
		}
	}
	CDialogEx::OnTimer(nIDEvent);
}

Slider控件

和滚动条控件差不多


首先在OnInitDialog中添加下列代码进行相关初始化

	CSliderCtrl*pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
	pSlider->SetRange(0, 100);
	pSlider->SetPos(50);
	CString strText1;
	strText1.Format(L"%d", pSlider->GetPos());
	SetDlgItemText(IDC_STATIC_SLIDER, strText1);
然后添加WM_HSCROLL消息

void C对话框通用控件Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (pScrollBar->GetDlgCtrlID() == IDC_SLIDER1)
	{
		CSliderCtrl*pSlider = (CSliderCtrl*)pScrollBar;
		CString strText;
		strText.Format(L"%d", pSlider->GetPos());
		SetDlgItemText(IDC_STATIC_SLIDER, strText);
	}
	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

Date Time Picker

先扔代码,后续补上图片

初始化部分

	//Date Time Control
	CDateTimeCtrl*pDT = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);
	CString formatStr = _T("'今天是:'yy'/'MM'/'dd'");
	pDT->SetFormat(formatStr);
后续报时按钮响应程序

void C对话框通用控件Dlg::OnBnClickedButtonTime()
{
	// TODO:  在此添加控件通知处理程序代码
	CDateTimeCtrl*pDT = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);
	CTime t;
	pDT->GetTime(t);
	CString s = t.Format(L"%A,%B,%d,%Y,%H:%M:%S");
	AfxMessageBox(s);
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值