void CPreviewStatic::OnPaint()
{
CPaintDC dc(this);  CRect rect = 0;
GetClientRect(rect); CDC DCMem;
CBitmap MemBitmap;
DCMem.CreateCompatibleDC(&dc);
MemBitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
DCMem.SelectObject(&MemBitmap);
int rcWidth = rect.Width()-GetSystemMetrics(SM_CXVSCROLL); //去除垂直滚动条后的绘图区宽度
int rcHigth = rect.Height()-GetSystemMetrics(SM_CXHSCROLL); //去除水平滚动条后的绘图区高度
m_imgBk.Draw(DCMem, 0, 0, rcWidth, rcHigth,0, 0, rcWidth, rcHigth); if (m_ImagePre && m_PNGSource)
{
    m_PreHorizList = m_PNGSource->GetHorizPointList();//获取编辑区的水平点链表
    m_PreVertList = m_PNGSource->GetVertPointList();//竖直链表     DrawOnePreView(DCMem.GetSafeHdc()); //绘制第一幅预览图,
    DrawTwoPreView(DCMem.GetSafeHdc()); //第二幅,
             DrawThreePreView(DCMem.GetSafeHdc());//第三幅,
          }
dc.BitBlt( 0, 0, rcWidth,rcHigth,&DCMem, m_xpAdd, m_ypAdd,SRCCOPY);//????????????????
MemBitmap.DeleteObject();
DCMem.DeleteDC();
}其中m_xpAdd, m_ypAdd,为水平滚动条和竖直滚动条的当前位置。三幅图的相对位置固定
我用这种方式来响应拖动滚动条时的重绘,但有问题,拖动滚动条时新出现的区域为已显示部分的重影。我想知道在显示内存DC时可以选择源的起始位置吗?还是只能从(0,0)开始?
如果不能,有没有什么好的方法可以让三幅图一起随滚动条的移动而显示?

解决方案 »

  1.   

    可以有一个setoriginaxxxx之类的函数可以用
      

  2.   

    是MarkFullscreenWindow吗?我是新手,麻烦你说详细一点,谢谢
      

  3.   

    m_xpAdd, m_ypAdd这两个参数就是DCMem的开始位置不知道楼主懂我的意思么..StretchBlt和BitBlt都是这个意思
      

  4.   

    我知道,我设置m_xpAdd, m_ypAdd为DCMem的开始位置,但在拖动滚动条的过程中图像不能正常显示(在拖滚动条的过程中,m_xpAdd, m_ypAdd的值响应的发生变化)
      

  5.   

    m_xpAdd, m_ypAdd要根据GetScrollPos获得的值变化的呀你滚动轴移动的时候就是在不断重绘的
      

  6.   


    void CPreviewStatic::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    CRect rc = GetImagesRect(); int minpos;
    int maxpos;
    pScrollBar->GetScrollRange(&minpos, &maxpos); 
    maxpos = pScrollBar->GetScrollLimit(); int curpos = pScrollBar->GetScrollPos();
    int line = max(1, (maxpos-minpos)/10); switch (nSBCode)
    {
    case SB_LEFT:
    curpos = minpos;
    break; case SB_RIGHT:
    curpos = maxpos;
    break; case SB_ENDSCROLL:
    break; case SB_LINELEFT:
    if (curpos > minpos)
    curpos = max(minpos, curpos - line);
    break; case SB_LINERIGHT:
    if (curpos < maxpos)
    curpos = min(maxpos, curpos + line);
    break; case SB_PAGELEFT:  
    if (curpos > minpos)
    curpos = max(minpos, curpos - rc.Width());    
    break; case SB_PAGERIGHT: 
    if (curpos < maxpos)
    curpos = min(maxpos, curpos + rc.Width());    
    break; case SB_THUMBPOSITION:
    curpos = nPos;
    break; case SB_THUMBTRACK:
    curpos = nPos;
    break;
    }
    pScrollBar->SetScrollPos(curpos);
    CStatic::OnHScroll(nSBCode, nPos, pScrollBar);    
    m_xpAdd = curpos - minpos;
    Invalidate();
    }这个应该没问题,主要是刷新显示图片的时候有问题,我想直接从内存DC中不停地刷新滚动条变化后的新区域,但好像不行,不知道有没有什么好方法或技巧?
      

  7.   

    可以设置视图原点Setwindoworg具体使用请搜索msdn
      

  8.   

    内存的DC是不变的..变化的只是你显示的DC...如果你想变化你内存的DC..那工作量是不是也忒大了啊..呵呵.你的值映射可能不对..好好检查下..我就是这么做的