case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
//// 用双缓存
// GetClientRect(hwnd, &ClientRect);
BufferDC =CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, ClientRect.right-ClientRect.left,
ClientRect.bottom-ClientRect.top);
SelectObject(BufferDC, hBitmap);
/// FillRect(BufferDC, &ClientRect, NULL);
////////////////////////////////////////////////////////////
SetMapMode(BufferDC, MM_ISOTROPIC);
SetWindowExtEx(BufferDC, 276, 72, NULL);
SetViewportExtEx(BufferDC, xClient, yClient, NULL); SetWindowOrgEx(BufferDC, 138, 36, NULL);
SetViewportOrgEx(BufferDC, xClient/2, yClient/2, NULL);
SelectObject(BufferDC, GetStockObject(NULL_PEN));
SelectObject(BufferDC, hBrushRed);

DisplayTime(BufferDC, f24Hour, Suppress);
BitBlt(hdc, 0, 0, ClientRect.right-ClientRect.left,
ClientRect.bottom-ClientRect.top, BufferDC, 0, 0, SRCCOPY); DeleteDC(BufferDC);
DeleteObject(hBitmap);
EndPaint(hwnd, &ps);
return 0;
上面是一个小程序中的一段。
本来没用双缓存,它能够正常显示,但是用了双缓存后,就不会显示了。请问一下,这里有什么错误吗?

解决方案 »

  1.   

    CreateCompatibleBitmap
    不要创建兼容性位图,直接用CreateBitmap创建32位的BMP
    另外,我不知道你想做什么
    缓冲方式绘制图象,一般是创建窗口的时候创建一个HDC(hdc_buffer)把一个BMP选入这个hdc_buffer,(注意:窗口大小变化时要重新建立一个和窗口一样大的BMP,选入hdc_buffer,同时删除原来的BMP).
    然后在WM_PAINT中只执行用BitBlt这一类的函数将hdc_buffer拷贝到hdc中(BeginPaint(hwnd, &ps);)
    你在其他绘图的地方使用hdc_buffer绘制,到最后窗口销毁的时候DeleteDC(hdc_buffer);
    这样你就不用每次都在WM_PAINT把整个图象重新绘制一次,能提高很多效率.
    你的代码
    WM_PAINT中创建hdc_buffer,然后又删除,我不明白,你的缓冲机制在哪里
      

  2.   

    1楼的说法大部分不敢苟同。你说的那种保存图像的方法效率是不错,但不是双缓冲,而是图像缓存所谓双缓冲,只是在普通绘图(姑且称作单缓冲)过程中加了一层。假设单缓冲绘图是这样的:其中MyDraw是真正的绘图代码void OnPaint(HWND hwnd)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        hdc = BeginPaint(hwnd, &ps);
        MyDraw(hdc);
        EndPaint(&ps);
    }
    改为双缓冲的代码大致应该是这样的void OnPaint(HWND hwnd)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        hdc = BeginPaint(hwnd, &ps);    HDC hMemDC = CreateCompatibleDC(hdc);
        RECT rc;
        GetClientRect(hwnd, &rc);
        HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, rc.right-rc.left, rc.bottom - rc.top);
        HBITMAP hOldMemBmp = SelectObject(hMemDC, hMemBmp);    MyDraw(hMemDC);    BitBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom - rc.top, hMemDC, 0, 0, SRCCOPY);    SelectObject(hMemDC, hOldMemBmp);
        DeleteObject(hOldMemBmp);
        DeleteDC(hMemDC);
        EndPaint(&ps);
    }
      

  3.   


    我也知道重复新建和删除浪费资源。
    但是我这里用双缓存(新手,我以为是双缓存)画图,都是先把图全部画在BufferDC里,然后在BitBlt()然后在这里不知道为什么会画不出图。
    这种方法,我在另一个小程序中是成功的。还望指点指点。
      

  4.   

    请问2楼,加一层的意义是什么??那不是更影响绘制效率吗?
    所谓2,3,4,5,N这种缓存机制就是图象缓存,简单的说就是生成图象的地方和使用图象的地方不一样,在WINDOWS中就是WM_PAINT函数,之所以用图象缓存机制就是因为直接在UI上绘图效率过低,所以生成多个缓冲页面(WINDOWS中常用HDC).在A线程中生成页面图象,在B线程中显示,
    如果生成比显示要快,就需要增加图象缓存页,一般播放器2,到3个缓存就可以了
    如果显示比生成要快,那就显示之前一个图象缓存页上的东西,不要等待A线程
    这样图象有很高的连续性.