我希望窗口的一部分以一定的不透明度显示图像,而另一部分正常工作。这两部分都不应该传递点击。我尝试过将主窗口设置为某种颜色,然后使用SetLayeredWindowAttributes将该颜色设置为透明(所以只有客户区是透明的)。然后在它上面有一个子窗口,上面有我的半透明图像。然而,点击通过窗口(即使我没有WS_EX_TRANSPARENT)。Alphablend似乎不起作用,因为位图不是32bmp。所以现在我尝试使用updatelayeredwindows,但我在设置区域以更新它时遇到了麻烦。
case WM_CREATE:
hbmp = (HBITMAP)LoadImageA(NULL, "courtyard.bmp", IMAGE_BITMAP, 1920, 1080, LR_LOADFROMFILE);
HDC hdc = CreateCompatibleDC(NULL);
HBITMAP hbmp_old = (HBITMAP)SelectObject(hdc, hbmp);
POINT dcOffset = {0, 0};
SIZE size = {600, 395};
BLENDFUNCTION bf = {AC_SRC_OVER, 0, 100, 0};
RECT wrect;
GetClientRect(hwnd, &wrect);
wrect.top = wrect.top + 43;
UPDATELAYEREDWINDOWINFO info = {sizeof(info), GetDC(NULL), NULL, &size, hdc, &dcOffset, 0, &bf, ULW_ALPHA, &wrect};
UpdateLayeredWindowIndirect(hwnd, &info);
SelectObject(hdc, hbmp_old);
DeleteDC(hdc);
DeleteObject(hbmp);
HWND hbutton = CreateWindowExA(0,
"BUTTON",
"X",
WS_VISIBLE | WS_CHILD | BS_FLAT,
10,
10,
100,
100,
hwnd,
(HMENU)NULL,
NULL,
(LPVOID)NULL);
break;
wrect的部分只是一个黑色的半透明的颜色。这是我的主窗口:
hwnd = CreateWindowExA(WS_EX_OVERLAPPEDWINDOW | WS_EX_LAYERED,
window_name,
window_title,
WS_OVERLAPPEDWINDOW,
(monitor_dimension.width - window_width) / 2,
(monitor_dimension.height - window_height) / 2 - 75,
window_width,
window_height,
(HWND)NULL,
(HMENU)NULL,
hInstance,
(LPVOID)NULL);
下面是我得到的输出与我想要的输出:
1条答案
按热度按时间vlurs2pr1#
我使用
SetLayeredWindowAttributes(hWnd, RGB(255, 0, 0), 0, LWA_COLORKEY);
得到结果,没有manifest,点击没有通过。下面的代码改编自SetLayeredWindowAttributes() causes mouse clicks to go through after minimizing window | WinAPI。
第一次