Win32无法使SetBkMode Transparency正常工作

时间:2014-06-22 02:57:37

标签: winapi overlay transparency

我正在编写一个简单的程序,它在屏幕上打印一些文本,覆盖其他窗口。

#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HWND hwnd = GetDesktopWindow();
HDC hdc;

    RECT rect;
//LPRECT rect = new RECT;
wchar_t text[] = L"test";

GetClientRect(hwnd, &rect);

do{
    hdc = GetWindowDC(hwnd);
    SetBkMode(hdc, TRANSPARENT);
    SetTextColor(hdc, RGB(100, 100, 100));
    DrawText(hdc, text, -1, &rect, DT_NOCLIP);
    ReleaseDC(hwnd, hdc);
    Sleep(15);
} while (1);
return 0;
}

问题在于我希望打印文本的背景是透明的,但SetBkMode似乎不起作用(如果我将它设置为OPAQUE或TRANSPARENT,它实际上没有区别)所以我得到了坚实的背景。有任何想法吗?我错过了什么?

编辑:按照建议将LPRECT更改为RECT。

编辑:使用透明窗口:

创建窗口:

CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED,                  // extended style
    (LPCWSTR)WINDOW_CLASS_NAME,     // class
    L"test", // title
     NULL,
    0, 0,     // initial x,y
    400, 300,  // initial width, height
    NULL,     // handle to parent 
    NULL,     // handle to menu
    hinstance,// instance of this application
    NULL)

全局:

wchar_t tst_Str[] = L"TEST";

WM_PAINT:

    PAINTSTRUCT ps;
    HDC hdc;         
    RECT rc;

    hdc = BeginPaint(hwnd, &ps);

    GetClientRect(hwnd, &rc);
    SetTextColor(hdc, RGB(255, 0, 0));
    DrawText(hdc, tst_Str, -1, &rc,NULL);

    EndPaint(hwnd, &ps);
    return 0;

2 个答案:

答案 0 :(得分:0)

Windows负责自己绘画。系统的设计不允许外部各方以您尝试的方式在其他窗口上绘图。您将不得不重新调整您的期望。

如果你想画一些东西,你应该创建一个窗口并在上面画画。您可以自由地将窗口设置为透明的分层窗口并定位绘图,使其显示在另一个窗口的顶部。而且您还可以获得不需要运行繁忙循环的好处。您可以使用标准方式绘制,以响应WM_PAINT消息。

答案 1 :(得分:0)

要在桌面上显示分层窗口,您必须调用SetLayeredWindowAttributes函数,例如

   SetLayeredWindowAttributes(hWnd,
           RGB(255, 255, 255),         // The transparent color
           128,                        // Opacity of the window
           LWA_ALPHA | LWA_COLORKEY);  // Enable both features

此示例将使白色窗口的部分完全透明。参数bAlpha指定窗口的不透明度(不受crKey影响的像素)。

这是一个这样的窗口的屏幕截图,其中 Test 文本浮动在浏览器窗口上,并带有以下问题:

Semi-transparent text “Test” floating over the desktop

如果你创建没有边框的窗口,使用这些窗口样式:WS_POPUP | WS_SYSMENU,那么它将在屏幕截图中显示。我在WS_SYSMENU中添加了标准窗口菜单。要强制任务栏显示弹出窗口的按钮,请包含WS_EX_APPWINDOW扩展样式。