如何清除HWND,使其能显示下面的所有内容?

时间:2019-05-10 21:28:29

标签: winapi

我正在尝试制作一个应用程序,该应用程序将使所有具有焦点的窗口变灰。我已经看到了一个,但是它希望具有焦点的一个优先于其余所有,不是这种情况(在鼠标模式下使用焦点)。

因此,我认为这很简单,我可以复习一些旧的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的方法,但是如何清除?

编辑

我尝试过的其他事情是:

  1. MyRegisterClass()函数中,我将WNDCLASSEXW::hbrBackground设置为(HBRUSH)NULL_BRUSH
  2. WM_PAINT消息处理程序中,在调用PAINTSTRUCT::fErase之前,我已经将TRUE设置为EndPaint()

这些都不起作用。

0 个答案:

没有答案