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); }
相关文章推荐
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- 20170305MFC02_滚动条&数值控制&进度条
- Opencv学习_3 (Opencv读取视频 &视频进度控制 &写视频)
- Opencv学习_3 (Opencv读取视频 &视频进度控制 &写视频)
- BAP:PPP 带宽分配协议 & BACP:PPP 带宽分配控制协议--网络大典
- IM & IS 2003 Scoring System 开发进度和修正专用帖
- 一个非常漂亮的进度滚动条
- 软件开发项目进度控制浅谈
- 浏览大图时鼠标感应控制层滚动条的移动
- 软件开发项目进度控制浅谈
- JS&RE 控制图片显示大小, 弹出窗口自适应大小,自居中, 结合UBB与正则使用 By Stabx
- 如何控制横向和纵向滚动条的显隐?
- Dhtml:浏览大图时鼠标感应控制层滚动条的移动
- 如何控制Div的滚动条是否显示