内存DC在绘制之前必须先选入一个位图。位图用CreateCompatibleBitmap产生。

解决方案 »

  1.   

    azuo_lee() 给个详细点的例子程序好吗?
      

  2.   

    在需要实现动画的地方,比如在View的OnTimer中:
    CDC *pDC = GetDC();
    CDC memDC;
    CBitmap memBmp, *pOldBmp;
    CRect rc;
    GetClientRect(rc);
    memDC.CreateCompatibleDC(pDC);
    memBmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
    pOldBmp = memDC.SelectObject(&memBmp);
    memDC.FillSolidRect(rc, RGB(0, 128, 0));  //绘制前先清理
    ....//在memDC上作图
    pDC.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOldBmp);
    memBmp.DeleteObject();
    memDC.DeleteDC;
    ReleaseDC(pDC);
    如果你的View不经常变动的话,更好的办法是:
    1。将memDC与memBitmap做成全局变量或成员变量;
    2。在View初始化时(比如,OnInitUpdate),用CreateCompatibleXXX初始化memDC与memBitmap,并将后者选入前者;
    3。在OnDraw中加入一句话,就是上面的BitBlt(当然,GetClientRect也必须有);
    4。作图时,直接在memDC上绘制(绘制前可能需要用FillRect清理),然后GetDC,取到屏幕DC,然后调用OnDraw复制到屏幕上(当然也可以用BitBlt),最后ReleaseDC;
    5。View销毁时,用DeleteDC与DeleteObject销毁memDC与memBitmap。
    这样,额外增加了OnDraw处理的功能,使程序的绘制不会在重绘时丢失;而且不必每次OnTimer时都取得memDC、memBitmap,减少了系统开销。