2
由于Windows 8,WS_EX_LAYERED可用于子控件,(如此说MSDN)但是我一直无法使它工作。在下面的代码中,我试图让子控件半透明,但是在控件上使用WS_EX_LAYERED时,什么都不绘制。如何在子控件上使用WS_EX_LAYERED
int APIENTRY wWinMain(_In_ HINSTANCE hInst, _In_opt_ HINSTANCE hPrevInst, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
WNDCLASSEX wc = {};
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszClassName = _T("main");
wc.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClassEx(&wc);
HWND MWhwnd = CreateWindowEx(NULL, _T("main"), _T(""),
WS_OVERLAPPEDWINDOW| WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT,0, NULL, NULL, hInst, NULL);
wc.lpfnWndProc = WndProcPanel;
wc.lpszClassName = _T("CPanel");
wc.style = NULL;
RegisterClassEx(&wc);
HWND Panelhwnd = CreateWindowEx(WS_EX_LAYERED, _T("CPanel"), _T(""),
WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS| WS_CLIPCHILDREN,
100, 10, 400, 400, MWhwnd, NULL, hInst, NULL);
COLORREF crefKey = RGB(0, 255, 0);
SetLayeredWindowAttributes(Panelhwnd, crefKey, 155, LWA_ALPHA);
ShowWindow(MWhwnd, nCmdShow);
在这个例子中,我使用一个自定义的控制,但我已经用相同的结果WC_BUTTON
尝试。控件无法绘制。但是我可以让主窗口透明而没有问题。
使用的是Windows 10和VS2015和普通的Win32(没有MFC,ATL等)
考虑从[已知良好的代码(HTTPS工作的GUID:// github.com/Microsoft/Windows-classic-samples/tree/master/Samples/DirectCompositionLayeredChildWindow) –
传递一个颜色键值到'SetLayeredWindowAttributes'是没有意义的,除非你也传递'LWA_COLORKEY'标志。 – IInspectable