技术含量:没有

实现方法:UpdateLayeredWindow

完整源码下载:XunleiX.zip

// XunleiXDlg.cpp : 实现文件
//#include "stdafx.h"
#include "XunleiX.h"
#include "XunleiXDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CXunleiXDlg 对话框CXunleiXDlg::CXunleiXDlg(CWnd* pParent /*=NULL*/): CDialog(CXunleiXDlg::IDD, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_bTracking=m_bHover=false;
}void CXunleiXDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CXunleiXDlg, CDialog)ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPON_WM_MOUSEMOVE()ON_WM_LBUTTONDOWN()ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)ON_WM_RBUTTONDOWN()ON_COMMAND(IDM_TENCENT,OnMenu_Tencent)ON_COMMAND(IDM_SINA,OnMenu_Sina)ON_COMMAND(IDM_EXIT,OnMenu_Exit)
END_MESSAGE_MAP()// CXunleiXDlg 消息处理程序BOOL CXunleiXDlg::OnInitDialog()
{CDialog::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标//===============================================SetWindowText(_T("XunLei X"));::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);InitUI();DrawUI();//===============================================m_ToolTip.Create(this);m_ToolTip.SetMaxTipWidth(1024);EnableToolTips(TRUE);CString strTooltip=_T("XunleiX 左键移动、右键弹出菜单");CRect rc(5,5,95,25);m_ToolTip.AddTool(this,strTooltip,&rc,100);//===============================================return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CXunleiXDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CXunleiXDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CXunleiXDlg::InitUI(void)
{m_nWidth=100;m_nHeight=30;LoadResImage(IDR_PNG1,m_pSrcImage);//载入资源中的皮肤PNG图片ModifyStyleEx(0,WS_EX_LAYERED);
}void CXunleiXDlg::DrawUI(void)
{HDC hDC=::GetDC(m_hWnd);HDC hMemDC=::CreateCompatibleDC(hDC);BITMAPINFO bitmapinfo;bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bitmapinfo.bmiHeader.biBitCount = 32;bitmapinfo.bmiHeader.biHeight = m_nHeight;bitmapinfo.bmiHeader.biWidth = m_nWidth;bitmapinfo.bmiHeader.biPlanes = 1;bitmapinfo.bmiHeader.biCompression=BI_RGB;bitmapinfo.bmiHeader.biXPelsPerMeter=0;bitmapinfo.bmiHeader.biYPelsPerMeter=0;bitmapinfo.bmiHeader.biClrUsed=0;bitmapinfo.bmiHeader.biClrImportant=0;bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;HBITMAP hBitmap=::CreateDIBSection (hMemDC,&bitmapinfo, 0,NULL, 0, 0);HBITMAP hOldBitmap = (HBITMAP)::SelectObject (hMemDC,hBitmap);    //画出各个界面元素---------------------------------------------DrawUI(hMemDC);  //设置透明窗口-------------------------------------------------CPoint DestPt(0,0);CSize psize(m_nWidth,m_nHeight);BLENDFUNCTION blendFunc32bpp;blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;blendFunc32bpp.BlendFlags = 0;blendFunc32bpp.BlendOp = AC_SRC_OVER;blendFunc32bpp.SourceConstantAlpha = 255;::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,hMemDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);//释放资源-------------------------------------------------::SelectObject (hMemDC,hOldBitmap);::DeleteObject(hBitmap);::DeleteDC(hMemDC);::ReleaseDC(m_hWnd,hDC);
}
void CXunleiXDlg::DrawUI(HDC hDestDC)
{Graphics g(hDestDC);if(m_bHover){g.DrawImage(m_pSrcImage,RectF(0,0,100,30),0,30,100,30,UnitPixel,NULL,NULL,NULL);}else{g.DrawImage(m_pSrcImage,RectF(0,0,100,30),0,0,100,30,UnitPixel,NULL,NULL,NULL);}
}
void CXunleiXDlg::LoadResImage(int nResID,Image * &lpImage)
{HINSTANCE hIns=AfxGetInstanceHandle();HRSRC hRsrc = ::FindResource (hIns,MAKEINTRESOURCE(nResID),_T("PNG")); // type if (!hRsrc) return; // load resource into memory DWORD len = SizeofResource(hIns, hRsrc); BYTE* lpRsrc = (BYTE*)LoadResource(hIns, hRsrc); if (!lpRsrc) return; // Allocate global memory on which to create stream HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len); BYTE* pmem = (BYTE*)GlobalLock(m_hMem); memcpy(pmem,lpRsrc,len); IStream* pstm; CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream lpImage=Gdiplus::Image::FromStream(pstm); // free/release stuff GlobalUnlock(m_hMem); pstm->Release(); FreeResource(lpRsrc);
}
void CXunleiXDlg::OnMouseMove(UINT nFlags, CPoint point)
{CDialog::OnMouseMove(nFlags, point);if (!m_bTracking){TRACKMOUSEEVENT tme;tme.cbSize = sizeof(tme);tme.hwndTrack = m_hWnd;tme.dwFlags = TME_LEAVE | TME_HOVER;tme.dwHoverTime = 50;m_bTracking = (bool)_TrackMouseEvent(&tme);}
}
LRESULT CXunleiXDlg::OnMouseHover(WPARAM   wParam,   LPARAM   lParam)
{m_bHover=true;DrawUI();return 0;
}
LRESULT CXunleiXDlg::OnMouseLeave(WPARAM   wParam,   LPARAM   lParam)
{m_bTracking=false;m_bHover=false;DrawUI();return 0;
}
void CXunleiXDlg::OnLButtonDown(UINT nFlags, CPoint point)
{CDialog::OnLButtonDown(nFlags, point);ReleaseCapture ();SendMessage (WM_NCLBUTTONDOWN, HTCAPTION, 0);
}void CXunleiXDlg::OnRButtonDown(UINT nFlags, CPoint point)
{CDialog::OnRButtonDown(nFlags, point);ReleaseCapture ();TrackPopupMenu();
}
void CXunleiXDlg::TrackPopupMenu()
{CMenu menu;menu.CreatePopupMenu();menu.AppendMenu(MF_ENABLED|MF_STRING,0,_T("XunleiX"));menu.AppendMenu(MF_SEPARATOR);menu.AppendMenu(MF_ENABLED|MF_STRING,IDM_TENCENT,_T("作者腾讯微博(&T)"));menu.AppendMenu(MF_ENABLED|MF_STRING,IDM_SINA,_T("作者新浪微博(&W)"));menu.AppendMenu(MF_SEPARATOR);menu.AppendMenu(MF_ENABLED|MF_STRING,IDM_EXIT,_T("退出(&X)"));//==================================================CRect rc;GetWindowRect(&rc);menu.TrackPopupMenu(TPM_LEFTBUTTON,rc.left,rc.bottom,this);
}
void CXunleiXDlg::OnMenu_Tencent()
{ShellExecute(NULL,_T("open"),_T("http://t.qq.com/dengxuebin"),NULL,NULL,SW_SHOW);
}
void CXunleiXDlg::OnMenu_Sina()
{ShellExecute(NULL,_T("open"),_T("http://www.weibo.com/dengxuebin"),NULL,NULL,SW_SHOW);
}
void CXunleiXDlg::OnMenu_Exit()
{PostMessage(WM_CLOSE);
}
BOOL CXunleiXDlg::PreTranslateMessage(MSG* pMsg)
{m_ToolTip.RelayEvent(pMsg);return CDialog::PreTranslateMessage(pMsg);
}

完整源码下载: XunleiX.zip

迅雷X - 类似迅雷的悬浮窗口相关推荐

  1. [转贴]去除迅雷广告和弹出广告窗口

    清除默认配置状态弹出的广告: 1.在主界面点击"工具"-"配置",在"配置"窗口左边选择"高级"选项卡,把右边" ...

  2. -------实现一个类似迅雷的系统“福雷(FULEI)”

    缓存]迅雷(XUNLEI)的工作原理揭密 迅雷(XUNLEI)如何搜索一个资源的多服务器版本? -------实现一个类似迅雷的系统"福雷(FULEI)" 来自:http://bl ...

  3. 原来qq下载也有类似迅雷的功能了

    原来qq下载也有类似迅雷的功能了 .. posted on 2012-09-30 07:38 lexus 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.c ...

  4. 【Linux】一种类似迅雷的下载器安装

    谷歌chrome浏览器有时会遇到下载链接自动被拦截的问题,在Win系统中可以用"迅雷"来下载某链接,但linux系统中没有迅雷,这里记录一种类似迅雷的下载器--uget和aria2 ...

  5. ubuntu上三个类似迅雷的多线程下载工具

    ubuntu上三个类似迅雷的多线程下载工具 MultiGET 同济大学的Linux高手做的MultiGet,具有类似迅雷这样的多线程下载能力. 最新版本MultiGet为您提供更快速下载多线程和服务器 ...

  6. android 360 悬浮窗口,Android实现类似360,QQ管家那样的悬浮窗

    一.前言: 我手机从来不装这些东西,不过,有次看到同事的android手机上,有个QQ管家在桌面上浮着,同事拖动管家时,管家就变成一只鸟,桌面下方还有个弹弓,桌面顶部有只乌鸦,把管家也就是鸟拖动到弹弓 ...

  7. Android WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

    1.理清概念 我们使用过Dialog和PopupWindow,还有Toast,它们都显示在Activity之上.那么我们首先需要理解的是android中是如何去绘制这些UI的呢?这里我只讲我所理解的, ...

  8. android WindowManager 应用内部悬浮窗口总结

    很多地方用到悬浮窗口,但是android现在做了很多限制,禁止悬浮窗口的滥用,尤其是系统权限的窗口基本不予支持,以下是介绍应用内部悬浮窗口不需要任何系统权限的 1   显示一个悬浮窗 // wm = ...

  9. 通用的桌面悬浮窗口的实现

    现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作.今天这篇文章,就是介绍如何实现桌面悬浮窗效果的. 首先,看一下效果图. 悬浮窗 ...

最新文章

  1. maven-约定优于配置
  2. threejs指定对象旋转中心
  3. 请输入星期的第一个字母c语言,C语言经典案例:请输入星期几的第一个字母来判断一下是星期几,...
  4. 【CV101大会录播】人流密度/河道污染/安全帽识别获奖算法
  5. 通俗易懂的rpc原理
  6. Android线程和线程Handler基础一览
  7. popupWindow的使用心得
  8. SpringNote01.基于SpringMVC-Hibernate的Blog系统
  9. Connected to the target VM, address: '127.0.0.1:60885', transport: 'socket'
  10. checkbox选中与取消选择
  11. 【行为识别】基于matlab轨迹法行为识别【含Matlab源码 375期】
  12. IT英语4-计算机英语缩写术语
  13. html在线编辑器源代码,最完整的html在线编辑器 - WEB源码|其它源码|源代码 - 源码中国...
  14. RIPS-0.55 对securing fuction的检查方法
  15. OpenGL地球(自转+贴图)
  16. 阿啊-有意思的表情包
  17. linux终端关闭xmanager,xmanager之linux 解决方法
  18. Android系统VIN码识别SDK
  19. 我们需要有创业精神,但不是每个人都要去创业
  20. RocketMQ重试策略及与Springboot整合

热门文章

  1. ABP 初探 之 多语言
  2. eNodeB 伪基站辨识与优化
  3. 大数据 | 实验四:并行化数据挖掘算法设计
  4. audio codec 24bit/48KHz与24bit/192Khz区别
  5. 【经验分享】如何同时运行多个python脚本
  6. 谷歌chrome浏览器打开黑屏怎么解决
  7. 基于WebGL、Cesium技术的三维空间可视化
  8. 【2023复旦微电子提前批笔试题】~ 题目及参考答案
  9. [Java]简单实现计时功能
  10. 分数计算器 C++ 实现分数计算、分数排序