2013-09-06 5 views
0

Этот код вместо горизонтальной прокрутки делает вертикальную прокрутку, пожалуйста, дайте мне какое-нибудь предложение, что я делаю неправильно. Я хочу сделать горизонтальную прокрутку.горизонтальная прокрутка не работает

void CFormGridColumnPreviewDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*  
pScrollBar) 
{ 
// TODO: Add your message handler code here and/or call default 

int nDelta; 
int nMaxPos = m_rcOriginalRect.Width() - m_nCurWidth; 

switch (nSBCode) 
{ 
case SB_LINERIGHT: 
    if (m_nScrollPos >= nMaxPos) 
     return; 

    nDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos); 
    break; 

case SB_LINELEFT: 
    if (m_nScrollPos <= 0) 
     return; 
    nDelta = -min(max(nMaxPos/20,5),m_nScrollPos); 
    break; 
case SB_PAGERIGHT: 
    if (m_nScrollPos >= nMaxPos) 
     return; 
    nDelta = min(max(nMaxPos/10,5),nMaxPos-m_nScrollPos); 
    break; 
case SB_THUMBTRACK: 
case SB_THUMBPOSITION: 
    nDelta = (int)nPos - m_nScrollPos; 
    break; 

case SB_PAGELEFT: 
    if (m_nScrollPos <= 0) 
     return; 
    nDelta = -min(max(nMaxPos/10,5),m_nScrollPos); 
    break; 

    default: 
    return; 
} 
m_nScrollPos += nDelta; 
SetScrollPos(SB_HORZ,m_nScrollPos,TRUE); 
ScrollWindow(0,-nDelta); 

CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 

void CFormGridColumnPreviewDlg::OnSize(UINT nType, int cx, int cy) 
{ 
CDialog::OnSize(nType, cx, cy); 

// TODO: Add your message handler code here 
m_nCurWidth = cx; 

SCROLLINFO si; 
si.cbSize = sizeof(SCROLLINFO); 
si.fMask = SIF_ALL; 
si.nMin = 0; 
si.nMax = m_rcOriginalRect.Width(); 
si.nPage = cx; 
si.nPos = 0; 
SetScrollInfo(SB_HORZ, &si, TRUE); 
} 
+0

Трудно увидеть, что ScrollWindow() может сделать, но обмен двумя аргументами или просто избавление от него звучит как решение. –

+0

ScrollWindow (-nDelta, 0); – YogeshNC

ответ

0

Я надеюсь, что это приводит к вам:

BEGIN_MESSAGE_MAP(AddTabDlg, CDialog) 
 
\t ON_WM_SIZE() 
 
\t ON_WM_VSCROLL() 
 
\t ON_WM_HSCROLL() 
 

 
END_MESSAGE_MAP() 
 

 

 
// AddTabDlg message handlers 
 

 
BOOL AddTabDlg::OnInitDialog() 
 
{ 
 
\t CDialog::OnInitDialog(); 
 
\t 
 
\t GetWindowRect(m_rect); 
 
\t m_nScrollPos = 0; 
 
\t m_nScrollPosH = 0; 
 

 
\t return TRUE; // return TRUE unless you set the focus to a control 
 
} 
 

 
void AddTabDlg::OnSize(UINT nType, int cx, int cy) 
 
{ 
 
\t CDialog::OnSize(nType, cx, cy); 
 

 
\t // TODO: Add your message handler code here. 
 
\t m_nCurHeight = cy; 
 

 
\t m_nCurWidth = cx; 
 

 
\t int nScrollMax; 
 
\t if (cy < m_rect.Height()) 
 
\t { 
 
\t \t nScrollMax = m_rect.Height() - cy; 
 
\t } 
 
\t else 
 
\t \t nScrollMax = 0; 
 

 
\t int nScrollMaxH; 
 
\t if (cx < m_rect.Width()) 
 
\t { 
 
\t \t nScrollMaxH = m_rect.Width() - cx; 
 
\t } 
 
\t else 
 
\t \t nScrollMaxH = 0; 
 

 
\t SCROLLINFO si; 
 
\t si.cbSize = sizeof(SCROLLINFO); 
 
\t si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; 
 
\t si.nMin = 0; 
 
\t si.nMax = nScrollMax; 
 
\t si.nPage = si.nMax/10; 
 
\t si.nPos = 0; 
 
\t SetScrollInfo(SB_VERT, &si, TRUE); 
 

 
\t SCROLLINFO sih; 
 
\t sih.cbSize = sizeof(SCROLLINFO); 
 
\t sih.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; 
 
\t sih.nMin = 0; 
 
\t sih.nMax = nScrollMaxH; 
 
\t sih.nPage = sih.nMax/10; 
 
\t sih.nPos = 0; 
 
\t SetScrollInfo(SB_HORZ, &sih, TRUE); 
 
} 
 

 
void AddTabDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
 
{ 
 
\t // TODO: Add your message handler code here and/or call default. 
 
\t int nDelta; 
 
\t int nMaxPos = m_rect.Height() - m_nCurHeight; 
 

 
\t switch (nSBCode) 
 
\t { 
 
\t case SB_LINEDOWN: 
 
\t \t if (m_nScrollPos >= nMaxPos) 
 
\t \t \t return; 
 
\t \t nDelta = min(nMaxPos/100, nMaxPos - m_nScrollPos); 
 
\t \t break; 
 

 
\t case SB_LINEUP: 
 
\t \t if (m_nScrollPos <= 0) 
 
\t \t \t return; 
 
\t \t nDelta = -min(nMaxPos/100, m_nScrollPos); 
 
\t \t break; 
 

 
\t case SB_PAGEDOWN: 
 
\t \t if (m_nScrollPos >= nMaxPos) 
 
\t \t \t return; 
 
\t \t nDelta = min(nMaxPos/10, nMaxPos - m_nScrollPos); 
 
\t \t break; 
 

 
\t case SB_THUMBPOSITION: 
 
\t \t nDelta = (int)nPos - m_nScrollPos; 
 
\t \t break; 
 

 
\t case SB_PAGEUP: 
 
\t \t if (m_nScrollPos <= 0) 
 
\t \t \t return; 
 
\t \t nDelta = -min(nMaxPos/10, m_nScrollPos); 
 
\t \t break; 
 

 
\t default: 
 
\t \t return; 
 
\t } 
 
\t m_nScrollPos += nDelta; 
 
\t SetScrollPos(SB_VERT, m_nScrollPos, TRUE); 
 
\t ScrollWindow(0, -nDelta); 
 
\t CDialog::OnVScroll(nSBCode, nPos, pScrollBar); 
 
} 
 

 
void AddTabDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
 
{ 
 
\t // TODO: Add your message handler code here and/or call default. 
 
\t int nDeltaH; 
 
\t int nMaxPosH = m_rect.Width() - m_nCurWidth; 
 

 
\t switch (nSBCode) 
 
\t { 
 
\t case SB_LINERIGHT: 
 
\t \t if (m_nScrollPosH >= nMaxPosH) 
 
\t \t \t return; 
 
\t \t nDeltaH = min(nMaxPosH/100, nMaxPosH - m_nScrollPosH); 
 
\t \t break; 
 

 
\t case SB_LINELEFT: 
 
\t \t if (m_nScrollPosH <= 0) 
 
\t \t \t return; 
 
\t \t nDeltaH = -min(nMaxPosH/100, m_nScrollPosH); 
 
\t \t break; 
 

 
\t case SB_RIGHT: 
 
\t \t if (m_nScrollPosH >= nMaxPosH) 
 
\t \t \t return; 
 
\t \t nDeltaH = min(nMaxPosH/10, nMaxPosH - m_nScrollPosH); 
 
\t \t break; 
 

 
\t case SB_THUMBPOSITION: 
 
\t \t nDeltaH = (int)nPos - m_nScrollPosH; 
 
\t \t break; 
 

 
\t case SB_LEFT: 
 
\t \t if (m_nScrollPosH <= 0) 
 
\t \t \t return; 
 
\t \t nDeltaH = -min(nMaxPosH/10, m_nScrollPosH); 
 
\t \t break; 
 

 
\t default: 
 
\t \t return; 
 
\t } 
 
\t m_nScrollPosH += nDeltaH; 
 
\t SetScrollPos(SB_HORZ, m_nScrollPosH, TRUE); 
 
\t ScrollWindow(-nDeltaH, 0); 
 
\t CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
 
}

Он работает в то же время, горизонтальные и вертикальные полосы прокрутки;)

Смежные вопросы