半年没碰MFC了 , 感觉是那么的陌生 , 忘记了绝大部分函数了....‍你说我现在都有点学这忘哪,以后能跟的上技术的发展嘛?

注意:由于代码有点长,直接放在这里显得冗长,所以,如果需要源码的朋友请发邮件或留言,代码只是互相学习之用,由于本人水平有限,如果您觉得不好,望理解,且不要有攻击性的言行,谢谢!)

首先看看我做的效果,有点像Vista的效果,而且解决了控件不能显示的问题,注意上层是一个子窗体,用来承载窗体控件:

最近看了桌面天气秀这款小软件,其界面精致漂亮,而且可以透明显示,还有个特别有趣的功能就是能让窗体固定在桌面上并且鼠标可以“穿透”而窗体不受任何影响,这就是带着些许神秘的“有影无形”的功能。

事实上要实现这种“有影无形”的功能,很简单,我相信聪明的您一定很快会想到怎么做。几句代码就可以搞定,给你点提示,只有在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<CMainDlg> wndAl;

wndAl.InitAlpha(L"C:\\bg.png", NULL, rcMargin, true);
m_pMainWnd = wndAl.GetMainWnd();
wndAl.DoModal();

很简单吧,就这么几行代码就可以实现背景透明而且又可以随意编辑你自己的子控件了。下面是我生成的示例图,大家欣赏一下了,欢迎留言讨论,如果有需要的请留言!谢谢!

原文转载自:http://rohna.w.blog.163.com/blog/static/145741652009023534832/

VC++调用UpdateLayeredWindow实现半透明窗体【转】相关推荐

  1. .NET 不规则、可改变大小、边框半透明窗体设计

    做.NET WinForm的开发也有一段时间了,对.NET的界面设计也有了一定的了解.自认为自己学的这些东西都是网上看高手们的东西后总结出来的,第一次把这些东西写出来. 不好的地方请大家多多指教. 大 ...

  2. C#与VC相互调用之VC调用C#的DLL库

    介绍 在之前的博文 C#与VC相互调用之C#调用VC的DLL https://blog.csdn.net/xinxin_2011/article/details/86704660 里面讲了C#程序如何 ...

  3. VC调用matlab中定义的.m文件中的函数的实例

    Matlab是一个强大的数学计算/仿真工具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matlab的资源呢?在这里我 ...

  4. vc++调用jni_通过JNI使用C ++尖叫快速进行Lucene搜索

    vc++调用jni 最终,当Lucene执行查询时,在初始设置后,真正的热点通常是相当基本的代码,该代码对整数docID,术语频率和位置的顺序块进行解码,并将它们匹配(例如,对BooleanQuery ...

  5. VC MFC C++ MQTT VC编译MQTT VC调用MQTT dll eclipse-paho-mqtt

    VC MFC C++ MQTT VC编译MQTT VC调用MQTT dll eclipse-paho-mqtt JS HTML Web端使用MQTT通讯测试 Android Studio MQTT 使 ...

  6. vc只能调用matlab子函数,VC调用matlab函数

    最近在学习matlab,先试一个VC调用matlab函数的简单例子 用的是VC++6.0,matlab7.8也就是matlabR2009 首先在matlab下设置环境 >> mbuild ...

  7. Form2(子窗体)调用Form1(父窗体)的控件

    一直在寻找Vs c# 跨窗体数据传递,通俗点讲就是Form2(子窗体)调用Form1(父窗体)的控件,在一篇博客上找到,名称为:Winform跨窗体操作控件(使用委托),感谢大神的分享,转载到博客,时 ...

  8. vc调用matlab生成的C++dll库总结。

    实验室的一个项目需要调用matlab程序.经过再三考虑,决定使用vc调用matlab导出库的形式.而我主要负责与matlab程序结合的工作.以下是今天工作的简要总结.全当是个备忘吧. 1:在matla ...

  9. VC调用MATLAB 产生的dll文件

    1.当然是先建立matlab的m文件. 我在matlab中定义了一个函数, 其m文件如下: function re=add(C) N=73;alpha=(0.2)*(pi/2); Ts=sqrt(2* ...

最新文章

  1. 【CSS】背景遮罩层各种情况下,CSS样式
  2. spring boot-The temporary upload location [ ] is not valid
  3. You don't have permission to access /index.php on this server.
  4. 新手程序员如何找一个靠谱的公司
  5. 《菜菜的机器学习sklearn课堂》sklearn入门与决策树
  6. ~~试除法求所有约数(附模板题)
  7. ffmpeg系列-解决ffmpeg获取aac音频文件duration不准
  8. 2018双一流排名 计算机,2018年42所双一流大学本硕博录取人数排名,规模优势凸显!...
  9. WebServer服务器
  10. Res2Net: A New Multi-scale Backbone Architecture
  11. 【安装填坑】-import win32api, sys, os ImportError: DLL load failed: 找不到指定的模块。
  12. 【ARC 123B】Increasing Triples(贪心)
  13. SESSION的窃取
  14. mysql关联修改_MySQL语句修改之关联update语句用法
  15. 是德科技34901A校准
  16. Java 2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示输入用户磅数,然后转换为千克并显示结果。一磅等于0.454千克。下面是一个运行示例:
  17. 调用百度ai接口实现图片文字识别详解
  18. neat神经网络算法的线性回归拟合(Python)
  19. Python的皮肤的使用
  20. 教育平台项目后台管理系统:视频讲解

热门文章

  1. 开闭原则coding
  2. 二叉树的遍历实现-2(三级)
  3. win7电脑总是提示重新启动计算机以完成重要更新的安装是怎么回事,Win7开机时弹出Windows Update提示,怎样解决?(图文)...
  4. .net core webapi 列表返回指定的字段_ADO.NET 使用初探之SQL操作 | C# 数据操作系列...
  5. 生成树生成森林c语言中文网,生成树协议(STP)基本知识及实验(使用eNSP)
  6. 200726C的数据传递方式
  7. Command ‘ifconfig‘ not found
  8. Redis分布式锁实现方式
  9. ubuntu18.04 VirtualBox 开启虚拟机出错 Kernel driver not installed (rc=-1908)
  10. 【学时总结模板时间】◆学时·10 模板·3◆ AC自动机