0

に追加しようとしてCSliderCtrlCStatusBarます。このために - CMainFrame クラスに CSliderCtrl を作成しました -CMainFrame::OnCreate()ステータスバーとスライダー バー コントロールを作成するためのコードを追加しました。

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

物事はうまくいっています。

ここで、このスライダーをステータス バーの右側に配置します。このために、ステータスバーにインジケーターを追加しました。このインジケーターの四角形を取得し、その四角形の上にスライダーを配置しようとしています。

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

ここでは、rectSlider が負の値を持っているため、スライダーが見えなくなります。

私は知る必要があります。これはこれを行うための正しい方法ですか。アドバイスの提案は非常に役に立ちます。

Visual Studio 2005 を使用しています。

4

2 に答える 2

0

Z オーダーが正しくないため、スライダー コントロールを表示できません。したがって、サイズ変更をオーバーライドして、スライダーを適切に再配置します。&CWnd::wndTop は、ウィンドウを Z オーダーの一番上に配置することを意味します。

まず、MainFrame.h で CSliderCtrl *m_pZoomSlider を定義します。次のコードは、遅延初期化パターンを使用しています。

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();
    }
于 2016-07-23T07:37:29.893 に答える
0

GetItemRect ではなく GetRect を使用する必要があると思います。

于 2013-05-09T15:22:33.943 に答える