以下代码:
                           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哪里不妥吗?望指教。

解决方案 »

  1.   

    两个问题:
    第一是你的画笔选进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); 
      

  2.   

    谢谢楼上兄弟。我代码没帖完整,后面是delete了所有GDI对象的。
    另外我也试过了创建内存位图,结果是一团黑色区域。
    我的完整代码: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); 楼上兄弟是说这样吧。我也试了的。   结果是一团黑色区域。
      

  3.   

    会有什么可能原因造成不能从内存dc绘制到设备dc上呢?
      

  4.   

    ::BitBlt(m_devDC,RectX,RectY,RectW,RectH,m_MemDC,0,0,SRCCOPY);   -->
    ::BitBlt(m_devDC, 0, 0, RectW,RectH,m_MemDC,0,0,SRCCOPY);   
      

  5.   

    会有什么可能原因造成不能从内存dc绘制到设备dc上呢? 
      

  6.   

    CreateCompatibleBitmap创建BMP图象,图象数据初始化都是0,因此是黑的。
    能显示一片黑的表示内存dc绘制成功了,只是你画线可能出问题了,先试试绝对位置:::MoveToEx(m_MemDC,0,0,NULL); 
    ::LineTo(m_MemDC,100,100);
    ::BitBlt(m_devDC,0,0,RectW,RectH,m_MemDC,0,0,SRCCOPY);       
    看有没有东西
      
      

  7.   

    to ringphone: 
    谢谢你的帮助。 不过我试过了也不行。 而且有一点可以论证: 所有参数不变,我直接向设备DC上画线,就可以出现我要的效果。 
    说明画线坐标应该没有问题。