子窗口的透明度必须小于父窗口的透明度。如果子窗口的透明度大于等于父窗口的透明度,那么子窗口将变得不可见,完整demo解释
时间: 2023-07-19 14:12:21 浏览: 48
是的,如果子窗口的透明度大于等于父窗口的透明度,那么子窗口将变得不可见。以下是一个完整的示例程序,演示了如何正确设置父窗口和子窗口的透明度。
```c++
#include <Windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
const char CLASS_NAME[] = "Sample Window Class";
const char WINDOW_NAME[] = "Sample Window";
WNDCLASS wc{};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
WS_EX_LAYERED, // 设置为分层窗口
CLASS_NAME,
WINDOW_NAME,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
nullptr,
nullptr,
hInstance,
nullptr
);
if (hwnd == nullptr) {
return 0;
}
// 将父窗口的透明度设置为 50%
SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA);
HWND childHwnd = CreateWindowEx(
0,
CLASS_NAME,
"Child Window",
WS_CHILD | WS_VISIBLE,
50, 50,
200, 100,
hwnd,
nullptr,
hInstance,
nullptr
);
if (childHwnd == nullptr) {
return 0;
}
// 将子窗口的透明度设置为 25%
SetLayeredWindowAttributes(childHwnd, 0, 64, LWA_ALPHA);
ShowWindow(hwnd, nCmdShow);
MSG msg{};
while (GetMessage(&msg, nullptr, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
```
在这个示例程序中,我们创建了一个父窗口和一个子窗口,并将它们的透明度分别设置为 50% 和 25%。由于子窗口的透明度小于父窗口的透明度,所以子窗口可以正常显示。如果将子窗口的透明度设置为 50% 或更高,子窗口将变得不可见。