VC++玩转炫酷悬浮窗1---悬浮窗的实现
2014-08-21 14:48
169 查看
目标
实现像迅雷那样炫酷的悬浮窗。
计划&方案
首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动。
对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式。
由于是无边框的窗体,默认是不能够移动的。我们尝试用两种办法使其跟随鼠标移动。一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息。
实践
一、 OnNcHitTest方案
这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击的是标题栏,就进入了拖拽模式了。官网参考点这里。
代码十分简单,只需要重载OnNcHitTest就可以。代码填加三处:
1. 头文件
2. 注册消息
3. 函数编写
二、 OnLButtonDown方案
在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。
1.SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
2.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
三、 无边框窗体
Dialog属性中,将Border的属性设为None。
四、 显示png图片
VC对显示png并没有提供很好的支持。本以为像bmp那样,用Picture Control就可以显示出来呢。现在找到一个临时的方案,在OnPaint中将png图片绘制出来。代码如下:
源码在此。
实现像迅雷那样炫酷的悬浮窗。
计划&方案
首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动。
对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式。
由于是无边框的窗体,默认是不能够移动的。我们尝试用两种办法使其跟随鼠标移动。一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息。
实践
一、 OnNcHitTest方案
这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击的是标题栏,就进入了拖拽模式了。官网参考点这里。
代码十分简单,只需要重载OnNcHitTest就可以。代码填加三处:
1. 头文件
afx_msg LRESULT OnNcHitTest(CPoint pt);
2. 注册消息
BEGIN_MESSAGE_MAP(CAfloatWindowDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_NCHITTEST() END_MESSAGE_MAP()
3. 函数编写
LRESULT CAfloatWindowDlg::OnNcHitTest(CPoint pt) { LRESULT nHitTest = CDialog::OnNcHitTest(pt); if(nHitTest == HTCLIENT) { nHitTest = HTCAPTION; } return nHitTest; }
二、 OnLButtonDown方案
在程序获得左键按下的状态时,发送以下任一系统消息都可以实现悬浮窗的拖拽。
1.SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
2.PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
三、 无边框窗体
Dialog属性中,将Border的属性设为None。
四、 显示png图片
VC对显示png并没有提供很好的支持。本以为像bmp那样,用Picture Control就可以显示出来呢。现在找到一个临时的方案,在OnPaint中将png图片绘制出来。代码如下:
if (IsIconic()) { ... } else { CImage img; CPaintDC dc(this); if(!img.IsNull()) img.Destroy(); HRESULT result = img.Load(_T("prime.png")); if(!img.IsNull()) img.Draw(dc.m_hDC, 0, 0); img.Destroy(); CDialogEx::OnPaint(); }
源码在此。
相关文章推荐
- VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体
- VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规)
- 像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(下)
- 玩转VC++实现程序开机运行及注册表修改
- Android炫酷的Toolbar+Bottom+Fab悬浮按钮显示、隐藏、渐变的各种实现姿势
- 玩转VC++实现程序开机运行及注册表修改
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
- 玩转VC++实现CallBack
- Android WindowManager悬浮窗:不需要申请权限实现悬浮
- vc++实现悬浮窗,迅雷360悬浮球效果
- VB的ShowInTaskbar功能分析以及用VC的实现
- [导入]如何在VC中实现动态菜单
- VC中多语菜单的实现
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明。
- VC++实现拨号上网程序
- 图像平滑滚动效果的VC实现
- VC++实现端口截听
- 用VC++实现自绘按钮控制