2013-04-23 42 views
0

我试图在CStatusBar中添加到CSliderCtrl。对于这个 - 创建CSliderCtrl中的CMainFrame 类 - 在CMainFrame::OnCreate()添加的代码创建状态栏和滑动条控制,在MFC应用程序的CStatusBar中添加CSliderCtrl

bStatus = m_ZoomSlider.Create(
    WS_CHILD | WS_VISIBLE, 
    CRect(0, 0, 100, 30), 
    &m_StatusBar, 
    56666); 

事情做工精细。

现在我希望此滑块位于状态栏的右侧。为此,我在状态栏中添加了一个INDICATOR,我试图获取这个指标的矩形并将滑块放在该矩形上。

CRect rectSlider; 
m_StatusBar.GetItemRect(1, &rectSlider); 
bStatus = m_ZoomSlider.Create(
    WS_CHILD | WS_VISIBLE, 
    rectSlider, 
    &m_StatusBar, 
    56666); 

在这里,rectSlider具有负值,导致滑块不可见。

我需要知道这是做这件事的正确方法。任何建议的建议将会非常有帮助。

我使用Visual Studio 2005

+0

我有同样的问题。你有没有找到解决办法? – Boris 2015-05-27 17:46:37

回答

0

您应该使用GetRect而非GetItemRect,我觉得不能显示

0

滑块控件,因为它是不是在状态栏的顶部。所以重写调整大小以正确地重新定位滑块。

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
    ... 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

    void CMainFrame::SetSliderPosition(int pos) 
    {  
     if (!m_pZoomSlider) { 
      CRect rectSlider; 
      m_wndStatusBar.GetItemRect(1, &rectSlider); 
       rectSlider.DeflateRect(1, 1);  // 1 pixel border... 
       m_pZoomSlider = new CSliderCtrl(); 
       m_pZoomSlider->Create(WS_CHILD | WS_VISIBLE, rectSlider, &m_wndStatusBar, ID_INDICATOR_SCALE_SLIDER); 
       m_pZoomSlider->SetRange(1, 100); 
      } 

      RECT rc; 
      m_wndStatusBar.GetItemRect(pos, &rc); 
      // Reposition the slider control correctly! 
      m_pZoomSlider->SetWindowPos(&CWnd::wndTop, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0); 

    } 

    void CMainFrame::OnSize(UINT nType, int cx, int cy) 
    { 
     CFrameWnd::OnSize(nType, cx, cy); 
     SetSliderPosition(1); //index of indicator of status bar 
    } 

    BOOL CMainFrame::DestroyWindow() 
    { 
     if (m_pZoomSlider) { 
      m_pZoomSlider->DestroyWindow(); 
      delete m_pZoomSlider; 
     } 
     return CFrameWnd::DestroyWindow(); 
    } 
+0

需要说明。 – NEER 2016-07-23 07:42:31

+0

请更新答案。 – NEER 2016-07-23 07:48:46