日前遇到一个问题,在分层窗口上使用gdi+ 绘制文本的时候,在绘制的文字区域,文字产生了透明的洞,鼠标会穿透。
通过现象分析,应该是文字区域的透明度直接干成了0,所以产生了一个洞。因为分层窗口透明度为0的地方直接会穿透,所以鼠标也会穿透。
解决方法:
1 将要绘制的文本先绘制在内存位图上
2 位图的句柄选入到内存dc上
3 使用AlphaBlend 将内存dc 上的图绘制到窗口上。

如果绘制结果在边缘出现了杂色,那么需要在调用AlphaBlend函数前进行预乘处理。
预乘大概算法如下:
for(int i = 0; i <位图宽; i++)
{
for(int j = 0; j < 位图高; j++)
{
unsigned char* pucColor;//待处理的像素,一个像素4个字节。
pucColor[0] = pucColor[0] * pucColor[3] / 255;//red = red * alpha / 255
pucColor[1] = pucColor[1] * pucColor[3] / 255; //green = green * alpha / 255
pucColor[2] = pucColor[2] * pucColor[3] / 255;//blue = blue * alpha / 255
}
}
意思就是当前的像素的每个颜色分量值 * 该像素值的透明比例。

如下是解决gdi+ drawstring 透明问题的伪代码:

HWND cur_wnd = layerwnd; //当前绘制的分层窗口句柄HFONT hFont = m_pManager->GetFont(GetFont()); //将要用于绘制文本的字体句柄Gdiplus::Font font(hDC, hFont); //hDC:当前窗口的句柄Gdiplus::RectF rc(10, 100, 300, 300);//位图中的绘制位置Gdiplus::Graphics* pGraphics = new Gdiplus::Graphics(hDC);Gdiplus::Color color(254, 255, 0, 0);Gdiplus::SolidBrush redBrush(color);Gdiplus::SolidBrush greenBrush(Gdiplus::Color(255, 0, 255, 0));//pGraphics->DrawString(L"1111111111111111111xxxxxxxxxxx", -1, &font, rc,NULL, &greenBrush); //这个会产生透明的洞Gdiplus::Bitmap bitmap(180, 100);//内存位图Gdiplus::Graphics bitmapGraphics(&bitmap);//内存画布bitmapGraphics.Clear(Gdiplus::Color(0, 255, 255, 255));//将改颜色作用于位图上bitmapGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceOver); //这句可以删除,主要是作用于绘制对象间的作用,譬如在同一个位置绘制一个圆和正方形,那么在此处到底是覆盖还是混合bitmapGraphics.FillEllipse(&greenBrush, 30, 30, 150, 70);Gdiplus::RectF rc2(30, 30, 150, 70);Gdiplus::TextRenderingHint trh = Gdiplus::TextRenderingHintSystemDefault;bitmapGraphics.SetTextRenderingHint(trh);bitmapGraphics.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); bitmapGraphics.SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);Gdiplus::StringFormat stringFormat = Gdiplus::StringFormat::GenericTypographic();bitmapGraphics.DrawString(L"1111111111111111111xxxxxxxxxxx", -1, &font, rc2,&stringFormat, &redBrush);//在位图上绘制字符串HBITMAP save_bitmap = NULL;bitmap.GetHBITMAP(NULL, &save_bitmap); //取出位图中的句柄HDC mem_dc = CreateCompatibleDC(NULL); //创建内存dcHBITMAP old_bitmap = (HBITMAP)SelectObject(mem_dc, save_bitmap);//将位图句柄选入内存dcPOINT pt = { 0,0 };BLENDFUNCTION oBF = { 0 };oBF.BlendOp = AC_SRC_OVER;oBF.BlendFlags = 0;oBF.SourceConstantAlpha = 255;oBF.AlphaFormat = AC_SRC_ALPHA;AlphaBlend(hDC, 0, 0, 392, 182, mem_dc, 0, 0, 180, 100, oBF);//将当前窗口的hdc 和内存dc 混合。既将当前位图中的话绘制到窗口上。SelectObject(mem_dc, old_bitmap);DeleteObject(save_bitmap);DeleteDC(mem_dc);

参考链接:https://qa.1r1g.com/sf/ask/90636381/
https://www.orcode.com/question/1473876_k57fa4.html
https://www.cnblogs.com/xzy1210/p/3622818.html(DrawText 出现此类问题,问题的原因一样)

分层窗口输出文字时,会出现透明的洞。相关推荐

  1. 向窗口输出文字--TextOut和DrawText函数

    在< 一个完整的Windows程序框架 >一节中,我们使用 DrawText() 向客户区的中间位置输出了一段文本,但并没有详细解释,这节我们来重点说一下文字的输出. 设备环境(DC) 在 ...

  2. 8.向窗口输出文字 : TextOut 和 DrawText 函数

    使用 DrawText() 向客户区的中间位置输出了一段文本,说一下文字的输出. 设备环境(DC) 在Windows中,一切能在显示器上看到的都是图形,不但包括点.线.矩形.圆等,也包括文字.字体.对 ...

  3. win32 输出文字时清除之前的_努力学习没效果?3个步骤,强化沟通输出,实现飞跃式成长...

    努力学习工作没效果?其实是缺乏沟通输出的表现 我们经常会听到这样的抱怨:自己读了很多书,但是却没有什么改变,自己也报了很多网课,明明学了很多知识和技能,却没有什么进步. 为什么会出现这种情况呢? 日本 ...

  4. 第04章 输出文字

    在前一章,您看到了一个简单的Windows 98程序,它在窗口中央,或者更准确地说,在显示区域中央显示一行文字.正如我们学到的,显示区域是整个应用程序窗口中未被标题列.窗口边框,以及可选的菜单列.工具 ...

  5. python turtle库输出文字_Python 海龟 turtle 画图讲解 (五):输入/输出文字及鼠标与键盘交互设计...

    一.输入/输出文字 在 1. 输出文字 输出文字可以使用 write() 方法来实现,语法如下: def write(self, arg, move=False, align="left&q ...

  6. 分层窗口实现千千静听的透明歌词

    千千静听的透明歌词有两个特点: 1.只有在点击到文字上时,才可以拖动,也就是说窗口是不规则的. 2.当设置为总是在前面,最顶层窗口时,歌词窗口的下层窗口的刷新也能体现到歌词上来,也就是歌词依然透明. ...

  7. java设置窗体不透明的函数_透明窗口(窗口上面文字图片等内容不透明)的实现(使用SetLayeredWindowAttributes API函数)...

    透明窗口(窗口上面文字图片等内容不透明)的实现 本文讨论通过SetLayeredWindowAttributes来实现本文的目的. SetLayeredWindowAttributes的实现必须将窗口 ...

  8. MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠

    请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...

  9. java使用itextpdf生成PDF批量打印荣誉证书(指定位置输出文字)

    最近公司项目有个需求,批量打印荣誉证书,一开始尝试过传统的网络打印,控件打印,JS调用浏览器打印方法,遇到各种问题,比如定位不准,分页问题,​​缩放问题等.然后就自己研究,整理了一套打印方案,项目已测 ...

最新文章

  1. java与c/c++之间的数据交互-----jni点滴
  2. FPGA中的Logic Cells, Logic Slices, Configurable Logic Blocks and Gates 的定义
  3. springboot+vue前后端分离实现宿舍管理系统
  4. 使用cookie解决微信不能存储localStorage的问题
  5. 关于一维数组和二位数组的数组指针
  6. 分支限界发:Dijkstra算法
  7. 计算机桌面组成部分教案,计算机基础 教案设计(完整版).doc
  8. 软件测试人员:如何优秀的提Bug?
  9. 如何查看Ubuntu版本,以及Linux内核版本??
  10. java8中LocalDate、LocalTime、LocalDateTime介绍
  11. LeetCode - 44. Wildcard Matching
  12. SourcesTree使用手册2:文件更新
  13. 牛逼!终于有人开源了一份基于SSM框架实现了支付宝支付功能的完整源代码......
  14. Procez One 快速入门(4)
  15. zoom下载官网android最新,Zoom下载安卓最新版_手机app官方版免费安装下载_豌豆荚...
  16. 图书借阅系统软件测试实验报告,C 大作业--图书管理系统-实验报告.doc
  17. 经验10年搞不过卖烧烤的!后入阿里我软件测试是怎么学废的,这些话我想送给一事无成的自学测试们...
  18. 网络连接三种方式-桥接模式
  19. 常见的hash算法及其原理
  20. mac能不能做ppt?

热门文章

  1. THE DRAGON PRINCE BOOK 3
  2. 任铄 计算机操作系统,计算机组成与体系结构-CSDN.PDF
  3. 为什么excel图片会变成代码_莲藕为什么会变色?焯水就发黑,炖汤就变粉色,甚至会变成暗紫色...
  4. java面试-死锁产生、定位、修复
  5. 能够在Linux系统中运行的5款大型耐玩游戏
  6. CodeForces - 813C The Tag Game(拉格朗日乘数法,限制条件求最值)
  7. Golang 微框架 Gin 简介
  8. Mac下安装Pyqt
  9. RESTful服务最佳实践
  10. RHEL7升级openssh7.4p1教程