首页 > 学院 > 开发设计 > 正文

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

2019-11-06 07:13:44
字体:
来源:转载
供稿:网友

进度条:

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);}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表