c++ - 如何创建没有透明内容的完全透明窗口?

标签 c++ windows winapi

我试过这个:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;

        case WM_DESTROY:
            PostQuitMessage(0);
        break;

        case WM_SIZE:
        case WM_MOVE:
        case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd, &ps);
            EndPaint(hwnd, &ps);
            return 0;
        }

        case WM_CTLCOLORSTATIC:
        {
            HDC hdc = (HDC) wParam; 
            SetBkMode (hdc, TRANSPARENT);
            return (LRESULT)(GetStockObject(NULL_BRUSH));
        }

        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int main()
{
    WNDCLASSEX wc;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = NULL;
    wc.hIcon         = NULL;
    wc.hCursor       = NULL;
    wc.hbrBackground = (HBRUSH)(GetStockObject(NULL_BRUSH));
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = L"MY CLASS";
    wc.hIconSm       = NULL;

    RegisterClassEx(&wc);

    HWND hwnd = CreateWindowEx(0, L"MY CLASS", NULL, WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, NULL, NULL);
    HWND child = CreateWindowEx(0, L"STATIC", L"Text", WS_VISIBLE | WS_CHILD , 50, 50, 50, 50, hwnd, NULL, NULL, NULL);

    UpdateWindow(hwnd);

    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return 0;
}

它创建的窗口看起来是透明的,因为它显示的内容与屏幕上的相同,但是移动窗口后主窗口背景保持不变。我想问一下,问题可能出在哪里。

附言这只是测试代码,所以请不要写不适合我的问题的建议。

谢谢。

编辑:我想要这个是因为我将为不知道如何做某些事情的用户制作一些帮助程序。结果应该类似于一些带有标记点的常规程序 View ,这意味着按此处、按此处、按此处等。

最佳答案

我认为你的起点应该是看一下 Layered Windows

http://msdn.microsoft.com/en-us/library/ms997507.aspx

这是玩自定义形状和(半)透明窗口的最常见方式。

更新。还有用于制作自定义形状窗口的旧 API:

int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );

关于c++ - 如何创建没有透明内容的完全透明窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677703/

相关文章:

delphi - CreateProcess 立即返回,但前提是启动的进程被隐藏

c++ - 尝试使用 GetObject() 获取默认背景颜色;

java - Java 不包括运算符重载(至少对于赋值而言)的更根本原因是什么?

c++ - 指向类成员函数的函数指针问题

windows - 使用分层窗口创建平滑的窗口边框

python - Pyinstaller .exe 可从终端运行,但不能通过双击 -> 闪烁控制台窗口

c - Win32中的GetFirstChild?

c++ - 如何找到排序数组的模式?

c++ - 如何修复此错误 : set a breakpoint in malloc_error_break to debug

java - Ant GET 任务和代理