Visual c++ OnPaint()函数中的MemDC
我的OnPaint()函数调用其他几个绘图函数Visual c++ OnPaint()函数中的MemDC,visual-c++,mfc,gdi,onpaint,Visual C++,Mfc,Gdi,Onpaint,我的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); ProcessDat
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);
}
DrawCoordiantSystem的示例:
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吗
谢谢为了避免闪烁,您应该将
CMemDC
和BitBlt
上的所有内容绘制到真实的DC
其次,为WM_ERASEBKGND消息添加windows消息处理程序,并将代码更改为
BOOL CGraph::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
为了避免闪烁,您应该将
CMemDC
和BitBlt
上的所有内容绘制到真实的DC
其次,为WM_ERASEBKGND消息添加windows消息处理程序,并将代码更改为
BOOL CGraph::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
您需要使用位图加载内存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)
您需要使用位图加载内存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)
我以前更改过OnEraseBkgnd()。还没有改变什么。你能为我的代码提供一个CMemDC和BitBlt的例子吗?我试过这种方法,但没有真正理解原理。谢谢。我仍然不知道如何在DrawCoordinateSystem()函数中使用它。它不提供任何输出。我以前更改过OnEraseBkgnd()。还没有改变什么。你能为我的代码提供一个CMemDC和BitBlt的例子吗?我试过这种方法,但没有真正理解原理。谢谢。我仍然不知道如何在DrawCoordinateSystem()函数中使用它。它没有任何输出,只是做了些什么。我想这会引导我走上正确的道路。我可以问你怎么做笔吗?你已经在做了。只需使用CPen,然后选择Object即可在DC中使用它。我想这会引导我走上正确的道路。我可以问你怎么做笔吗?你已经在做了。只需使用CPen,然后选择Object即可在DC中使用它。