Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
winapi如何在透明窗口背景上绘制不透明文本?_Winapi - Fatal编程技术网

winapi如何在透明窗口背景上绘制不透明文本?

winapi如何在透明窗口背景上绘制不透明文本?,winapi,Winapi,使用WindowsAPI,我试图在半透明的背景上绘制不透明的文本。使用SetLayeredWindowAttributes(hWnd、RGB(0,0,0)、128、LWA_ALPHA)和窗口样式的WS_EX_LAYERED,我已经设法使整个窗口半透明,但也包括文本。 如何保持文本不透明和背景半透明?为了在分层窗口中实现“正确”的alpha,您需要通过调用UpdateLayeredWindow为窗口管理器提供PARGB位图 试试下面的代码,它适合我 #include <Windows.h&g

使用WindowsAPI,我试图在半透明的背景上绘制不透明的文本。使用
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请不要放弃,看看我发布的答案,我希望它对您有用。