0

我的 OnPaint() 函数调用了其他几个绘图函数。

 void CGraph::OnPaint ()
 {
    CPaintDC dc(this);
    // CMemDC DC(&dc);

    dc.SetViewportOrg (0, 400);
    dc.SetMapMode(MM_ISOTROPIC);
    dc.SetWindowExt(1000, 800);
    dc.SetViewportExt(1000, -800);

    ProcessData ();
    DrawCoordinateSystem (&dc);
    DrawGrid (&dc);
    DrawGraph (&dc);
}

DrawCoordianteSystem 示例:

void CGraph::DrawCoordinateSystem (CDC* pDC)
{
   CPen PenBlack (PS_SOLID, 1, RGB(0, 0, 0));
   pDC->SelectObject (PenBlack);
   // Rectangle round the system
   pDC->Rectangle (0, -400, 1000, 400);
   // Horizontal axis
   pDC->MoveTo (0, 0);
   pDC->LineTo (1000, 0);
   pDC->SetTextColor (RGB(0,0,0));
   pDC->SetBkColor (RGB(240, 240, 240));
   pDC->TextOut (1001, 0, L"0");
   // Vertical axis
   pDC->MoveTo (0, -400);
   pDC->LineTo (0, 400);
}

我现在想避免使用 CMemDC 闪烁。但是,我无法让它正常工作。有人可以告诉我如何实施 CMemDC 吗?

谢谢

4

2 回答 2

3

您需要使用位图加载内存 DC,然后将 BitBlt 加载到屏幕 DC。

尝试类似:

CDC dcMem;
CBitmap bitmap;

dcMem.CreateCompatibleDC( pDC );
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height())
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

... DO ALL YOUR DRAWING TO dcMem ...

pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY);

dcMem.SelectObject(pOldBitmap)
于 2012-07-12T13:11:27.583 回答
1

为避免闪烁,您应该将所有内容都绘制CMemDCBitBlt真正的 DC 上。

其次为 WM_ERASEBKGND 消息添加 windows 消息处理程序并将代码更改为

BOOL CGraph::OnEraseBkgnd(CDC* pDC) 
{
    return TRUE;
}
于 2012-07-12T08:52:17.880 回答