部分点击分层Windows Win32
partially click through on layered windows win32
在win32或atl/wtl c ++中使用分层窗口时,如果我将主窗口的alpha设置为0并在子窗口上绘画,假窗口以便可查看并单击窗口,则整个窗口都是点击通过的。我希望能够只点击窗口的区域,而不是整个窗口,假设我想画一个圆角窗口,我让底部/主窗口被点击,但我不希望上面的"假"窗口被点击通过,我希望能够点击它。我该怎么做?到目前为止,我所处的位置:在主窗口的 OnInitDialog 函数中:
::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
BYTE bTran = 0;
::SetLayeredWindowAttributes( m_hWnd, 0, bTran, LWA_ALPHA);
当我创建假窗口时:
m_hFakeWnd = ::CreateWindowEx( WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_LEFT
, m_strWndClassName
, NULL
, WS_VISIBLE | WS_OVERLAPPED
, rc.left
, rc.top
, rc.Width()
, rc.Height()
, GetSafeHwnd()
, NULL
, ::GetModuleHandle(NULL)
, NULL
);
如果,我设置了消除WS_EX_TRANSPARENT标志,假窗口是可点击的,而主要窗口是点击通过的,但是! 它不响应任何东西! 点击/拖动。 没有。
听起来
您只是为了拦截点击而覆盖另一个窗口?
无论如何,您需要处理窗口的WM_NCHITTEST
消息,以便能够让系统知道特定位置是透明的,在这种情况下,您返回HTTRANSPARENT
:
在同一线程中当前由另一个窗口覆盖的窗口中(消息将发送到同一线程中的基础窗口,直到其中一个窗口返回非 HTTRANSPARENT 的代码)。
在要接受点击的区域中使用 alpha 1 而不是 0。窗口仍然完全不可见,但 alpha 1 的区域将正常记录点击和鼠标移动。
请注意,要获得每像素的 alpha,您需要使用 UpdateLayeredWindow
而不是 SetLayeredWindowAttributes
。
创建两个窗口,一个具有点击属性,另一个具有普通属性。
相关文章:
- 从预处理器获取 Windows 版本(C++ Win32)
- Windows 嵌入式标准不是有效的 win32 c++
- 在通用 Windows 应用程序C++上使用 win32 DLL 库
- C++ Win32 列表框和滑块创建 Windows 应用程序
- Windows资源监视器使用哪些Win32函数来检测已终止进程的磁盘和网络活动
- 哪个Windows SDK最适合我C++Win32
- Win32程序在Windows 8上调用GetSaveFileName()或SHBrowseForFolder()时崩溃
- 注册以在 MFC 中发出 Win32 事件信号时接收 Windows 消息
- 部分点击分层Windows Win32
- 使用win32监视Windows任务栏状态更改
- 是否可以在Windows 8环境上在Visual Studio 2005上运行VC ,Win32应用程序
- 用Win32/C API更改Windows 7壁纸(未实现操作异常)
- Windows Update Agent pure win32 APIs
- 在Windows(win32或C++)中使用互斥锁的进程间同步
- HwndHost for Windows Form - Win32 / WinForm Interoperability
- Win32应用程序,在调用Windows内容之前调用自定义类方法
- 无法在VS 2013、Windows 8.1中创建Win32控制台应用程序
- C++/Win32 我在 Windows 2000+ 上启动线程的最佳方式
- 在QT for Windows中使用Win32 API
- 使用本机windows API实现win32线程安全队列