1 在窗口创建时加载一幅图作为背景
2
3 case WM_CREATE:
4 {
5 Gdiplus::GdiplusStartup(&token, &input, NULL);
6 pImage = new Gdiplus::Image(L"pic02.png");
7 }
8 break;
9
10 在 WM_ERASEBKGND 消息中显示图片,也可以直接返回 TRUE ,而在 WM_PAINT 中显示图片。
11
12 case WM_ERASEBKGND:
13 {
14 HDC hdc = (HDC)wParam;
15 RECT rc;
16 GetClientRect(hWnd, &rc);
17 HDC hMemDC = CreateCompatibleDC(hdc);
18 HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
19 SelectObject(hMemDC, hMemBmp);
20 FillRect(hMemDC, &rc, GetSysColorBrush(COLOR_WINDOW)); // 把透明背景填充为系统窗口颜色
21 Gdiplus::Graphics g(hMemDC);
22 g.DrawImage(pImage, 0, 0, rc.right, rc.bottom);
23 BitBlt(hdc, 0, 0, rc.right, rc.bottom, hMemDC, 0, 0, SRCCOPY);
24 DeleteObject(hMemBmp);
25 DeleteDC(hMemDC);
26 }
27 return TRUE;
28
29 对于一般窗口这样就可以了,网上的很多代码也是这样写的,但是用于对话框时,就会有问题,在拖动改变对话框大小之后,背景图片会有残留。需要在 WM_SIZE 中 调用 RedrawWindow 进行处理:
30
31 case WM_SIZE:
32 RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE);
33 return 0;
34
35 这样就完美了。
36
37