可以使用以下方法將Win32視窗設置為透明: 定義視窗類時,在WNDCLASSEX結構體中設置hbrBackground成員為NULL。 在視窗創建時,使用WS_EX_LAYERED風格和SetLayeredWindowAttributes函數將視窗設置為透明: HWND hwnd = Create ...
可以使用以下方法將Win32視窗設置為透明:
-
定義視窗類時,在WNDCLASSEX結構體中設置hbrBackground成員為NULL。
-
在視窗創建時,使用WS_EX_LAYERED風格和SetLayeredWindowAttributes函數將視窗設置為透明:
HWND hwnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);
SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);
其中,第二個參數指定顏色偏移量,第三個參數指定透明度,範圍從0(完全透明)到255(完全不透明)。
- 在視窗的WM_PAINT消息處理函數中,使用CreateCompatibleDC函數創建一個與視窗DC相容的記憶體DC,並將要繪製的圖形繪製到該記憶體DC上。然後使用UpdateLayeredWindow函數將記憶體DC中的內容複製到視窗DC中。
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 創建與視窗DC相容的記憶體DC
HDC memDC = CreateCompatibleDC(hdc);
// 創建一個與視窗大小相同的點陣圖
HBITMAP memBmp = CreateCompatibleBitmap(hdc, 500, 100);
// 將點陣圖選入記憶體DC
HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);
// 在記憶體DC中繪製圖形
// ...
// 使用UpdateLayeredWindow函數將記憶體DC中的內容複製到視窗DC中
POINT ptSrc = { 0, 0 };
SIZE size = { 500, 100 };
BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
POINT ptDst = { 0, 0 };
UpdateLayeredWindow(hwnd, hdc, &ptDst, &size, memDC, &ptSrc, 0, &blend, ULW_ALPHA);
// 恢複原來的點陣圖
SelectObject(memDC, oldBmp);
// 釋放記憶體DC和點陣圖
DeleteDC(memDC);
DeleteObject(memBmp);
EndPaint(hwnd, &ps);
}
break;
以上代碼中,在記憶體DC中繪製圖形的過程自行實現。另外,由於UpdateLayeredWindow函數需要使用記憶體DC和點陣圖,因此需要在WM_DESTROY消息處理函數中釋放這些資源:
case WM_DESTROY:
{
PostQuitMessage(0);
DeleteObject(hBrush);
DeleteObject(hPen);
DeleteObject(hFont);
DeleteObject(hImage);
// 釋放記憶體DC和點陣圖
HDC memDC = GetDC(hwnd);
ReleaseDC(hwnd, memDC);
}
break;