GDI+常见问题汇总

半透明窗口中显示标准控件(控件与文字不透明)的实现方案(附源码) 和大家分享一下在半透明窗口中显示标准控件的实现方案。通过层叠窗口可以简单实现半透明与不规则形状窗口的效果,但在其上显示标准控件(控件与文字不透明)却是件比较有挑战的事情,这里会给出一个可行的解决方案。同时实现了一些可重用的窗口类,有相关需求时可以进行引用。先看一下效果图: 一、半透明窗口实现原理 绘制半透明窗口的通常做法是为窗口设置WS_EX_LAYERED属性,通过Updat 阅读详情

一、利用UpdateLayeredWindow,在GDI+绘制字体时,FontStyleRegular样式的字体会变成透明,而其它的样式都可以正常显示;

问题的原因是:
层窗口(WS_EX_LAYERED),用UpdateLayeredWindow输出的文字(用常规方法输出的:TextOut、DrawText、DrawString...),并且设置了AC_SRC_ALPHA和ULW_ALPHA,就会存在这种错误。
解决办法:

[cpp]  view plain copy
  1. void CGDIPlus_TextTestDlg::Redraw()  
  2. {  
  3.   CRect rect;  
  4.   GetClientRect(&rect);  
  5.   SolidBrush brush(Color(200,255,0,0));  
  6.   m_pGraphics->FillRectangle(&brush,0,0,rect.Width(),rect.Height());  
  7.   
  8.   CFont *pFont=GetFont();  
  9.   LOGFONT lf;  
  10.   pFont->GetLogFont(&lf);  
  11.   CComBSTR wszFN(lf.lfFaceName);  
  12.   int nHeight=-lf.lfHeight;  
  13.   FontFamily ff(wszFN,NULL);  
  14.   int nStyle=FontStyleRegular;  
  15.   Font font(&ff,nHeight,nStyle,UnitPixel);  
  16.   StringFormat format;  
  17.   format.SetAlignment(StringAlignmentNear);  
  18.   SolidBrush brush2(Color(255,0,0,0));  
  19.   int nStyle2=FontStyleBold;  
  20.   Font font2(&ff,nHeight,nStyle2,UnitPixel);  
  21.   
  22.   
  23.   //-----直接写字,变得穿透了  
  24.   CComBSTR wsz("文字Test: 直接写字,变得穿透了");  
  25.   m_pGraphics->DrawString(wsz,wsz.Length(),&font,PointF(50,50),&format,&brush2);  
  26.   
  27.   //-----文字加粗  
  28.   wsz="文字Test: 文字加粗";  
  29.   m_pGraphics->DrawString(wsz,wsz.Length(),&font2,PointF(50,70),&format,&brush2);  
  30.   
  31.   //-----SetTextRenderingHint(TextRenderingHintAntiAlias)  
  32.   wsz="文字Test: SetTextRenderingHint(TextRenderingHintAntiAlias)";  
  33.   GraphicsContainer gc=m_pGraphics->BeginContainer();  
  34.   m_pGraphics->SetTextRenderingHint(TextRenderingHintAntiAlias);  
  35.   m_pGraphics->DrawString(wsz,wsz.Length(),&font,PointF(50,90),&format,&brush2);  
  36.   m_pGraphics->EndContainer(gc);  
  37.   
  38.   //-----GraphicsPath  
  39.   wsz="文字Test: GraphicsPath";  
  40.   gc=m_pGraphics->BeginContainer();  
  41.   m_pGraphics->SetSmoothingMode(SmoothingModeHighQuality);  
  42.   GraphicsPath path(FillModeAlternate);  
  43.   path.AddString(wsz,wsz.Length(),&ff,nStyle,nHeight,PointF(50,110),&format);  
  44.   m_pGraphics->FillPath(&brush2,&path);  
  45.   m_pGraphics->EndContainer(gc);  
  46.   
  47.   SIZE sizeWindow = rect.Size();  
  48.   POINT ptSrc = { 0, 0 };  
  49.   BLENDFUNCTION blend;  
  50.   blend.BlendOp = AC_SRC_OVER;  
  51.   blend.BlendFlags = 0;  
  52.   blend.AlphaFormat = AC_SRC_ALPHA;  
  53.   blend.SourceConstantAlpha = 255;  
  54.   UpdateLayeredWindow(m_hWnd, hdcHWND, NULL, &sizeWindow, hdcHBMP, &ptSrc, 0, &blend, ULW_ALPHA);  
  55. }  
有三个方法避免,但是都不是真正的解决这个问题
第一个方法是字体加宽,把字体的Weight改成800就不会透
第二个方法是SetTextRenderingHint(TextRenderingHintAntiAlias)
第三个方法是把字串转换成GraphicsPath,然后用FillPath画出来,画之前SetSmoothingMode(SmoothingModeHighQuality)字会好看一点
不过,这三种方法都改变了字画出来的样子,第一种方法字被加粗了,第二三种方法字被抗锯齿了。  找到一个简单的方法同时避免穿透和变形的问题,把Color的Alhpa值改成254就好了。 使用DrawString + A->254 没问题。





GDI 及OPENGL的区别 GDI+的介绍: GDI+是Windows XP的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息。 它是一组通过C++类实现的应用程序编程接口。 GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作。 GDI+... 阅读详情

相关推荐

GdiplusFlat(1)GDI+平面API:用GDI的思想进行GDI+编程

坚信GdiplusFlat比Gdiplus好!我要在资料匮乏的GdiplusFlat上打下一片天地!没有api文档?我去百度找,就算把那些其他不支持GDI+类的语言中用GdiplusFlat的例子翻出来看,头文件里函数和结构没有声明?我自己声明!实在不行?我把你们这些GdiplusFlat函数一个个从dll里load进来直接动态调用!! GDI+(Gdiplus)想必大家都不陌生,MSDN给出的解释是 Windows GDI+ is a class-based API for C/C++ program

zuishikonghuan的博客 3912

GdiPuls::font

(1)字体系列 FontFamily: GDI+中将具有相同的样式成为字体系列,如我们常见的 “宋体”、“仿宋” 、“微软雅黑”、 “Arial”等。 (2)字体风格枚举 FontSytle: FontStyle 枚举列出了常见的字体风格,其定义如下: enum FontStyle { Re...

martinkeith的博客 1173

深入了解GDI

图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形。正如您所认为的那样,GDI是Windows非常重要的部分。不只您为Windows编写的应用系统在显示视觉信息时使用GDI,就连Windows本身也使用GDI来显示使用者接口对象,诸如菜单、滚动条、图标和鼠标光标。 GDI原理 Windows 98和Micro...

cix1314的博客 745

使用GDI+转换字符串为透明位图(ARGB位图)

Windows下使用GDI+将字符串转成透明位图,方便后续贴图或者存储成png图片。以下是C++代码,使用前根据实际需求稍作改动即可. void GDIPlusMakeARGBBitmap(HWND hwnd, const std::wstring& font_name, int font_size, const std::wstring& text) { Gdiplus::FontFamily font_family(font_name); if (!font_fa...

lsheevyfg的专栏 594

GDI简单介绍

对于GDI的理解 GDI:在物理设备上显示图形,可以理解为一个程序(对比有界面的)画图工具软件 2.GDI座标 3.GDI画图 4.测试原码GDITest.cpp #include <windows.h> LRESULT CALLBACK pfnWndProc(HWND, UINT, WPARAM, LPARAM); in...

zhoumin4576的博客 1055

C++自学指南:掌握GDI和GDI+图形编程

色彩管理是图像处理中的一个重要组成部分,特别是在图形用户界面和打印领域中。GDI+支持多种色彩模型,如RGB和CMYK。RGB(红绿蓝)模型是加色模型,常用于计算机屏幕和其他电子显示设备。它通过红、绿、蓝三原色的组合和光的加法混合生成广泛的色彩。CMYK(青、品红、黄、黑)模型是减色模型,通常用于印刷和打印行业。它使用青、品红、黄和黑色油墨吸收光线,从而形成不同的颜色。在GDI+中,根据不同的输出需求,我们可以灵活选择不同的色彩模型。

weixin_42589700的博客 1283

Duilib 结合layered window,绘制出来的不规则窗体,半透明窗体,文字完全透明的BUG解决。

简单的改变就是: UpdateLayeredWindow之前,窗口内容已经绘制到了一个Bitmap里面。 文字完全透明是因为因为这个里面,绘制的文字Alpha通道为0。 GetBitmapBits,让后改变Alpha通道为0的,为0xff即可。 然后SetBitmapBits。 然后再UpdateLayeredWindow,完全OK。 如果本身就有完全透明的信息怎么办?可以将alpha通道的值设置的非常小,比如1. 复杂的改变就是去改库了,库绘制的时候要绘制alpha通道,就好了。 ...

zjq9931的专栏 667

UpdateLayeredWindow_VB_GDI+输出透明文字+UpdateLayeredWindow显示透明窗体+PNG图片

UpdateLayeredWindow_VB_GDI+输出透明文字+UpdateLayeredWindow显示透明窗体+PNG图片

使用GDI+时需要注意的几个问题

在使用GDI+时,下面的几个问题值得注意: 一、Pen::GetBrush存在内存泄露。MSDN上对Pen::GetBrush函数给出了一段示例代码:VOID Example_GetBrush(HDC hdc){ Graphics graphics(hdc); HatchBrush hatchBrush( HatchStyleVertical,

陈镜许的专栏 1190

RPCA模型及GoDec算法

一、基础知识 在线性代数中,秩的物理意义是矩阵中最大的不相关的向量个数,因此秩可以用来度量相关性;而在图像处理中,秩就可以理解为图像中所包含的信息的丰富程度。图片中比较突兀的成分,会增加图像矩阵的秩,一幅清晰的自然图像其数据矩阵往往是低秩或者近似低秩的,这是因为其中的图像信息有很大的相关性,但如果图像中引入噪声,那么存在随机幅值任意大但是分布稀疏的误差破坏了原有数据的低秩性。 低秩矩阵:如果AAA是一个m×nm×nm×n的矩阵,rank(A)rank(A)rank(A)是矩阵AAA的秩,如果rank(A)

小席的学习日志 7687

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 896

【GDI+编程】--汇总+实战

上篇博客说了些题外话,可能有人会疑惑为什么偏偏在这时候来讲解事件和委托。对于事件和委托是.NET程序猿必须掌握的一堂课,是程序猿踏入设计而不是编写的里程碑,了解了事件的形成就能够使用代码编写动态创建的事件,而学会了委托才能真正的踏入设计的阶段

航帆远洋 2814

不懂就学之挑战成为WorldQuant Brain顾问的第1天

WorldQuant Brain 是由 WorldQuant 公司开发的一个基于人工智能和机器学习的量化研究平台,旨在帮助量化研究员发现和构建有效的投资策略。WorldQuant 是一家全球领先的量化投资公司,专注于利用数据科学、技术和金融工程开发量化交易策略。

Yanbang1的博客 8381

GDI、GDI+相应的API

GUI:是图形用户接口,英文全称:Graphics User Interface。指用户界面,如窗体,控件。GDI:是图形设备接口,包含图形编程相关的对象和方法。

yoyo21ktime的博客 1661

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

MTGS与3D高斯泼溅:如何用多轨迹数据重建自动驾驶场景(附代码解析)

本文深入解析了MTGS(多轨迹高斯泼溅)技术在自动驾驶场景重建中的工程实践。该方法通过分层场景表示,巧妙融合多轨迹数据,利用3D高斯泼溅技术统一处理静态几何与动态物体,有效解决了复杂环境下的重建难题。文章结合代码,详细阐述了其实现框架、损失函数设计及优化策略,为构建高保真数字孪生场景提供了实用指南。

v5w6x的博客 443

【GDI】 GDI与GDI+

GDI Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在: (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。 为实现图形设备无关性,Wind...

sunriver2000的专栏 2048

手把手教你学PCIE(9.3)--pcie常见故障及原因:配置错误介绍

PCIe 设备的配置错误可能涉及操作系统设置、BIOS 设置、驱动程序设置和配置文件设置等多个方面。通过以上方法,可以有效地诊断和解决 PCIe 设备的配置错误。

MHD0815的博客 2436

GDI GDI+ 的区别

GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好。GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你还可能要知道设备,而GDI+是一个高层的API,你不必知道设备。例如你如果要设置某个控件的前景和背景色,只需设置BackColor和ForeColor属性。 编程模式的变化 “GDI uses a...

积累点滴,保持自我 2348

【短距离通信】【WiFi】精讲802.11n/ac/ax mpdu和ampdu最大长度

在 Wi-Fi 标准(802.11n、802.11ac 和 802.11ax)中,和是数据传输的核心概念。理解它们各自的作用以及不同标准下的最大长度限制,有助于深入了解 Wi-Fi 的性能优化机制。以下是对802.11n802.11ac和802.11ax中MPDU和A-MPDU最大长度的详细技术分析和对比。1. MPDU 和 A-MPDU 的基本概念MPDU 是经过 MAC 层处理后的数据单元,主要由MAC层数据帧和物理层的传输头部(PHY headers)组成。

风云说通信 1107

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MFC中的GDI/GDI+和双缓冲绘图

1、GDI概述   GDI在全称是Graphics Device Interface,即图形设备接口。是图形显示与实际物理设备之间的桥梁。         GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:      (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。      为实现图形设

Invoker's Tower 8084

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

GDI+与GDI屏幕抓图比较

一、 简介屏幕抓图程序在处理图形中应用广泛。作为Windows XP及以后版本操作系统的图形处理内核,GDI+在二维几何图形处理、图像显示与转换和字符排版等方面简直是传统GDI程序员的一种解脱。但是,至少在目前情况下,GDI+尚不能完全代替GDI。与GDI相比,它至少还存在以下不足:不支持从内存到屏幕的位传输操作;不支持光栅“位运算”操作;如果程序性能、速度要求比较严格,在图片输出方面的表现较差时

3039

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GDI+入门(Starting with GDI+)

http://www.codeproject.com/KB/GDI-plus/startinggdiplus.aspx 绪论我现在已经使用GDI+大概一周了,并且我不得不说GDI+是一个受欢迎的改良产品。我在写一个画图程序,很多我考虑的事情我都必须得自己写下来确认,这就意味着我可以“免费”得到它们。 很多我考虑过的事情,我都要确认自己写下来了,这就意味着我可以“免费”得到它们。我猜这样

Gary's Blog --- A C++ programmer 2262

GDI详解

GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在: (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。 为实现图形设备无关性,Window...

顺其自然~专栏 4319

零基础小白如何自学GDI和GDI+

自学 GDI(Graphics Device Interface)和 GDI+ 是学习 Windows 图形编程的一个不错选择,尤其适合开发桌面应用程序时需要进行图形界面设计的开发者。GDI 和 GDI+ 是 Microsoft 提供的图形绘制接口,GDI 用于绘制基本图形元素,而 GDI+ 提供了更多的功能和现代化的图形处理能力。

小宝哥Code的专栏 1307
上一篇: GDI+ 性能优化之双缓冲
下一篇: GDI+ 之变换
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值