創建半透明的窗口,以及在窗口上繪制不透明的文本
方法:
- 創建
Bitmap
具有PixelFormat32bppPARGB
像素格式的GDI + 對象。 - 創建一個
Graphics
對象以繪制該Bitmap
對象。 - 使用GDI +將所有圖形繪制到該對象中。
- 銷毀
Graphics
在步驟2中創建的對象。 GetHBITMAP
在Bitmap
對象上調用方法以獲取WindowsHBITMAP
。- 銷毀
Bitmap
對象。 - 使用創建內存DC,
CreateCompatibleDC
然后HBITMAP
從步驟5中選擇。 - 使用內存DC作為源調用UpdateLayeredWindow。
- 選擇以前的位圖並刪除內存DC。
- 銷毀
HBITMAP
在步驟5中創建的。
代碼示例:
#include <Windows.h> #include <stdio.h> #include <iostream> #include <ObjIdl.h> #include <gdiplus.h> #include <gdiplusheaders.h> using namespace Gdiplus; #pragma comment (lib,"Gdiplus.lib") #define MAX_WIDTH 800 #define MAX_HEIGHT 600 using namespace std; void Drawtext(HWND hwnd, HDC hdc); LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_DESTROY) { PostQuitMessage(0); } return DefWindowProc(hwnd, message, wParam, lParam); }; HINSTANCE hinst; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; //Initialize GDI+ GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); hinst = GetModuleHandle(NULL); // create a window class: WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hinst; wc.lpszClassName = L"win32"; // register class with operating system: RegisterClass(&wc); // create and show window: hWnd = CreateWindowExW( WS_EX_LAYERED | WS_EX_TOPMOST, L"win32", L"WinSoup", WS_POPUP, 0, 0, 1000, 500, nullptr, nullptr, hInstance, nullptr ); if (hWnd == NULL) { return 0; } Drawtext(hWnd, GetDC(hWnd)); ShowWindow(hWnd, SW_SHOW); MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } void Drawtext(HWND hwnd, HDC hdc) { FontFamily fontFamily(L"Times New Roman"); Font font(&fontFamily, 32, FontStyleRegular, UnitPixel); PointF pointF(30.0f, 10.0f); SolidBrush solidBrush(Color(255, 0, 0, 0)); Bitmap softwareBitmap(MAX_WIDTH, MAX_HEIGHT, PixelFormat32bppARGB); Graphics g(&softwareBitmap); g.Clear(Gdiplus::Color(30, 0, 0, 0)); // 30: alpha value g.DrawString(L"Hello Hello Hello Hello Hello Hello Hello Hello", -1, &font, pointF, &solidBrush); HBITMAP bmp; softwareBitmap.GetHBITMAP(Color(0, 0, 0, 0), &bmp); HDC memdc = CreateCompatibleDC(hdc); HGDIOBJ original = SelectObject(memdc, bmp); BLENDFUNCTION blend = { 0 }; blend.BlendOp = AC_SRC_OVER; blend.SourceConstantAlpha = 255; blend.AlphaFormat = AC_SRC_ALPHA; POINT ptLocation = { 200, 300 }; SIZE szWnd = { MAX_WIDTH, MAX_HEIGHT }; POINT ptSrc = { 0, 0 }; BOOL l = UpdateLayeredWindow(hwnd, hdc, &ptLocation, &szWnd, memdc, &ptSrc, 0, &blend, ULW_ALPHA); int err = GetLastError(); SelectObject(hdc, original); DeleteObject(bmp); DeleteObject(memdc); }