




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最近看了桌面天气秀这款小软件,其界面精致漂亮,而且可以透明显示,还有个特别有趣的功能就是能让窗体固定在桌面上并且鼠标可以“穿透”而窗体不受任何影响,这就是带着些许神秘的“有影无形”的功能。 事实上要实现这种“有影无形”的功能,很简单,我相信聪明的您一定很快会想到怎么做。几句代码就可以搞定,给你点提示,只有在2000以上的Win操作系 统才支持(当然如果你有足够的时间可以完全可以在98上实现)。那么今天我们主要讨论一下窗体的半透明显示,其实,如果仅仅要实现窗体的半透明显示,很简 单,UpdateLayeredWindow调用就可以了,网上去搜一下几乎都是贴的这个函数怎么怎么实现窗体的半透明,在往下就没了,比如此函数有个缺 陷,就是经过此函数处理过的窗体,其上面的控件都透明了。诸如此类的问题至少到现在我在网上没找到一个让人感觉满意的解决方案。 记得在一个所谓专业的C#网站上看到一篇题为“XP下透明窗体的完美实现”,当时看了还真高兴一阵子,可是把代码下下来一看,又是被忽悠了,里面就调用了 UpdateLayeredWindow函数实现透明然后加个旋转显示,这样子就算完美了,我晕!这个函数查查资料谁不会。看来还是自己动手,不知道有心 的朋友注意到没有,在桌面天气秀里,打开设置,然后快速拖动,会看到上面的窗体明显脱离,这就是多层窗口留下的尾巴。下面的透明窗体是背景,上面的窗体承 载控件。在拖动下层窗体的时候让上层窗体跟着一起动。对于小软件来说,效果还可以。事实上,今天我实现的也和这个思路差不多,不过我这个上下两层窗体是父 子关系,它们各施其职,但是又没有拖动时留下的尾巴(窗口移动的处理),我把这些功能都封装在一起了,只需要简单地把你要在透明窗体上显示的窗体传过去以 及透明处理的图片就OK了。限于篇幅下面给绘制函数以及调用示例:bool DrawAlpha(Image* pBgImg, HWND hWnd)if (!:IsWindow(hWnd) return false;CWndDecorate wndDecor(hWnd);/wndDecor.SetAlpha(255 * 20) / 100);/wndDecor.ShowOnDesk();RECT rcWnd;:GetWindowRect(hWnd, &rcWnd);int nWid = rcWnd.right - rcWnd.left;int nHei = rcWnd.bottom - rcWnd.top;HDC hdcTemp = :GetWindowDC(hWnd);HDC hdcMemory = :CreateCompatibleDC(hdcTemp);HBITMAP hBitMap = CreateCompatibleBitmap(hdcTemp, nWid, nHei);SelectObject(hdcMemory, hBitMap);HDC hdcScreen = :GetWindowDC(hWnd);POINT ptWinPos = rcWnd.left, rcWnd.top;Graphics graph(hdcMemory);Point points = Point(0, 0),Point(nWid, 0),Point(0, nHei);graph.DrawImage(pBgImg, points,3);SIZE sizeWindow=nWid, nHei;POINT ptSrc=0,0;DWORD dwExStyle = :GetWindowLong(hWnd, GWL_EXSTYLE);if (dwExStyle & 0x80000) != 0x80000):SetWindowLong(hWnd, GWL_EXSTYLE, dwExStyle 0x80000);CString strTitle;m_alWnd.GetWindowText(strTitle);Gdiplus:Font font(L宋体,12,FontStyleBold,UnitPixel);StringFormat strFormat;SolidBrush brush(Color(0xff,0,0,0);graph.DrawString(strTitle, -1, &font, PointF(32,30),&strFormat, &brush); :UpdateLayeredWindow(hWnd, hdcScreen, &ptWinPos, &sizeWindow, hdcMemory, &ptSrc, 0, &m_alBlend, ULW_ALPHA);graph.ReleaseHDC(hdcMemory);:ReleaseDC(hWnd,hdcScreen);hdcScreen = NULL;:ReleaseDC(hWnd,hdcTemp);hdcTemp = NULL;DeleteObject(hBitMap);DeleteDC(hdcMemory);hdcMemory = NULL;return true;调用示例:CWndAlpha wndAl;wndAl.InitAlpha(LC:bg.png, NULL, rcMargin, true);m_pMainWnd = wndAl.GetMainWnd();wndAl.DoModal();本篇演示实现仿QQ界面的中间客户区。QQ是可以调整界面透明度的,但是调整了透明度却连中间客户区也变得半透明了。客户区毕竟是软件最重要的部分,是要 与用户交互的,透明了就影响操作了,因此这里的客户区不学QQ,始终不透明。要实现不透明控件,只能创建一个弹出窗口,遮住主界面的客户区域,然后设定与 主界面连动,即始终跟着主窗口移动及调整尺寸。这个方法并不是很好,但却几乎是唯一的方法。为什么说几乎是唯一的方法呢?的确存在着另外的解决方案,但是 这个方法太麻烦了,在此讨论一下这个方法。 fVd_6Lf ph5i2U0 实 现半透明窗体,不透明控件,应该有不少朋友碰到过这个问题:为什么设定了窗口透明,窗口上的子窗口及控件也变得透明了?这个是受系统限制的,创建一个窗 口,这个窗口区域就相当于一块画布,最终系统要在这块画布上绘制出窗口标题,客户区,控件等等,而窗口和控件绘制时的GetDC,BeginPaint等 不过是获取到了跟自己相关的这块画布的一部分,在限定的区域内绘制,最终是画到这块画布上,系统最后显示窗口就是在桌面上显示这块画布,透明度也是认这块 画布,因此上面的子窗口及控件也一起变得透明了。另建一个弹出式窗口,相当于创建了另一块画布,就不受主窗口的透明度限制。 dX/7n= nA 知 道了原因,现在来讨论如何不创建弹出式窗口,实现不透明控件。透明窗口有两种实现方法,一种是调用 SetLayeredWindowAttributes,设定统一的窗口透明度,既整个窗口采用同样的透明度,QQ2009和这里的演示程序采用的就是这 个方法,这个方法不创建弹出窗口是无法实现不透明控件的,因为想要控件不透明,就必须在控件区域采用不同的透明 度,SetLayeredWindowAttributes无法做到,只能通过调用另一个函数UpdateLayeredWindow来实现可指定不同区 域不同透明度的窗口,API代码大致如下: 37kFbRx Ny7*MZ- C/C+ code HDC hdc,hMemDC; TSewq4K RECT rc; 0ex.S_Oj4 IXtG 36O GetWindowRect(hWnd,&rc); M; uFSU|SDd. POINT ptSrc = 0,0; _x(hlHFk POINT ptWinPos = rc.left,rc.top; GgY8u SIZE szWin = rc.right-rc.left,rc.bottom-rc.top; !0?o3,of- BLENDFUNCTION stBlend = AC_SRC_OVER, 0,255,AC_SRC_ALPHA; U=yvi8 !gWxVGv hdc = GetWindowDC(m_hWnd); &Iy58 hMemDC = CreateCompatibleDC(hdc); OQP;5 #K SelectObject(hMemDC,hbmp); /hbmp为整个窗口贴图 aXj UDu7 UpdateLayeredWindow(hWnd,hdc,&ptWinPos,&szWin,hMemDC,&ptSrc,0,&stBlend,ULW_ALPHA); gNP1UH4m 8%B_nVc ,zxRDI 最 关键的部分就是SelectObject(hMemDC,hbmp);实现不同区域不同透明度,全在这个选入设备的hbmp的图象数据,Windows的 32位色图像的像素数据是COLORREF类型,0x00bbggrr格式,关键就在最高位的字节0x00,UpdateLayeredWindow是认 这个字节来设定透明度,0x00为全透明,0xFF为不透明,这个字节的集合有个专门名称叫ALPHA通道。设定hbmp图象每一个像素的这个最高位字节 数据,就可以实现像素级别的透明度。网上应该能搜到大把利用PNG图片实现半透明窗口的例子,因为PNG图片是可以带ALPHA通道的,解码PNG图片, 自然就有了ALPHA通道,即设定了这个最高位字节,就不需要用代码来一个个像素指定透明度了。实现这样的半透明窗口是这样一个过程:首先要用双缓冲,创 建与窗口相同大小的内存图象,然后在这个内存图象上绘制窗口的各个部分,标题栏,背景等等,一般是用PNG图片实现,这样就不用逐个像素指定透明度了,最 后把这个内存图象绘制到窗口。想实现不透明控件,就要把控件区域的ALPHA通道值设为0xFF,然而不幸的是,几乎所有的GDI操作,除了 TransparentBlt,那些最常用的BitBlt,TextOut,FillRect等等都是忽略ALPHA通道的,绘制过后这些区域的 ALPHA值都变成了0,即全透明。因此想要实现不透明控件,就要实现所有控件的自绘,使控件绘制到内存图象上,常规GDI操作过后再设定这些区域的 ALPHA值为0xFF。是不是头大了?这个方法太麻烦了,而且仅仅是为了在半透明窗口上实现不透明控件这样一个效果,代价太大,因此并不实用。 QQ2009所用的DirectUI应该能很容易实现这个效果,但是并没实现,估计跟执行效率有关,因为这种像素级透明的程序在绘制时很耗时,调整窗口大 小时可能会有延迟现象,在速度慢一点的机器上更是明显。 C8|Ls(4Ck *1)P8# 现 在来讲模仿QQ的客户区,有很多种方法,这里选用相对比较简单的方法,有更好的解决方案欢迎留言讨论。首先是上部的搜索栏,当然是子类化EDIT控件进行 自绘,处理WM_NCCALCSIZE消息加大其非客户区,画个外方内圆的边框。在编辑框输入内容后会有个自绘的下拉列表出来,这个其实跟点了“更改外 观”按钮后出现的界面调色对话框是一样的,不过是把那对话框改一下表现形式,然后搬到编辑框下面,就不演示了,还有右边会出现清除和执行按钮,又是贴图, 属于非典型编辑框功能,也不演示了,有兴趣的可以自己完成。 VI4mEq,V Jkj7ty.J 然 后是侧边栏,看起来是TAB控件的功能,其实用工具栏更简单一些,添加TBSTYLE_BUTTON|TBSTYLE_CHECKGROUP类型的按钮就 跟TAB控件的效果差不多。怎么绘制前面一篇已经讲过了,收起和展开只是隐藏和显示而已。最重要的好友列表部分,这个要用到TAB控件了,调整窗口尺寸时 3个标签的宽度是跟着变的,这个需要创建TAB控件时指定TCS_FIXEDWIDTH窗口类型,子类化后在WM_SIZE消息里发送 TCM_SETITEMSIZE消息调整标签的宽度。标签需要自绘,鼠标点击上面的下拉箭头会弹出菜单,这个需要在WM_LBUTTONDOWN消息里判 断一下,子类化后其实想干什么都行,只是麻烦一点罢了:)点击标签后下面列表子窗口的滑动效果切换也很简单,把两个窗口并排然后连续移动就可以,不过因为 刷新的关系,可能会有重影,如果想要更好的效果,应该是把子窗口截图,然后用双缓冲绘制出滑动效果,这里就简单一点,不用这个方法了。 nyHt/T *| hd/j 好 友列表,群列表和最近联系人列表是用ListBox控件实现,本来不需要子类化,不过ListBox不支持鼠标移到选项上的高亮功能,因此还是实现了子类 化,处理WM_MOUSEMOVE消息进行判断。好友列表里面是有“我的好友”,“陌生人”,“黑名单”等分类的,这些分类选项的高度与用户项的高度不 同,因此创建控件时需要指定LBS_OWNERDRAWVARIABLE类型,还有ListBox控件默认是会计算控件高度并调整尺寸适应列表项的高度, 不会在客户区显示不完整的列表选项,这个功能我们不需要,因此还需指定LBS_NOINTEGRALHEIGHT类型,不自动调整高度,再指定一下 LBS_HASSTRINGS|LBS_NOTIFY|WS_VSCROLL常规类型,然后就是在父窗口的WM_DRAWITEM消息里进行列表选项的自 绘了。加入选项时需要指定选项的高度,为了区分分类选项和用户信息选项,通过发送LB_SETITEM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025双方协商离婚合同范本
- 肥料知识普及与教育考核试卷
- 道路货物运输保险与理赔考核试卷
- 运动防护用具的虚拟现实技术应用考核试卷
- 2024年碳纤维针刺预制件项目投资申请报告代可行性研究报告
- 消费者权益保护仲裁调解服务协议
- 新能源汽车充电桩安全认证与施工建设协议
- 民办高等教育机构师资派遣及教学辅助服务协议
- 美国职业篮球联赛合作伙伴合同
- 质押财产补充协议范本
- 歌曲《wake》中英文歌词对照
- 核安全法培训课件
- (完整版)汉密尔顿焦虑量表(HAMA)
- 讲师个人简介
- 毛坯交付标准提示方案
- 工程造价毕业设计
- 自喷漆(环氧乙烷)化学品安全技术说明书(MSDS)
- 造价咨询部管理制度流程
- 梁加大截面加固施工方案
- 测试驱动的设计和开发PPT课件
- 班主任工作范文班主任培训材料
评论
0/150
提交评论