以下代码:
HDC m_MemDC = ::CreateCompatibleDC(m_devDC);
HPEN m_hpen = ::CreatePen(PS_SOLID,1,RGB(0,0,255));
::SelectObject(m_MemDC,m_hpen);
::MoveToEx(m_MemDC,RectangleX,RectangleY,NULL);
::LineTo(m_MemDC, RectangleX + RectangleW, RectangleY);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY,NULL);
::LineTo(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY);
::BitBlt(m_devDC,RectX,RectY,RectW,RectH,m_MemDC,0,0,SRCCOPY);
::DeleteObject(m_hpen);
::DeleteDC(m_MemDC);
//m_devDC为获取的设备DC哪里不妥吗?望指教。
HDC m_MemDC = ::CreateCompatibleDC(m_devDC);
HPEN m_hpen = ::CreatePen(PS_SOLID,1,RGB(0,0,255));
::SelectObject(m_MemDC,m_hpen);
::MoveToEx(m_MemDC,RectangleX,RectangleY,NULL);
::LineTo(m_MemDC, RectangleX + RectangleW, RectangleY);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY,NULL);
::LineTo(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY);
::BitBlt(m_devDC,RectX,RectY,RectW,RectH,m_MemDC,0,0,SRCCOPY);
::DeleteObject(m_hpen);
::DeleteDC(m_MemDC);
//m_devDC为获取的设备DC哪里不妥吗?望指教。
第一是你的画笔选进DC没有选出,存在GDI资源泄漏;
第二是你的内存DC中没有选进内存位图。这个内存位图用CreateCompatibleBitmap创建:
HBITMAP hMemBmp = CreateCompatibleBitmap(m_devDC, RectW, RectH);
将你的代码修改一下试试(假设m_devDC有效,绘图区域大小为宽RectW,高RectH):
HDC m_MemDC = ::CreateCompatibleDC(m_devDC);
if (m_MemDC == NULL)
return;
HBITMAP hMemBmp = CreateCompatibleBitmap(m_devDC, RectW, RectH);
if (hMemBmp == NULL)
{
DeleteDC(m_MemDC);
return;
}
HBITMAP hBmpOld = SelectObject(m_MemDC, hMemBmp);
//这里最好还要加上填充背景的代码,比如
//PatBlt(m_MemDC, 0, 0, RectW, RectH, WHITENESS);HPEN m_hpen = ::CreatePen(PS_SOLID,1,RGB(0,0,255));
HPEN hPenOld = (HPEN)::SelectObject(m_MemDC, m_hpen);
::MoveToEx(m_MemDC, RectangleX, RectangleY, NULL);
::LineTo(m_MemDC, RectangleX + RectangleW, RectangleY);
::MoveToEx(m_MemDC, RectangleX + RectangleW, RectangleY, NULL);
::LineTo(m_MemDC, RectangleX + RectangleW, RectangleY + RectangleH);
::MoveToEx(m_MemDC, RectangleX + RectangleW, RectangleY + RectangleH, NULL);
::LineTo(m_MemDC, RectangleX, RectangleY + RectangleH);
::MoveToEx(m_MemDC, RectangleX, RectangleY + RectangleH, NULL);
::LineTo(m_MemDC, RectangleX, RectangleY);
SelectObject(m_MemDC, hPenOld);
::DeleteObject(m_hpen);
::BitBlt(m_devDC, RectX, RectY, RectW, RectH, m_MemDC, 0, 0, SRCCOPY);
SelectObject(m_MemDC, hBmpOld);
DeleteObject(hMemBmp);
::DeleteDC(m_MemDC);
另外我也试过了创建内存位图,结果是一团黑色区域。
我的完整代码:HDC m_MemDC = ::CreateCompatibleDC(m_devDC);
HBITMAP m_hbmp = ::CreateCompatibleBitmap(m_MemDC, RectW,RectH);
HBITMAP m_oldbmp = (HBITMAP)::SelectObject(m_MemDC, m_hbmp);
HPEN m_hpen = ::CreatePen(PS_SOLID,1,RGB(0,0,255));
HPEN m_oldpen = ::SelectObject(m_MemDC ,m_hpen);
::MoveToEx(m_MemDC,RectangleX,RectangleY,NULL);
::LineTo(m_MemDC, RectangleX + RectangleW, RectangleY);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY,NULL);
::LineTo(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX + RectangleW,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY+RectangleH);
::MoveToEx(m_MemDC,RectangleX,RectangleY+RectangleH,NULL);
::LineTo(m_MemDC,RectangleX,RectangleY); ::SelectObject(m_MemDC,m_oldpen);
::BitBlt(m_devDC,RectX,RectY,RectW,RectH,m_MemDC,0,0,SRCCOPY);
::SelectObject(m_MemDC,m_oldbmp);::DeleteObject(m_hpen);
::DeleteObject(m_hbmp);
::DeleteDC(m_MemDC); 楼上兄弟是说这样吧。我也试了的。 结果是一团黑色区域。
::BitBlt(m_devDC, 0, 0, RectW,RectH,m_MemDC,0,0,SRCCOPY);
能显示一片黑的表示内存dc绘制成功了,只是你画线可能出问题了,先试试绝对位置:::MoveToEx(m_MemDC,0,0,NULL);
::LineTo(m_MemDC,100,100);
::BitBlt(m_devDC,0,0,RectW,RectH,m_MemDC,0,0,SRCCOPY);
看有没有东西
谢谢你的帮助。 不过我试过了也不行。 而且有一点可以论证: 所有参数不变,我直接向设备DC上画线,就可以出现我要的效果。
说明画线坐标应该没有问题。