透明的Win32窗口和文本

8

我试图制作一个完全透明无边框的全屏窗口,并在其顶部完美地显示文本。文本背景应该是透明的,但字体本身不应该是透明的。问题在于,只有在不执行SetWindowRgn时才能看到TextOut显示。我不知道我做错了什么 :(

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance;

   DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT;
   DWORD Flags2 = WS_POPUP;

   hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0);

   if(!hWnd)return FALSE;

   HRGN GGG = CreateRectRgn(0, 0, 0, 0);
   SetWindowRgn(hWnd, GGG, false);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   DeleteObject(GGG);

   return TRUE;
}

    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);

    SetBkMode(hdc, TRANSPARENT);
    TextOut(hdc, 50, 50, L"MY TEXT", lstrlen(L"MY TEXT"));

    EndPaint(hWnd, &ps);

3
确实很难看到一个0 x 0像素的窗口。向CreateRectRgn()传递合理的值。 - Hans Passant
我尝试了0、0、1920、1200,现在什么都不隐形了,我想让整个屏幕都隐形 :( - Kachinsky
@user1040769,您能否在Github上添加此解决方案,其中包括一个带边框的透明窗口(以便我们可以看到窗口的透明区域)和一个子窗口(例如按钮)?这样做会非常好,因为我们可以通过观察您是如何完成的来学习。并请提供链接。非常感谢! - Mathew Kurian
1个回答

6
我用以下方法解决了这个问题:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance;

   DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT;
   DWORD Flags2 = WS_POPUP;

   hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0);

   if(!hWnd)return FALSE;

   HRGN GGG = CreateRectRgn(0, 0, 1920, 1200);
   InvertRgn(GetDC(hWnd), GGG);
   SetWindowRgn(hWnd, GGG, false);

   COLORREF RRR = RGB(255, 0, 255);
   SetLayeredWindowAttributes(hWnd, RRR, (BYTE)0, LWA_COLORKEY);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   DeleteObject(GGG);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    RECT rect;

    switch (message)
    {
    case WM_ERASEBKGND:

        GetClientRect(hWnd, &rect);
        FillRect((HDC)wParam, &rect, CreateSolidBrush(RGB(255, 0, 255)));

        break;

1
SetWindowRgn 函数的文档(http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102.aspx)说:“成功调用 SetWindowRgn 后,系统拥有由区域句柄 hRgn 指定的区域。系统不会复制该区域。因此,您不应使用此区域句柄进行任何进一步的函数调用。特别地,请勿删除该区域句柄。系统在不再需要时删除该区域句柄。”您违反了这个协议。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接