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

时间:2013-09-07 20:38:55

标签: 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;
}

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

P.S。它只是测试代码,所以,请不要写出不适合我的问题的建议。

感谢。

编辑:我想要这个,因为我会为那些不知道如何做某事的用户做一些帮助。结果应该是常规的一些程序视图,标记出来的点,按此处的是什么,在这里,在这之后等等。

1 个答案:

答案 0 :(得分:3)

我认为你的起点应该是看看分层Windows

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

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

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

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