C++ GDI+ 带阴影的文字功能的实现

用GDI+的优秀图形输出功能可以非常方便的实现文字特效,其中一个带阴影的文字便是其中一例。

许多简单的文字特效只是简单的将文字用不同的颜色与不同的位置输出一次或多次,本文所讨论的阴影效果借助GDI+的反走样能力生成透明的阴影与半阴影。 这儿所述的方法先在绘图平面上绘制一个比预期小的文字,然后放大它

由于代码注释很详细,直接上代码:

ULONG_PTR	g_gdiPlusToken = NULL;  //GDI+ 初始化
void CMFCApplication1Dlg::OnBnClickedOk()
{
    using namespace Gdiplus;

    if (NULL == g_gdiPlusToken)
    {
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        Gdiplus::GdiplusStartup(&g_gdiPlusToken, &gdiplusStartupInput, NULL);
    }

    CRect    ClientRC;
    CStringW strTxt("19:20:30");

    m_picBox.GetClientRect(&ClientRC);
    RectF         desRC(ClientRC.left, ClientRC.top, ClientRC.Width(), ClientRC.Height());
    PointF        txtPos(0, 0);
    FontFamily    fontFamily(L"Times New Roman");
    Gdiplus::Font font(&fontFamily, 100, FontStyleBold, UnitPixel);
    Graphics      g(m_picBox.GetDC()->m_hDC);

    //1.0 填充背景色
    g.FillRectangle(&Gdiplus::SolidBrush(Color::LightSlateGray), desRC);

    //2.0 创建一个小尺寸的内存位图,设置它的长宽为总尺寸的1/4
    Bitmap bmp(ClientRC.Width() / 4, ClientRC.Height() / 4, &g);

    //2.1 设置绘制模式为反走样模式
    Graphics* pTempG = Graphics::FromImage(&bmp);
    pTempG->SetTextRenderingHint(TextRenderingHintAntiAlias);

    //2.2 创建一个矩阵,使字体为原来的1/4,阴影距离也为你要设置文本的1/4左右
    Matrix mx(0.25f, 0, 0, 0.25f, 3, 3);
    pTempG->SetTransform(&mx);

    //2.3 在位图上绘制文本,使用有透明度的画笔(比如50%透明)
    pTempG->DrawString(strTxt, -1, &font, txtPos, NULL, &SolidBrush(Color(128, 0, 0, 0)));

    //3.1 插值模式为高质量双三次插值法,插值法非常重要,因为双三次插值使文本的边模糊,这样就出现阴影与半影效果
    g.SetInterpolationMode(InterpolationModeHighQualityBicubic);

    //3.2 设置绘制模式为反走样模式以保证正确的范围
    g.SetTextRenderingHint(TextRenderingHintAntiAlias);

    //3.3 把位图显示在屏幕上,在两个方向上都放大4倍
    g.DrawImage(&bmp, desRC, 0, 0, bmp.GetWidth(), bmp.GetHeight(), UnitPixel);

    //3.4 把文本绘制到绘图平面上, 使用白色字体
    g.DrawString(strTxt, -1, &font, txtPos, NULL, &SolidBrush(Color::White));

    //4.0 释放内存
    if (NULL != pTempG)
    {
        delete pTempG;
        pTempG = NULL;
    }
}

时间: 2024-10-09 18:25:52

C++ GDI+ 带阴影的文字功能的实现的相关文章

android中自定义view---实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色

android自定义view,实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色. 由于时间比较仓促,因此没有对代码进行过多的优化,功能远远不如android的自带的TextView强大,只是继承于view,而不是textview. 主要用途:电话本的侧边快速导航等 效果图:(自定义字符串 “#ABCDEFGHIJKLMN),可以实现自定义任意字符串 view的实现: 1 import cn.carbs.verticalstraighttextview

几何画板中直角符号为什么不带阴影

在学习几何里面的‘垂直关系判定’一节的时候,经常会需要用直角符号标识下垂直关系,方便大家辨识.那么几何画板作为几何学必不可少的教学辅助工具,常常被用来做数学课件,几何画板中也可以很快地给符合垂直关系的对象标出直角符号,但是系统设定的直角符号是带阴影填充的,我们该怎样把其中的阴影删除呢?下面就让小编来给大家支招几何画板中直角符号为什么不带阴影. 如下图所示,假如我们在几何画板中画一条线段,找出线段的中点,过中点构造线段的垂线.选择左侧工具箱下的“标记工具”,鼠标放在中点上,沿45度方位拖动鼠标,就

QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg(this); dlg.exec(); 如果不加this,则会在任务管理器里面产生一个新的EXE. 3.如果对话框的标题是自定义,不想使用系统的标题,这时候需要在代码中加入: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint ); setAttr

VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是SignalR机制大家可以没事去百度了解一下. Browser Link功能讲解地址:http://www.cxyclub.cn/n/40768/ 此处主要是阐述禁用这个功能:

带说名文字的菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

bootstrap-轮播广告页(带图片和文字)

<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width

ProgressDialog(四)——改变系统自带ProgressDialog的文字大小

MainActivity如下: package com.example.ttt; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.Window; /** * Demo描述: * 改变系统自带ProgressDialog的文字大小 * * 改变方式: * 为ProgressDialog设置一个style即可 * 参见styles

自定义带图片和文字的ImageTextButton

今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学习.下一次或者过几天我会从自定义属性,在布局文件中使用属性的方式再讲一篇关于自定义控件的文章,希望对大家能够有所帮助. 现在开始讲自定义带图片和文字的ImageTextButton的实现方法. 效果图如下: 第一步:新建一个image_text_buttton.xml的布局文件,供自定义的控件使用

HTML之canvas 8 绘制阴影-绘制文字

绘制阴影 Context.shadowOffetX:阴影横向位移量 Context.shadowOffetY:阴影纵向位移量 Context.shadowColor:阴影颜色 Context.shadowBlur阴影的模糊范围 绘制文字 Context.fillStyle=’#00F’; Context.font=”bold 30px sans-serif”; Context.fillText(“hello world”,0,0); Context.strokeText(“hello world