Winapi 双缓冲时如何重新调整客户端区域的大小?

Winapi 双缓冲时如何重新调整客户端区域的大小?,winapi,gdi,Winapi,Gdi,假设我在GDI中实现了双缓冲: static HDC hdc; static HDC backDC; static HBITMAP backBuffer; static HGDIOBJ oldBitmap; static RECT client; case WM_CREATE: hdc=GetDC(hWnd); GetClientRect(hWnd, &client); backDC=CreateCompatibleDC(hdc);

假设我在GDI中实现了双缓冲:

static HDC hdc;
static HDC backDC;
static HBITMAP backBuffer;
static HGDIOBJ oldBitmap;
static RECT client;

case WM_CREATE:     
     hdc=GetDC(hWnd);
    GetClientRect(hWnd, &client);
    backDC=CreateCompatibleDC(hdc);         
    backBuffer=CreateCompatibleBitmap(hdc,client.right,client.bottom);
    oldBitmap=SelectObject(backDC,backBuffer);
    ReleaseDC(hWnd,hdc);

case WM_PAINT:


Rectangle(backDC, 0, 0,client.right,client.bottom); // displays rectangle the
 size of client to draw on it
      hdc = BeginPaint(hWnd, &ps);  
      BitBlt(hdc,0,0,client.right,client.bottom,backDC,0,0,SRCCOPY);
    // TODO: Add any drawing code here...
       EndPaint(hWnd, &ps);
如何处理调整大小?我试着做的一件事是

case WM_SIZE:   
client.right=LOWORD(lParam);
client.bottom=HIWORD(lParam);
    SendMessage(hWnd,WM_CREATE,NULL,NULL);

它所做的是,一旦我得到带有新客户机坐标的resize消息,它就会将消息发送到WM_CREATE,并且它实际上可以工作。。。。然而!它会造成大量泄漏,因为我基本上每次都会创建一个新的位图,而不会破坏它。有没有人能告诉我有没有更好的方法?Thx

保持backbuffer在附近是一种并不总是需要的优化。您可以在WM_绘制处理程序中创建它(大小为GetClientRect)、绘制到它、从它到实际窗口DC的blit以及清理。没有泄漏。没有在所有消息处理程序之间分配功能。没有全局变量。又好又干净


如果你真的想留下一个,我就去上课。构造函数获取大小。析构函数会清除一切。在WM_SIZE上,构造一个新的变量作为本地堆栈变量,与旧变量交换,并让temp stack one的析构函数清理。

我建议将后缓冲区设置为固定大小(通常是屏幕大小),然后使用
StretchBlt
(或者
StretchDIBits
,如果使用DIBs)在显示表面上以适当的大小渲染


这样,您就不必担心重新分配后缓冲区。

当然,它会泄漏,您不会破坏旧的缓冲区。不要使用WM_CREATE,那只是胡说八道。改为重新分配缓冲区。我在WM_destroy中销毁旧缓冲区不,您在WM_destroy消息处理程序中销毁最后分配的缓冲区。当WM_SIZE被解雇时,并不是你分配的所有其他解决方案。我知道这一点,这就是为什么我在寻找不同的解决方案。我可以在WM_PAINT中使用StretchBlt()来增加位图吗?我一定是遗漏了什么。如果Tomas正在绘制文本或具有特定大小和/或纵横比的任何东西,则执行StretchBlt会使其变形。@Tomas:在您发布的示例代码中,您不是这样做的。