win32-UpdateLayeredWindow
Posted strive-sun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32-UpdateLayeredWindow相关的知识,希望对你有一定的参考价值。
创建半透明的窗口,以及在窗口上绘制不透明的文本
方法:
- 创建
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); }
以上是关于win32-UpdateLayeredWindow的主要内容,如果未能解决你的问题,请参考以下文章