【mfc】创建可拖拽透明窗体
我最近想实现一个桌面悬浮倒计时小程序,功能很简单,但是在实现的过程中发现了许多坑,解决了问题之后,将这些问题进行记录,以便以后的快速查找。
一、实现拖拽效果
可通过在OnNcHitTest添加以下代码,即可实现简单的拖拽效果:
UINT nHitTest = CDialog::OnNcHitTest(point);
return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;
但是这种实现对话框中的左右键消息响应会被屏蔽,如果想要在对话框中弹出右键菜单则不能用上述方法,经过一番搜索,发现可通过在OnLButtonDown添加以下代码实现不影响鼠标事件的拖拽:
__super::OnLButtonDown(nFlags, point);
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
二、透明窗体实现
在OnInitDialog初始化方法下添加以下代码:(最后一行ModifyStyleEx非常重要,如果没有的话对话框无法响应任何鼠标事件)
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | WS_EX_LAYERED);
::SetLayeredWindowAttributes(GetSafeHwnd(), 0, 128, LWA_ALPHA);
ModifyStyleEx(WS_EX_TRANSPARENT, 0, SWP_FRAMECHANGED);
三、窗口置顶
在OnInitDialog初始化方法下添加以下代码:
::SetWindowPos(GetSafeHwnd(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_DRAWFRAME);
四、效果展示
实现了一个透明的置顶可拖拽悬浮窗口。(其他的逻辑代码就不贴出了)
本文作者:香菇0_0
本文链接:https://www.cnblogs.com/Xiang-gu/p/16770836.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步