石棉刹车带:VC对话框隐藏运行 (四)悬浮窗
来源:百度文库 编辑:偶看新闻 时间:2024/05/09 09:25:19
VC对话框隐藏运行 (四)悬浮窗
发表时间:2010-7-10 阅读数:544 网友评论:0条Windows的菜单一层一层的,有时操作起来不方便,就想自己写个工具直接调用。对迅雷的悬浮窗垂涎好久了,哈,正好趁这个机会搞一搞。在悬浮窗上用快捷菜单不是很方便吗?在VC知识库中找到了一篇介绍悬浮窗实现的例子,很好,拿来就用,又做了些增强功能,呵呵,特此Show一下。知识库文章地址:点这里。要实现悬浮窗,就得弄明白悬浮窗是什么,有什么行为和作用。悬浮窗其实是一个无边框可以拖动的窗口,再有就是它上面铺满一张图,当然也可以是空白,可以设置透明度,双击可实现主窗口的显示和隐藏,右键有菜单,可以实现快捷操作;还有一点就是它在任务栏中不显示。好了,明白了原理就开始找资料动手了。我的习惯是先攻克所有的技术点,然后再动手写程序。在资源文件中插入一个Dialog,给它添加一个类CFloatWnd。首先是无边框,这个容易,将窗口的Border设为None就可以了。无边框窗口的拖动也很容易,重写OnNcHitTest就可以了。原理就是当用户点击了窗口客户区后,把它当成标题栏来传给操作系统,这样就实现了拖动。代码如下:- LRESULT CFloatWnd::OnNcHitTest(CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- LRESULT nHitTest = CDialog::OnNcHitTest(point);
- if (nHitTest == HTCLIENT && GetAsyncKeyState(MK_LBUTTON) < 0 ) //如果是客户区//如果鼠标左键按下,GetAsyncKeyState函数的返回值小于0
- nHitTest = HTCAPTION; //则把它当成标题栏
- return nHitTest;
- //return CDialog::OnNcHitTest(point);
- }
- // 让窗体和Logo相符
- //mfc里的Attach和Detach函数主要用于对mfc类对象跟sdk句柄
- //之间关联的处理,attach将mfc类对象与句柄关联起来
- //对该对象的操作都会施加在相应的句柄身上
- //detach则消除这种关联关系
- CBitmap m_Bitmap;
- HBITMAP hBitmap = m_Logo.GetBitmap();
- ASSERT(hBitmap);
- m_Bitmap.Attach(hBitmap);//关联
- BITMAP bmp;
- m_Bitmap.GetBitmap(&bmp);
- int nX = bmp.bmWidth;
- int nY = bmp.bmHeight;
- MoveWindow(0,0,nX,nY); //窗口移到左上角并设置宽高
- m_Logo.MoveWindow(0,0,nX,nY); //图片移到窗口的左上角
- CenterWindow(); //窗口居中
- ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);//窗口置顶
- m_Bitmap.Detach(); //释放关联
- //显示
- m_FloatWnd.Create(CFloatWnd::IDD,this);//注意父窗口为this
- m_FloatWnd.ShowWindow(SW_SHOW);
- //显示的时候隐藏,隐藏的时候显示
- void CFloatWnd::OnShowHide()
- {
- CWnd *pParent = GetParent(); //得到父窗口,即主窗口
- ASSERT(pParent);
- if(pParent->IsWindowVisible()) //如果显示
- pParent->ShowWindow(SW_HIDE); //则隐藏
- else //否则显示
- pParent->ShowWindow(SW_SHOW);
- }
- //在窗口双击事件中调用
- void CFloatWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- OnShowHide();
- CDialog::OnNcLButtonDblClk(nHitTest, point);
- }
- //加载右键菜单
- m_Right.LoadMenu(IDR_MENU_FloatWnd);
- //加载好了就要在OnRButtonUp中显示了:
- //鼠标右键显示弹出菜单
- void CFloatWnd::OnRButtonUp(UINT nFlags, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- CMenu *pSub = m_Right.GetSubMenu(0); //取第一个子菜单
- ClientToScreen(&point); //转换坐标为窗口坐标
- pSub->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this,NULL);//显示
- CDialog::OnRButtonUp(nFlags, point);
- }
- //显示是显示了,可没有功能,嗯,那就做消息映射写代码喽:
- ON_COMMAND(ID_Exit, OnExit) //右键退出
- ON_COMMAND(ID_ShowHide, OnShowHide) //右键显示/隐藏
- //OnShowHide的代码有了,下面是OnExit:
- //退出
- void CFloatWnd::OnExit()
- {
- CWnd *pParent = GetParent();
- this->DestroyWindow(); //销毁自己
- pParent->DestroyWindow(); //销毁主窗口
- }
- //在CMainAppDlg::OnInitDialog()中
- //设定滑动条最大值和最小值
- m_Slider.SetRangeMax(255,TRUE);
- m_Slider.SetRangeMin(1,TRUE);
- //鼠标单击时一次滚动个单位
- m_Slider.SetPageSize(10);
- //设置透明度函数
- void CFloatWnd::OnUpdateTransparent(int iTransparent)
- {
- SetLayeredWindowAttributes(0,iTransparent,2);
- //在VC6中请用如下代码
- //HINSTANCE hInst = LoadLibrary("User32.DLL");
- //if(hInst)
- //{
- // typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
- // SLWA pFun = NULL;
- // //取得SetLayeredWindowAttributes函数指针
- // pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");
- // if(pFun)
- // {
- // pFun(m_hWnd,0,iTransparent,2);
- // }
- // FreeLibrary(hInst);
- //}
- }
- //在CFloatWnd::OnInitDialog()中给窗体加入扩展属性,否则无法设置透明度
- //加入WS_EX_LAYERED扩展属性
- SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
- //默认不透明
- OnUpdateTransparent(255);
运行一个VC++ 基本对话框
怎样将开始--运行对话框隐藏?
请教VC 我用MFC 问:可不可以将对话框的标题栏隐藏
VC对话框的问题
VC 对话框资源
怎么样可以隐藏运行对话框/哪位老大给讲一下!
vc中如何删除对话框?
vc中如何调用对话框
vc++怎样连接两个对话框
vc 如何关闭当前对话框
vc 对话框按位置显示
vc++6中的用按F11运行时怎么总出现PLease enter the path for ...对话框?
QQ的悬浮窗口能完全隐藏吗?
vc运行错误
运行vc++ 重启
什么是运行对话框??如何打开运行对话框`???.
什么是运行对话框??如何打开运行对话框`???..
什么是运行对话框??如何打开运行对话框`???....
什么是运行对话框??如何打开运行对话框`???
什么是运行对话框??如何打开运行对话框`???.....
什么是运行对话框??如何打开运行对话框`???...
VC如何动态隐藏控件
vc 显示与隐藏工具栏
迅雷悬浮窗找不到了