您的位置:首页 > 编程语言

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

2017-03-05 15:01 106 查看

滚动条:

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 mfc