首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我使用DirectWrite在GDI hdc上绘制文本时,如何设置透明背景?

当使用DirectWrite在GDI hdc上绘制文本时,可以通过以下步骤设置透明背景:

  1. 创建一个ID2D1RenderTarget对象,该对象用于绘制文本。
  2. 使用CreateDCRenderTarget函数创建一个ID2D1DCRenderTarget对象,将其与GDI hdc关联起来。
  3. 使用CreateSolidColorBrush函数创建一个ID2D1SolidColorBrush对象,用于设置文本的颜色。
  4. 使用SetTransform函数设置绘制文本的位置和大小。
  5. 使用BeginDraw函数开始绘制。
  6. 使用Clear函数清除绘制区域,将背景设置为透明。
  7. 使用DrawText函数绘制文本。
  8. 使用EndDraw函数结束绘制。

以下是一个示例代码片段,展示了如何在GDI hdc上使用DirectWrite绘制透明背景的文本:

代码语言:cpp
复制
// 引入必要的头文件
#include <d2d1.h>
#include <dwrite.h>

// 创建ID2D1RenderTarget对象
ID2D1Factory* pD2DFactory = nullptr;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
ID2D1RenderTarget* pRenderTarget = nullptr;
pD2DFactory->CreateDCRenderTarget(nullptr, &pRenderTarget);

// 将ID2D1RenderTarget与GDI hdc关联
HDC hdc = GetDC(hwnd); // hwnd为窗口句柄
pRenderTarget->BindDC(hdc, &rc);

// 创建ID2D1SolidColorBrush对象
ID2D1SolidColorBrush* pBrush = nullptr;
pRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::Black), &pBrush);

// 设置绘制文本的位置和大小
D2D1_RECT_F layoutRect = D2D1::RectF(x, y, x + width, y + height);

// 开始绘制
pRenderTarget->BeginDraw();

// 清除绘制区域,设置背景为透明
pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Transparent));

// 绘制文本
pRenderTarget->DrawText(text, textLength, pTextFormat, layoutRect, pBrush);

// 结束绘制
pRenderTarget->EndDraw();

// 释放资源
pBrush->Release();
pRenderTarget->Release();
pD2DFactory->Release();
ReleaseDC(hwnd, hdc);

这样,使用DirectWrite在GDI hdc上绘制的文本将具有透明背景。

在腾讯云的产品中,与云计算和图形处理相关的产品有腾讯云GPU云服务器、腾讯云容器服务、腾讯云函数计算等。您可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的详细信息和使用指南。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Windows编程】系列第五篇:GDI图形绘制

两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图。...绘图属性 绘制图形,环境设备有5个属性会影响大多数绘图: 画笔位置:画线条,会从画笔所在的位置开始画,画笔位置可以用MoveToEx函数来设置。...画笔:绘图时会采用当前环境中的画笔进行绘制,如果显示不创建,将会用系统默认的画笔。 背景:某些GDI会有透明和不透明设置背景颜色:比如文本输出的间隙颜色。...绘制模式:比如划线是可以设置实线、虚线等,填充可能有不同的填充绘制模式。 下面我们通过一个完整的实例,来演示上面这些常见函数的具体运用以及实际使用效果。...Windows的GDI基本绘制其实并不难掌握,只要仔细阅读MSDNAPI的详细使用说明就一定能正确使用,但是创建GDI对象并使用后,一定要记得释放。

3.5K80

【专业技术】Win32 SDK编程:我们如何输出文本

使用Win32编程,我们常常需要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大组件之一的GDI32.dll封装了所有的文本和图像输出函数...下面以最常用的TextOut为例来说明如何在Windows窗口中如何输出文本,其他请查看MSDN的用法。...windows窗口上输出有两种方式来获取设备上下文句柄,一种是处理WM_PAINT消息通过BeginPaint函数获取,另外一种就是通过主动获取上下文句柄函数GetDC或者GetWindowDC,...而通过WM_PAINT绘制文本会在窗口有更新自动调用,因此不用担心什么时候需要重绘的问题,Windows会在以下的情况下受到WM_PAINT消息: 用户移动一个窗口,导致原来被盖住的部分窗口显示出来...//设置文本背景颜色 SetBkColor(hDC,RGB(0xFF, 0, 0)); //使用GetDC函数返回的句柄 TextOut(hDC

2K50
  • 高清ICON SVG解决方案() - 腾讯ISUX

    上图从左至右分别用的是:灰度渲染、次像素渲染和 DirectWriteGDI 实现的效果,FF官方博客中有一篇文章对这两个新的渲染技术做了简单的一个解释,他们两个都是采用的LCD的像素红色、绿色...Windows下的Firefox 4中采用的就是GDI这个技术进行字体渲染的,但是到了Firefox 4+之后的版本开始使用DirectWrite这个技术,官方解释是说DirectWrite支持硬件加速...关于DirectWriteGDI他们之前的差异这里不作太多描述,文章最后有相关文章链接,有兴趣的同学可以查看下。...Chrome目前依旧是使用GDI,而FF和IE9+已经是采用了DirectWrite,这就是为什么iconfontChrome下锯齿会比其他浏览器严重的原因,可能GDI确实像FF官方说的存在许多缺陷,...---- 小结: 本文介绍了字体渲染机制,并分析iconfont出现锯齿的底层原因,再到如何绘制高质量SVG ICON的步骤和输出了一套严谨的AI绘制图标模板。

    3.3K40

    DUI -实现GDI透明效果

    实现GDI透明的关键是 1、需要把内容画到一个临时位图上,同时保护好alpha通道。...(来自原始DC的相关属性,如字体、画刷、颜色). 3.临时DC是否需要先复制原始DC的数据(很多函数如DrawText需要做反锯齿处理,反锯齿处理的关键是和背景色做混合,因此从原位图复制出数据也是很有必要的...需要做反锯齿处理,反锯齿处理的关键也是和背景色做混合,因此从原位图复制出数据). 4.把临时位图的alpha全置为1(GDI函数只会将那些变色的点的alpha通道清0,所以alpha清0的像素点就是需要保留的像素点...) 5.绘制相关内容到临时DC. 6.依据3和4,GDI函数处理后未变化的alpha都是1,变化的alpha都为0,将所有的alpha减1,则未变化的alpha都是0,变化的alpha都为0xff((byte...else { for (int i=0; i<m_DIBTemp.m_nImageSize; i+=4,p+=4) { *p -= 1; } } #else// MMX只有大图片时才会更高效

    10.3K63

    数字时钟

    操作绘制抖音热门项目 数字时钟 02 绘制数字时钟 在上周的,我已经讲述了如何利用windows的API对窗口进行移动和追加菜单并对菜单功能进行实现,以及定时器的开启和使用。...°旋转的数字时钟达不到效果,我们需要设置锚点为左下角 就这样封装好一个可以某个DC的x,y位置绘制倾斜角度为org的字符串szText,这样我们就准备好了绘制数字时钟的基本条件 WM_TIMER消息内...rt; GetClientRect(hwnd, &rt); //获取客户区大小 SetBkMode(hdc, TRANSPARENT);//设置文字背景透明 设置坐标轴和坐标原点...首先绘制年份,要将年份绘制最中间,之前已经将坐标原点设置客户区的中间了,所以我们需要进行的操作就是 绘制年份 //绘制年 wsprintf(szTime, L"%d 年", currentTime.wYear...1月开始,所以初始化i = 1;我将 年、月、日、、分、秒绘制6个同心圆处,相当于将minSize 6 等分,使得数字时钟看起来对称又有层次感 然后初始旋转角度initOrg是通过 当前的月份 *

    1.7K30

    图像处理程序框架—MFC相关知识点

    CWindowDC ------代表整个屏幕的DC CDC类的数据成员 数据成员只有两个: HDC m_hDC : CDC对象使用的输出设备上下文 HDC m_hAttribDC :...CDC对象使用的属性设备上下文 二者CDC对象创建指向相同的设备上下文。...  int SetBkMode(int nBkMode); 参数:nBkMode为要设置背景模式,取值可以为: OPAQUE 绘制文本前用当前背景色填充背景,这是缺省的背景模式 TRANSPARENT... 绘制前不改变背景(即文字背景透明) 返回值:先前的背景模式 CDC::MoveTo 设置画图的起点位置  CPoint MoveTo(int x,int y); CPoint MoveTo(POINT...为新背景色 返回值:先前背景色;若错误,返回值为0x80000000 CDC::GetTextExtent 使用当前字体计算一行文本的宽度和高度  CSize GetTextExtent(LPCTSTR

    1.5K20

    miniguimgncs:自定义渲染器(renderer)实现透明背景按钮(transparent button)

    =true),就可以实现背景透明,但对于mButton按钮却不行,即使设置透明属性,也不能实现透明背景。...miniStudio中对按钮设置透明属性示例: ? 这是为什么呢?..., NCS_PIECE_PAINT_GET_CHECK(add_data), owner); } 从这个代码可以看出,每次重绘窗口区域,不论是否有设置透明属性,都会先调用flat_draw...知道了原因,解决问题的方案就有了 解决方案1 修改libmgncs源码: 还以上面的flat_buttonbox_paint函数为例,函数开始添加一行代码判断透明属性是否设置就可以了。...如果你要背景透明但还希望画上按钮边框,修改如下: static void flat_buttonbox_paint(mButtonBoxPiece *self, HDC hdc, mWidget * owner

    1.1K30

    再谈duilib控件自绘

    从单个控件看,也可以认为该控件绘制最先调用Paint,因此如果自定义控件重写了Paint函数,在里面没有调用DoPaint等,那么DoPaint是不会被调用的(PostPaint另外再说)。...结合调用流程可以知道,控件自身的绘制的层次是这样的:先绘制bkcolor,bkcolor上层绘制bkimage,再在上层绘制statusimage(其中statusimage中还包含foreimage...2.使用OnPaint成员变量,其实是duilib提供的一个委托机制, bool CControlUI::Paint(HDC hDC, const RECT& rcPaint, CControlUI*...然后自己实现一个OnPaintMybtn,在里面写绘制代码,可以看到我这里是调用了PaintBkImage绘制背景图,然后gdi+绘制了一段圆弧线,然后又绘制文本,最后返回false。...这样实际呈现出来的就是my_btn按钮,没有被绘制背景色,先绘制背景图,背景图上边缘有个四分之一的圆弧,圆弧宽度是6, 然后在上层又绘制文本,没有绘制边框。

    1.3K10

    .net下灰度模式图像在创建Graphics出现:无法从带有索引像素格式的图像创建graphics对象 问题的解决方案。

    .net下,如果你加载了一副8位的灰度图像,然后想向其中绘制一些线条、或者填充一些矩形、椭圆等,都需要通过Grahpics.FromImage创建Grahphics对象,而此时会出现:无法从带有索引像素格式的图像创建...,因此,一些绘制的过程用在索引图像存在着众多的不适。      ...但是,一些特殊的场合,对灰度进行上述操作很有用途和意义。比如:高级的图像设计中,有着选区的概念,而选区的实质就是一副灰度图像,如果我们创建一个椭圆选区,设计就是灰度图像填充了一个椭圆。...心细的朋友可以测试中会发现,通过这种方式绘制的颜色可能和指定的颜色有所不同,比如上面我们要求绘制白色的椭圆,但是实际绘制的颜色是RGB(252,252,252)的,但是并不是所有的颜色都有误差,引起这个的原因估计还是...GDI+的内部的一些机制的问题吧。

    5.5K80

    WPF 从最底层源代码了解 AllowsTransparency 性能差的原因

    以及 4k 下使用更多内存的原因 本文代码基于 WPF 官方开源仓库 所了解,部分逻辑也许和 .NET Framework 不同版本有出入 WPF 的实现窗口透明逻辑中,可以在窗口设置 AllowsTransparency...= true 让窗口设置透明笔刷的时候,可以看到窗口后面的内容。...的绘图空间,根据给定的颜色设置透明。...方法实现 调用过程中需要从 DX 将窗口渲染内容拷贝出来放在内存,然后使用 GDI 进行渲染。...其实有的,详细请看 WPF 制作高性能的透明背景异形窗口 当前的 WPF https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置

    1.4K20

    mfc 中利用设备描述表(dc)绘制图案

    DC(Device Context)程序中,可以形象的理解为就是一块画布,画画之前,你要选择好画笔,给画笔蘸上颜色,决定要写字还是画画等等,这些形象的比喻 mfc 中都有对应的类去实现,大家可以参考下面两篇文章...,本文只记录一些特殊的方法,方便以后翻阅查询: ---- MFC GDI绘图基础:http://blog.csdn.net/phunxm/article/details/5083119 关于设备描述表:...// 获取 DC 的背景色 COLORREF color = hDC.GetBkColor(); // 设置 DC 绘制字体的颜色与背景色一致 color = hDC.SetTextColor(color...); 上面示例获取了 DC 的背景色以后有将背景设置为字体颜色,这样写出来的字就与背景色一致了(看不到写出来的字)。...返回一个字符串 DC 中的宽度 CSize size = hDC.GetTextExtent(m_str); // 返回的 size.cx 是长度 // 返回的 size.cy 是高度

    14310

    小菜学Chromium之OpenGL学习之二

    要让程序能够绘制窗口的话,还需要创建一个设备描述表,也就是第二行的内容。Windows的设备描述表被定义为 hDC 。...OpenGL场景的尺寸将被设置成它显示所在窗口的大小。...done) { 我们要做的第一件事是检查是否有消息等待。使用PeekMessage()可以不锁住我们的程序的前提下对消息进行检查。许多程序使用GetMessage(),也可以很好的工作。...但使用GetMessage(),程序收到paint消息或其他别的什么窗口消息之前不会做任何事。 //有消息等待吗?...我们实际另一个看不见的"屏幕"绘图。当我们交换缓存后,我们当前的屏幕被隐藏,现在看到的是刚才看不到的屏幕。这也是我们看不到场景绘制过程的原因。场景只是即时显示。

    1K60

    GDI透明贴图

    水印的实现可以用透明贴图来做。透明贴图就是让两张图片合并的时候,重叠的部分中使一些颜色不显示,从而达到透明的效果。 如果用GDI来实现的话,具体方法步骤可多可少,少的可以使用一个SDK函数就解决。...//当然上面的1和0都是指bit位的值,还有这些转换是设备上下文间的块数据操作前就进行的。...,也就是源位图的透明色,假设为白色,我们一般做素材,将背景做成白色的, // 在下面,生成掩码图,跟背景相同的会转换为白色,其他颜色转换为黑色 CBitmap btSingleColor;...,这样下次再次用源图异或 // 该部分就应为执行了两次异或而透明了;而最终结果中需要显示的部分,本次掩码与操作中, // 应当为清除为0,即黑色,这样下次异或,将会原封不动的显示出来。...(RGB(255,255,255)); //设置背景颜色白 bk_DC.SetTextColor(RGB(0,0,0)); //设置前景颜色黑 bk_DC.BitBlt(0,0,512,384

    2.8K60

    Windows程序设计学习笔记(四)自绘控件与贴图的实现

    Windows系统提供大量的控件供我们使用,但是系统提供的控件样式都是统一的,不管什么东西看久了自然会厌烦,为了使界面更加美观,添加一些新的东西我们需要自己绘制控件。...UINT itemState; //控件状态,处于某个静态产生 HWND hwndItem; //控件句柄 HDC hDC; //绘制控件的设备上下文句柄...); 对于第二步的操作并不是必要的,贴图我们可以使用同一个句柄作为原和目的句柄,但是当我们需要贴的图片过多,使用同一个句柄会造成客户区的闪烁,所以可以另外定义一个句柄,保存我们所需要的所有图片,然后一次性通过源...= lpDis->rcItem; if (ODT_LISTBOX == lpDis->CtlType) { if (ODS_SELECTED & lpDis->itemState)//当某项被选中设置虚线框并使背景为蓝色...); DeleteObject(hMerDc); //将文字设置透明、并显示文字 SetBkMode(lpDis->hDC

    1.4K20
    领券