Win32防止透明窗口的边框[重复]

问题描述 投票:0回答:1

我正在处理win32。我创建了一个窗口。我想要的是单击区域的透明窗口,但边框不透明。没有标题栏的Extrasly。它看起来应该像一个空的矩形。当我添加以下代码时,我的整个窗口变得透明(边界也透明)。

    SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 75, LWA_ALPHA);
    SetWindowLong(hwnd, GWL_STYLE, 0);

通过添加上面的代码,我的代码输出如下:

不透明度值为255时:

不透明度值为75时

enter image description here

如您所见,边框也是透明的。如何防止变成透明边框,但获得矩形的透明单击区域?谢谢...

c++ winapi transparency
1个回答
1
投票

看来您想使窗口的一部分透明。为此,您需要创建两个窗口才能完成。

  • 使用SetWindowRgn创建带有孔的窗口

  • 使用WS_EX_LAYEREDWS_EX_TRANSPARENT样式放置孔中的另一个透明窗口。

喜欢这个:

enter image description here

某些代码:

hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_VISIBLE | WS_POPUP, 100, 100, 800, 620, NULL, NULL, hInst, 0);
   child = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_POPUP | WS_VISIBLE | WS_CHILD, 300, 300, 200, 300, hWnd, NULL, hInst, 0);
   SetLayeredWindowAttributes(child, RGB(0, 0, 0), 75, LWA_ALPHA);

case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            RECT rect;
            RECT rc;
            COLORREF    brColor;
            brColor = RGB(200, 204, 40);
            hBr = CreateSolidBrush(brColor);     
            GetClientRect(hWnd, &rect);
            rc.left = 200;
            rc.top = 200;
            rc.right = 400;
            rc.bottom = 400;
            hRgnWnd = CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
            hRgnWnd1 = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom);
            CombineRgn(hRgnWnd1, hRgnWnd1, hRgnWnd, RGN_XOR);
            SetWindowRgn(hWnd, hRgnWnd1, true);
            FillRect(hdc, &rect, hBr);

            EndPaint(hWnd, &ps);
        }
© www.soinside.com 2019 - 2024. All rights reserved.