如题

解决方案 »

  1.   

    当你的窗口滚动后,SetViewportOrg会被调用,从而导致你窗口的视图的座标原点被移动
    简单的说视图类的Window是个大矩形,而其view是一个在大矩形上移动的小矩形,只有在小矩形内部的图像才能被看见。滚动视窗,就是移动那个小矩形
      

  2.   

    那如何在发生滚动之前截获滚动消息,然后将view画成黑色呢?
      

  3.   


    正解。响应WM_HSCROLL或者WM_VSCROLL
      

  4.   

    响应WM_HSCROLL或者WM_VSCROLL这两个事件
      

  5.   

    void CPreView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    si.cbSize = sizeof(si); //SCROLLINFO  si;
    si.fMask  = SIF_ALL;

    GetScrollInfo(SB_HORZ, &si) ;
    int iHorzPos = si.nPos ;

    switch(nSBCode)
    {
    case SB_LINELEFT:
    si.nPos -= 15; break;
    case SB_LINERIGHT:
    si.nPos += 15; break;
    case SB_PAGELEFT:
    si.nPos -= si.nPage; break;
    case SB_PAGERIGHT:
    si.nPos += si.nPage; break;
    case SB_THUMBTRACK:
    si.nPos = si.nTrackPos; break;
    }
    si.fMask = SIF_POS ;
    SetScrollInfo(SB_HORZ, &si, TRUE);
    GetScrollInfo(SB_HORZ, &si);

    if (si.nPos != iHorzPos)
    {
    xPt += si.nPos - iHorzPos;   //int xPt;
    ScrollWindow(iHorzPos - si.nPos, 0, NULL, NULL);
    UpdateWindow();
    } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    void CPreView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    si.cbSize = sizeof (si) ;
    si.fMask  = SIF_ALL ;
    GetScrollInfo(SB_VERT, &si);

    int iVertPos = si.nPos ;
    switch(nSBCode)
    {
    case SB_TOP:
    si.nPos = si.nMin; break;
    case SB_BOTTOM:
    si.nPos = si.nMax; break;
    case SB_LINEUP:
    si.nPos -= 15; break;
    case SB_LINEDOWN:
    si.nPos += 15; break;
    case SB_PAGEUP:
    si.nPos -= si.nPage; break;
    case SB_PAGEDOWN:
    si.nPos += si.nPage; break;
    case SB_THUMBTRACK:
    si.nPos = si.nTrackPos; break;
    }

    si.fMask = SIF_POS ;
    SetScrollInfo(SB_VERT, &si, TRUE) ;
    GetScrollInfo(SB_VERT, &si) ;
    if(si.nPos != iVertPos)
    {
    yPt += si.nPos - iVertPos;
    ScrollWindow(0, iVertPos - si.nPos, NULL, NULL);
    UpdateWindow();
    ::UpdateWindow(GetParent()->m_hWnd);
    } CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }