LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
RECT rect;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
static HDC hdc,hMemDC,hBmpDC;
static HBITMAP hBitmap;
static HBITMAP hMemDCBmp;
switch (message)
{
case WM_CREATE:
//读取资源位图
hBitmap=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1) );
/*
hBmpDC=CreateCompatibleDC(hdc);
SelectObject(hBmpDC,hBitmap);
*/
return 0;
case WM_ERASEBKGND:
return 0;
case WM_SIZING:
return 0;
case WM_SIZE:
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
{
GetClientRect(hWnd,&rect);
//创建内存DC并将位图句柄选入
hBmpDC=CreateCompatibleDC(hdc);
SelectObject(hBmpDC,hBitmap);
//建立新一个内存DC和位图句柄
hMemDC=::CreateCompatibleDC(hdc);
hMemDCBmp=CreateCompatibleBitmap(hdc,rect.right-rect.left,rect.bottom-rect.top);
HGDIOBJ hBjOld=::SelectObject(hMemDC,hMemDCBmp);
//先在内存DC上进行整个的画刷填充
FillRect(hMemDC,&rect,(HBRUSH)GetStockObject(WHITE_BRUSH));
BitBlt(hMemDC,0,0,rect.right-rect.left,rect.bottom-rect.top,hBmpDC,0,0,SRCCOPY);
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,hMemDC,0,0,SRCCOPY);
//func(rect);
SelectObject(hMemDC,hBjOld);
DeleteObject(hMemDCBmp);
DeleteDC(hBmpDC);
DeleteDC(hMemDC);
}
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
DeleteObject(hBitmap);
/*
DeleteObject(hBitmap);
DeleteObject(hMemDCBmp);
DeleteDC(hBmpDC);
DeleteDC(hMemDC);
*/
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Windows绘图处理
本文介绍了一个Windows应用程序的绘图处理过程,重点展示了如何使用位图资源进行绘制,并通过内存DC来提高绘图效率。文中详细解释了在不同消息处理中进行的资源加载、背景消除、尺寸调整、绘图及销毁等操作。
1825





