想编一个简单的显示文本文件的程序,显示的页面有点像word 2003,一页一页的显示,每页是一张A4纸的大小。
但是绘制白色页面时效率不高,调整窗口大小时页面闪烁。请问有什么好办法。这个页面使用Rectangle绘制出来的,当然这个问题不能囿于基本图形的绘制;还有文字显示、位图显示、视频内容等。

解决方案 »

  1.   

    解决闪烁,建议用双缓冲绘图,在内存中绘好,直接贴出来!
    还有,将OnEraseBkgnd重载后直接返回TRUE
      

  2.   

    VC程序 
    1.内存DC
    2.OnEraseBkgnd() return TRUE
      

  3.   

    OnEraseBkgnd() 会用默认的画刷擦除背景,返回 TRUE 就可以了:)
      

  4.   

    void CMainWindow::OnPaint ()
    {
        CPaintDC  dc (this);
    CDC       MemDC;
    CBitmap   bmpFace; 
    CRect     ClientRect;
        CRect     PaperRect;
    GetClientRect (&ClientRect);    int bmpWidth; MemDC.CreateCompatibleDC(&dc);     if(ClientRect.right <= m_nViewWidth)
    {
    PaperRect.left = 70;
    PaperRect.right = 70 + m_nPaperWidth;
    bmpWidth = m_nViewWidth;
    }
    else
    {
            PaperRect.left = (ClientRect.right - m_nPaperWidth) / 2;
            PaperRect.right = PaperRect.left + m_nPaperWidth;
    bmpWidth = ClientRect.right;
    } PaperRect.top = 40;
    PaperRect.bottom = 40 + m_nPaperHeight; bmpFace.CreateCompatibleBitmap(&dc,bmpWidth,m_nViewHeight);
        CBitmap  *pOldBmp = NULL; 
        pOldBmp = MemDC.SelectObject(&bmpFace);    //CBrush    b1; 
        //b1.CreateSolidBrush(RGB(0,0,0));
    //dc.FillRect (&PaperRect, &b1); MemDC.SelectStockObject (NULL_PEN);
        MemDC.SelectStockObject (GRAY_BRUSH);
        MemDC.Rectangle (&PaperRect); //PaperRect.OffsetRect(-3,-3);
    //CBrush b2;
    //b2.CreateSolidBrush(RGB(255,255,255));
    //dc.FillRect (&PaperRect, &b2);
    MemDC.SelectStockObject (BLACK_PEN);
        MemDC.SelectStockObject (WHITE_BRUSH);
        MemDC.Rectangle (&PaperRect); //
        // Set the window origin to reflect the current scroll positions.
        //
        dc.SetWindowOrg (m_nHScrollPos, m_nVScrollPos);
    dc.BitBlt(ClientRect.left,ClientRect.top,bmpWidth,m_nViewHeight,
     &MemDC,ClientRect.left,ClientRect.top,SRCCOPY); 
    MemDC.SelectObject(pOldBmp); 
        bmpFace.DeleteObject();
    }本来是想用绘制背景把一个A4纸大小的白色带有阴影的矩形背景色绘制成灰蓝色的,看来想用双缓冲,背景色也需要自己绘制啊。还有个问题,我把绘制区域设置最小设置为m_nViewWidth,m_nViewHeight。当窗口调整的小于这个值时就可以SCROLL。由于A4的纸张很大任何时候竖直的滚动条都在,用上边的方式绘制时超过窗口区域的东西也绘制了,不过在复制到窗口中时没有显示而已。感觉这样效率不高。
    要是在内存中绘制窗口中可以显示的部分然后复制到窗口会有更高的效率,希望各位能够帮忙写个这样的OnPaint()函数。
      

  5.   

    这是完整工程的下载地址
    http://download.csdn.net/source/2176056
      

  6.   


    有人说直接返回FALSE,到底应该返回什么有什么区别呢?
      

  7.   

    返回TRUE,说明不要系统处理了,你自己处理好了