C++:世界上唯一能让程序员在配置环境上比写代码还累的语言 😅|

香菇0_0

园龄:2年7个月粉丝:10关注:1

【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 中国大陆许可协议进行许可。

posted @   香菇0_0  阅读(69)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.