我正在尝试制作一个应用程序,该应用程序将使所有具有焦点的窗口变灰。我已经看到了一个,但是它希望具有焦点的一个优先于其余所有,不是这种情况(在鼠标模式下使用焦点)。
因此,我认为这很简单,我可以复习一些旧的WinAPI技能。我在VS2017中创建了一个标准的Windows桌面应用程序,并修改了InitInstance()
函数
创建窗口:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd = CreateWindowEx(
WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST
| WS_EX_TOOLWINDOW
, szWindowClass, szTitle
, NULL // no style
, 0, 0, 640, 480 // initial window rect
, NULL // parent window (desktop)
, NULL // no menu
, GetModuleHandle(NULL), 0);
删除标题栏,把手等:
SetWindowLong(hWnd, GWL_STYLE, 0);
我希望它是不透明的,但具有alpha混合的透明度:
SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);
所以,现在我得到一个白色的窗口弹出窗口。它没有标题栏或菜单,它位于我所有其他窗口的上方,当我单击它时,它会被忽略,从而可以访问下面的窗口。如果我将不透明度设置为小于255,则可以通过窗口看到。
但是,我似乎无法阻止它变白。我只想将其保留为空白,以便在绘制时将显示具有适当alpha混合属性的绘制内容。
环顾四周,我发现How to "Clear" a WinAPI Transparent Window,但这是针对窗口上的控件的,而不是窗口本身的。因此,我认为这并不真正适用。另外,我真的不想做遍历所有窗口并将内容扫视到内存DC,然后将其扫视到我的窗口DC的工作。真傻。必须有某种清除DC的方法,但是如何清除?
我尝试过的其他事情是:
MyRegisterClass()
函数中,我将WNDCLASSEXW::hbrBackground
设置为(HBRUSH)NULL_BRUSH
。WM_PAINT
消息处理程序中,在调用PAINTSTRUCT::fErase
之前,我已经将TRUE
设置为EndPaint()
。这些都不起作用。