20170305MFC02_滚动条&数值控制&进度条

滚动条:

1:进度条默认的处理都是鼠标拖动消息,所以拖动后还是会还原到原来的位置。我们需要通过代码的方式来实现。

2:所有的控件都应该分成三个层次来看待:

    1:Windows消息:

    2:我们发给Windows的消息:

    3:MFC里面封装成的类:


3:滚动条必须要设置前置信息告诉滚动条的各个参数。

//在对话框初始化函数里面添加:
	SCROLLINFO scrollinfo = { 0 };//控制滚动条的结构体。
	scrollinfo.cbSize = sizeof(SCROLLINFO);
	scrollinfo.fMask = SIF_RANGE | SIF_PAGE;
	scrollinfo.nMin = 0;
	scrollinfo.nMax = 100;
	scrollinfo.nPage = 10;
	m_scroll.SetScrollInfo(&scrollinfo);
//进度条处理函数
void CScorllBarDemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{								//		控件发生的消息,
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	SCROLLINFO scrollinfo = { 0 };
	scrollinfo.cbSize = sizeof(SCROLLINFO);
	scrollinfo.fMask = SIF_ALL;
	pScrollBar->GetScrollInfo(&scrollinfo);//这个结构体是随时根据情况变化的。
	int nNewPos = scrollinfo.nPos;
	switch (nSBCode)
	{
	case SB_THUMBTRACK://用户拖动消息
		nNewPos = nPos;
		break;
	case SB_LINELEFT://点击左边按钮
		nNewPos -= 1;
		break;
	case SB_LINERIGHT://点击右边按钮
		nNewPos += 1;
		break;
	case SB_PAGELEFT://点击左边进度条区域
		nNewPos -= scrollinfo.nPage;
		break;
	case SB_PAGERIGHT://点击右边进度条区域
		nNewPos += scrollinfo.nPage;
		break;
	default:
		break;
	}
	if (nNewPos > scrollinfo.nMax)
		nNewPos = scrollinfo.nMax;
	else if (nNewPos < 0)
		nNewPos = 0;
	scrollinfo.nPos = nNewPos;
	pScrollBar->SetScrollInfo(&scrollinfo);
	CString strOutput;
	strOutput.Format(L"当前位置:%d",nNewPos);
	SetDlgItemTextW(IDC_STATIC_POS, strOutput);
	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

数值控制:

1:应该先拖入 EditControl,再拖入SpinControl,或者将两者拖入后,使用Ctrl+D设置Tab顺序,使EditControl的比SpinControl的小一个即可。

2:将SpinControl的属性里面的Auto Buddy和Set Buddy Integer都设置成True,就可以实现点击+-1了。

3:如果难以实现对齐,可以将SpinControl属性的Alignment设置成Left或者Right Align。

	//在对话框初始化函数添加:
	CSpinButtonCtrl *pSpinDec = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_DEC);
	pSpinDec->SetRange32(0, 100);//设置范围,这个函数出生比较早,建议使用32版本
	CSpinButtonCtrl *pSpinHex = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_HEX);
	pSpinHex->SetRange32(0, 100);
	pSpinHex->SetBase(16);//设置成16进制

进度条:

1:默认有范围,但是也可以在对话框初始化函数里面进行设置。
//对话框初始化函数里面添加:
	m_progress.SetRange32(0, 10);
void CProgressDemoDlg::OnBnClickedBtnBegin()
{
	// TODO:  在此添加控件通知处理程序代码
	SetTimer(1, 100, nullptr);
	GetDlgItem(IDC_BTN_BEGIN)->EnableWindow(FALSE);
	//程序量很大、商业化编程,尽量很少yongTime,他会使之变的很卡。他走的是消息机制,而且时间不准。
	/*int nMin, nMax, nPos;
	m_progress.GetRange(nMin, nMax);
	for (; nMin <= nMax; ++nMin)//如果这个for循环需要执行很长时间,那么整个线程都会可在这里,界面就会无法移动。
	{
		m_progress.SetPos(nMin);
		Sleep(100);
	}*/
}

void CProgressDemoDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	int nMin, nMax, nPos;
	m_progress.GetRange(nMin, nMax);
	nPos = m_progress.GetPos();
	nPos++;
	if (nPos > nMax)
	{
		KillTimer(1);
		nPos = 0;
		GetDlgItem(IDC_BTN_BEGIN)->EnableWindow(TRUE);
	}
	m_progress.SetPos(nPos);
	CDialogEx::OnTimer(nIDEvent);
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC中,如果想要实现进度条的循环滚动效果,首先我们需要创建一个进度条控件并进行初始化。在初始化的过程中,我们需要设置进度条的范围和初始值,以及样式等。 接下来,我们可以通过使用一个定时器来控制进度条的滚动效果。在定时器的回调函数中,我们可以通过改变进度条的当前值来实现滚动的效果。我们可以通过增加或减少当前值,来控制进度条的滚动方向和速度。如果当前值达到了进度条的最大值(或最小值),我们可以将当前值重新设置为进度条的最小值(或最大值),以实现循环滚动的效果。 此外,我们还可以添加一些额外的功能来增强进度条的效果。例如,可以在进度条显示文本信息,以提供更多的用户反馈。我们可以通过设置进度条的文本格式和文本内容来实现这一功能。 在程序的其他部分,我们可以根据需要来控制进度条的开始和停止。例如,在某个按钮的点击事件中,我们可以启动或停止进度条的滚动。在启动进度条滚动之前,我们需要启动定时器,并设置定时器的回调函数。而在停止进度条滚动时,我们需要停止定时器。 总而言之,通过在MFC中创建进度条控件,并结合定时器和其他相关功能,我们可以实现一个循环滚动的进度条效果。这样的效果可以提供实时的进度信息给用户,并增加程序的交互性和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值