winapi如何在透明窗口背景上绘制不透明文本?
使用WindowsAPI,我试图在半透明的背景上绘制不透明的文本。使用winapi如何在透明窗口背景上绘制不透明文本?,winapi,Winapi,使用WindowsAPI,我试图在半透明的背景上绘制不透明的文本。使用SetLayeredWindowAttributes(hWnd、RGB(0,0,0)、128、LWA_ALPHA)和窗口样式的WS_EX_LAYERED,我已经设法使整个窗口半透明,但也包括文本。 如何保持文本不透明和背景半透明?为了在分层窗口中实现“正确”的alpha,您需要通过调用UpdateLayeredWindow为窗口管理器提供PARGB位图 试试下面的代码,它适合我 #include <Windows.h&g
SetLayeredWindowAttributes(hWnd、RGB(0,0,0)、128、LWA_ALPHA)代码>和窗口样式的WS_EX_LAYERED
,我已经设法使整个窗口半透明,但也包括文本。
如何保持文本不透明和背景半透明?为了在分层窗口中实现“正确”的alpha,您需要通过调用UpdateLayeredWindow
为窗口管理器提供PARGB位图
试试下面的代码,它适合我
#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);
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间Gdiplus;
#pragma注释(lib,“Gdiplus.lib”)
#定义最大宽度800
#定义最大高度600
使用名称空间std;
无效Drawtext(HWND HWND,HDC HDC);
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM){
如果(消息==WM_销毁){
PostQuitMessage(0);
}
返回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;
//初始化GDI+
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
hinst=GetModuleHandle(NULL);
//创建窗口类:
WNDCLASS wc={};
wc.lpfnWndProc=WndProc;
wc.hInstance=hinst;
wc.lpszClassName=L“win32”;
//向操作系统注册类:
注册类(&wc);
//创建并显示窗口:
hWnd=CreateWindowExW(
WS_EX_分层| WS_EX_最上层,
L“win32”,
L“温汤”,
WS_弹出窗口,
0, 0, 1000, 500,
nullptr,
nullptr,
hInstance,
nullptr
);
if(hWnd==NULL){
返回0;
}
Drawtext(hWnd,GetDC(hWnd));
展示窗口(hWnd、SW_展示);
MSG={};
while(GetMessage(&msg,NULL,0,0)){
翻译信息(&msg);
发送消息(&msg);
}
}
无效Drawtext(HWND HWND,HDC HDC)
{
丰特家族丰特家族(L“新罗马时代”);
字体字体(&fontFamily,32,FontStyleRegular,UnitPixel);
点F点F(30.0f,10.0f);
SolidBrush SolidBrush(颜色(255,0,0,0));
位图软件位图(最大宽度、最大高度、像素格式32bppargb);
图形g(和软件位图);
g、 清除(Gdiplus::Color(30,0,0,0));//30:alpha值
g、 抽绳(L“Hello”、-1、&font、pointF和solidBrush);
HBITMAP-bmp;
GetHBITMAP(颜色(0,0,0,0),&bmp);
HDC memdc=CreateCompatibleDC(HDC);
HGDIOBJ original=SelectObject(memdc,bmp);
BLENDFUNCTION blend={0};
blend.BlendOp=AC\u SRC\u OVER;
blend.SourceConstantAlpha=255;
blend.AlphaFormat=AC_SRC_ALPHA;
点位置={200300};
大小szWnd={MAX_WIDTH,MAX_HEIGHT};
点ptSrc={0,0};
BOOL l=UpdateLayeredWindow(hwnd、hdc和ptLocation、szWnd、memdc和ptSrc、0和blend、ULW_ALPHA);
int err=GetLastError();
选择对象(hdc,原件);
删除对象(bmp);
删除对象(memdc);
}
调试:
有关更多详细信息,请参阅。您需要通过UpdateLayeredWindow
使用每像素alpha,而不是整个窗口的单个alpha设置。谢谢。我浏览了UpdateLayeredWindow,但无法找到任何有用的东西,包括我找到的示例代码,因此我放弃了。@Andreweisr请不要放弃,看看我发布的答案,我希望它对您有用。