滚动条,在debug和release下运行结果不一样
h文件里
INT m_nVscroll_;
CBCGPScrollBar m_scroll_bar_;
cpp文件里:
BOOL CDlgXXX::OnInitDialog() { CBCGPDialog::OnInitDialog(); SCROLLINFO si; si.cbSize = sizeof (SCROLLINFO); si.nMin = 0; si.nMax = 100; si.nPage = 5; si.nPos = 0; //必须初始化,否则release下默认为16 si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE; m_scroll_bar_.SetScrollInfo(&si, TRUE); CRect rtClient; GetClientRect(rtClient); m_rt_vScroll_ = rtClient; m_rt_vScroll_.left = rtClient.right - 10; m_scroll_bar_.MoveWindow(&m_rt_vScroll_); //滚动条所在的位置 InitUI(0); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | void CDlgXXX::InitUI( int yScroll) { const int BTN_WIDTH = 82; const int TITLE_WIDTH = 50; const int TITLE_HEIGHT = 25; const int SPACE = 5; const int LEFT_SPACE = 40 + 20; //分割线' CRect rtClient; GetClientRect(rtClient); CRect rtCtrl; rtCtrl.left = LEFT_SPACE - 20; rtCtrl.right = rtCtrl.left + 1; rtCtrl.top = yScroll; rtCtrl.bottom = rtCtrl.top + rtClient.bottom + 800; m_st_vline0_.MoveWindow(&rtCtrl); //左侧线 rtCtrl.right = rtClient.right; rtCtrl.left = rtCtrl.right - 1; rtCtrl.top = yScroll; rtCtrl.bottom = rtClient.bottom + yScroll + 800; m_st_vline1_.MoveWindow(&rtCtrl); //右侧线 int iPosX = LEFT_SPACE; int iPosY = SPACE * 3 + yScroll; //这里注意相对位置yScroll m_st_title_.SetWindowPos(NULL, iPosX, iPosY, TITLE_WIDTH * 2, 30, SWP_NOZORDER); iPosY += 30 + SPACE; int iLineWidth = rtClient.Width(); m_st_hline1_.SetWindowPos(NULL, LEFT_SPACE - 20, iPosY, iLineWidth, 1, SWP_NOZORDER); //墙 iPosY += SPACE * 3; m_title_wall_.SetWindowPos(NULL, iPosX, iPosY, TITLE_WIDTH, TITLE_HEIGHT, SWP_NOZORDER); iPosY += TITLE_HEIGHT; m_btn_wall_.SetWindowPos(NULL, iPosX, iPosY, BTN_WIDTH, BTN_WIDTH, SWP_NOZORDER); iPosX += BTN_WIDTH + 3; m_btn_room_.SetWindowPos(NULL, iPosX, iPosY, BTN_WIDTH, BTN_WIDTH, SWP_NOZORDER); iPosX += BTN_WIDTH + 3; m_btn_region_.SetWindowPos(NULL, iPosX, iPosY, BTN_WIDTH, BTN_WIDTH, SWP_NOZORDER); } void CDlgXXX::OnSize( UINT nType, int cx, int cy) { CBCGPDialog::OnSize(nType, cx, cy); if (CMainFrame::gThis != NULL && m_scroll_bar_.m_hWnd != NULL) { BOOL b1 = CMainFrame::gThis->IsZoomed(); if (!b1) { CRect rtClient; GetClientRect(rtClient); m_rt_vScroll_ = rtClient; m_rt_vScroll_.left = rtClient.right - 10; m_scroll_bar_.MoveWindow(&m_rt_vScroll_); m_scroll_bar_.SetScrollRange(0, 250); } m_scroll_bar_.ShowWindow(FALSE); } int sy= -m_nVscroll_; if (m_st_vline0_.m_hWnd) { InitUI(sy); } } |
滚动条的相应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | void CDlgXXX::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { SCROLLINFO si; si.cbSize = sizeof (si); m_scroll_bar_.GetScrollInfo(&si, SIF_POS | SIF_PAGE | SIF_RANGE); m_nVscroll_ = si.nPos; switch (nSBCode) { case SB_LINEDOWN: { m_nVscroll_ += 20; if (m_nVscroll_ > (si.nMax - si.nMin - si.nPage )) { m_nVscroll_ = si.nMax - si.nMin - si.nPage; } } break ; case SB_LINEUP: { m_nVscroll_ -= 20; if (m_nVscroll_ < si.nMin) { m_nVscroll_ = 0; } } break ; case SB_PAGEDOWN: { m_nVscroll_ += 8 * si.nPage; if (m_nVscroll_ > (si.nMax - si.nMin - si.nPage)) { m_nVscroll_ = si.nMax - si.nMin - si.nPage; } } break ; case SB_PAGEUP: { m_nVscroll_ -= 8 * si.nPage; if (m_nVscroll_ < si.nMin) { m_nVscroll_ = 0; } } break ; case SB_THUMBTRACK: { m_nVscroll_ = nPos; } break ; } if (si.nPos != m_nVscroll_) { ScrollWindow(0, -(m_nVscroll_ - si.nPos), NULL ,NULL); } si.nPos = m_nVscroll_; m_scroll_bar_.SetScrollInfo(&si, TRUE); CBCGPDialog::OnVScroll(nSBCode, nPos, pScrollBar); } BOOL CDlgXXX::OnMouseWheel( UINT nFlags, short zDelta, CPoint pt) { //向下滚 if (zDelta == -120) { m_nVscroll_ += 10; OnVScroll(SB_PAGEDOWN, m_nVscroll_, &m_scroll_bar_); } else if (zDelta == 120) { m_nVscroll_ -= 10; OnVScroll(SB_PAGEUP, m_nVscroll_, &m_scroll_bar_); } return CBCGPDialog::OnMouseWheel(nFlags, zDelta, pt); } |
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现