在视图上画了一层作为背景(在OnPaint上画,然后bkgnd返回真),再画一层作为新建的一个区域去画图,如果InvalidateRect,这个区域就闪一下不见,如果不InvalidateRect,那没问题,但是如果新建的时候原来有区域,要怎么才可以把原来的擦掉画新建的?
还有我新建好的区域只要滚动条一动他就没了!这要怎么解决!!

解决方案 »

  1.   

    我在MFC基于对话的程序中在主对话框中用静态控件划了一个区域作为视图区域,按照网上的方法在对话框初始化中实现了,然后我用双缓冲贴图的方法定义了个画网格及背景颜色的函数DrawGrid(),在OnPaint()调用他,在OnEraseBkgnd()里返回真。这个画出来没多大问题。
    然后我又在主对话框中建了几个按钮(新建、打开、保存、有需要的话还可以添加),新建的按钮我又关联了一个新的对话框,新的对话框中输入2个值去划分新建区域的大小(宽高各包含多少网格),我就在新对话框的确定的消息响应函数中再次用DrawGrid()画了一个区域,我没有用InvalidateRect(),这个区域可以显示,问题是如果在我已经新建一个区域的情况下再新建一个区域这个区域必须比原来的大才可以,我想大概是背景没擦除的原因,于是我在画好区域以后用InvalidateRect(),新建的区域有画但是他只闪一下,我的目的就是如果我新建一个区域比已经新建的区域小的画也可以显示出来,而不是重叠什么的,这要怎么解决?
      

  2.   


    bool CMyView::DrawGrid(CRect rc,COLORREF BKColor,COLORREF LineColor,int Width)
    {
    GetClientRect(&rect);
    int nWidth;
    int nHeight;
    nWidth=rc.Width();
    nHeight=rc.Height();
    CDC MemDC;
    CBitmap MemBitmap;
    MemDC.CreateCompatibleDC (NULL);
    MemBitmap.CreateCompatibleBitmap(GetDC(),nWidth,nHeight);
    CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
    MemDC.FillSolidRect(0,0,nWidth,nHeight,BKColor);
    CPen aPen;
    aPen.CreatePen(PS_SOLID,1,LineColor);                //创建画笔(白色的)
    CPen* pOldPen=MemDC.SelectObject(&aPen);
    for(int i=rect.left;i<=rc.right;i+=Width)
    {
    for(int j=rect.top;j<=rc.bottom;j+=Width)
    {
    MemDC.MoveTo(rect.left,j);
    MemDC.LineTo(i,j);
    MemDC.MoveTo(i,rect.top);
        MemDC.LineTo(i,j);
    }
    }
    GetDC()->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldBit);
    MemDC.SelectObject(pOldPen);
    MemBitmap.DeleteObject();
        MemDC.DeleteDC();
    return true;
    }上面的画网格及背景色的函数void CMyView::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    // TODO: 在此处添加消息处理程序代码
    // 不为绘图消息调用 CScrollView::OnPaint()
    GetClientRect(&rect);
    DrawGrid(rect,RGB(128,128,128),RGB(192,192,192),Width);
    }
    BOOL CMyView::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    return true;
    }以上画背景void CTestDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    CNewDlg dlg;
    if(dlg.DoModal()==IDOK)
    {
    m_pView->m_rectWidthCount=dlg.m_widthEdit;
    m_pView->m_rectHeightCount=dlg.m_heightEdit;
    m_pView->OnBnClickedOk();
    }
    }以上把新对话框的2个值传递到视图
    最后
    void CMyView::OnBnClickedOk()
    {
    // TODO: 在此添加控件通知处理程序代码
    CClientDC aDC(this);
    OnPrepareDC(&aDC);
    GetClientRect(&rect);
    Custom.left=rect.left;
    Custom.top=rect.top;
    Custom.right=Custom.left+m_rectWidthCount*Width;
    Custom.bottom=Custom.top+m_rectHeightCount*Width;
    DrawGrid(Custom,RGB(255,255,255),RGB(192,192,192),Width);
    aDC.LPtoDP(Custom);
    }