文字的纵向显示的问题 cdc drawtext
中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实现竖写汉字效果的方法,现在就把它介绍给大家。
Windows系统内置了许多名称以“@”开头的字集,这些字集有一个共同的特点,即其所包含的文字全都是平躺着的(字头朝左,字底朝右)。如果我们能将这些字逆时针旋转270度后再显示出来,就可以达到实现竖写汉字效果的目的了。
要使文字发生旋转,我们只需创建一个逻辑字体并设定该逻辑字体的显示角度,再设定其字体名称为一个以“@”开头的字集的名称即可。我们可以采用两种方式创建逻辑字体。
其一,用CFont类的成员函数CreateFont直接创建逻辑字体。CreateFont的参数定义如下:
BOOL CreateFont(
int nHeight, //字体的高度
int nWidth, //字体的宽度
int nEscapement, //字体显示的角度
int nOrientation, //字体的角度
int nWeight, //字体的磅数
BYTE bItalic, //斜体字体
BYTE bUnderline, //带下划线的字体
BYTE cStrikeOut, //带删除线的字体
BYTE nCharSet, //所需的字符集
BYTE nOutPrecision, //输出的精度
BYTE nClipPrecision, //裁减的精度
BYTE nQuality, //逻辑字体与输出设备的实际
//字体之间的精度
BYTE nPitchAndFamily, //字体间距和字体集
LPCTSTR lpszFacename //字体名称
);
其中nEscapement单位为0.1角度,方向为逆时针,所以为了使平躺的字立起来应设定其值为2700,lpszFacename则赋以“@”开头的字集的名称,如“@system”。
其二,利用LOGFONT结构,将该结构作为参数调用CFont类的成员函数CreateFontIndirect创建逻辑字体。LOGFONT结构通常被用来描述一种逻辑字体,结构内的各变量分别代表逻辑字体的各个属性,这些变量与函数CreateFont的参数相同。其结构如下:
typedef struct tagLOGFONT { // lf
LONG lfHeight; //字体的高度
LONG lfWidth; //字体的宽度
LONG lfEscapement; //字体显示的角度
LONG lfOrientation; //字体的角度
LONG lfWeight; //字体的磅数
BYTE lfItalic; //斜体字体
BYTE lfUnderline; //带下划线的字体
BYTE lfStrikeOut; //带删除线的字体
BYTE lfCharSet; //所需的字符集
BYTE lfOutPrecision; //输出的精度
BYTE lfClipPrecision; //裁减的精度
BYTE lfQuality; //逻辑字体与输出设备的
//实际字体之间的精度
BYTE lfPitchAndFamily; //字体间距和字体集
TCHAR lfFaceName[LF_FACESIZE]; //字体名称
} LOGFONT;
下面我们就以一个示例来说明竖写汉字的实现方法:
1.建立一个MFC AppWizard(exe)应用工程CHNfont。在MFC AppWizard向导的第一步中选择Single Document,再点击按键Finish->OK完成工程的建立。
2.在CMainFrame::OnCreate函数中添加如下代码,使窗体最大化。AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);
3.添加如下代码实现竖写功能。
void CChildView::OnPaint()
{
CPaintDC dc(this);// device context for painting
/// 利用CFont::CreateFont(...)函数实现竖写汉字
CFont myFont; //创建字体对象
//创建逻辑字体
myFont.CreateFont(
56, //字体高度(旋转后的字体宽度)=56
20, //字体宽度(旋转后的字体高度)=20
2700, //字体显示角度=270°
0, //nOrientation=0
10, //字体磅数=10
FALSE, //非斜体
FALSE, //无下划线
FALSE, //无删除线
DEFAULT_CHARSET, //使用缺省字符集
OUT_DEFAULT_PRECIS, //缺省输出精度
CLIP_DEFAULT_PRECIS,//缺省裁减精度
DEFAULT_QUALITY, //nQuality=缺省值
DEFAULT_PITCH, //nPitchAndFamily=缺省值
"@system"); //字体名=@system
CFont *pOldFont=dc.SelectObject(&myFont);//选入设备描述表
CRect rtClient;
GetClientRect(rtClient); //获取客户区尺寸、位置信息
//在客户区适当位置输出文字
dc.TextOut(rtClient.Width()/2+30,rtClient.Height()/8,
"无边落木萧萧下");
dc.SelectObject(pOldFont); //将myFont从设备环境中分离
myFont.DeleteObject(); //删除myFont对象
/// 利用LOGFONT结构实现竖写汉字//
LOGFONT lf; //定义字体结构
lf.lfWeight=10; //字体磅数=10
lf.lfHeight=56; //字体高度(旋转后的字体宽度)=56
lf.lfWidth=20; //字体宽度(旋转后的字体高度)=20
lf.lfUnderline=FALSE; //无下划线
lf.lfStrikeOut=FALSE; //无删除线
lf.lfItalic=FALSE; //非斜体
lf.lfEscapement=2700; //字体显示角度=270°
lf.lfCharSet=DEFAULT_CHARSET; //使用缺省字符集
strcpy(lf.lfFaceName,"@system"); //字体名=@system
CFont myLogFont; //定义字体对象
myLogFont.CreateFontIndirect(&lf); //创建逻辑字体
pOldFont=dc.SelectObject(&myLogFont);//选入设备描述表
//在客户区适当位置输出文字
dc.TextOut(rtClient.Width()/2-30,rtClient.Height()/8,
"不尽长江滚滚来");
dc.SelectObject(pOldFont); //将myFont从设备环境中分离
myLogFont.DeleteObject(); //删除myLogFont对象
}
4.编译连接,运行。
或者
CString m_text;
CSize sz = pdc->GetTextExtent("效");
CRect rtCal; //要输出字符串的矩形区域。其宽度稍大于字符宽度。
rtCal.Width = sz.cx + 2;
int midhei=pDC->DrawText(m_text,&rtCal,flag | DT_CALCRECT |DT_WORDBREAK|DT_NOCLIP);
或者只是简单的用:
for (i=0;i<m_text.GetLength();i++){
pDC->TextOut(10,y,m_Text.GetAt(i));
y+= sz.cy;
}
程序执行后,如下:
文字的纵向显示的问题 cdc drawtext相关推荐
- Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改、横坐标文字进行横/纵向显示、控制坐标轴范围等)之详细攻略
Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改.横坐标文字进行横/纵向显示.控制坐标轴范围等)之详细攻略 目录 1.Matplotlib库图表绘制包 ...
- Echarts系列之怎么让文字纵向显示
如何让Echarts中的文字纵向显示? 实现上面的效果,我真的是仔细看了官方配置文档一遍又一遍,但是没有直接的配置项,这里我要说的解决方案是从值来解决的. 可以直接在字符串文字后面加如\ n,如'竖\ ...
- div css纵向显示 html,css如何设置竖排文字?
有时候网页中的文字因为特别要求不能横向显示,这时候所需要的就是让文字来竖排显示,那么,网页中如何让文字竖排显示呢?接下来本篇文章将介绍css实现文字竖排显示的方法,希望对大家有所帮助. 方法一:使用w ...
- echarts x轴文字个数太多_echarts x轴标签文字过多导致显示不全,最有效的3种解决方法...
echarts x轴标签文字过多导致显示不全,只是我之前在csdn发表过,经过实践,效果不错! 如图: 办法1:xAxis.axisLabel 属性 axisLabel的类型是object ,主要作用 ...
- echarts横坐标文字太长显示不完的两种解决办法:rotate旋转文字、调用函数让文字纵向排列
//方法1:横坐标文字太长显示不完,调用函数解决,在axisLabel下添加属性,让文字纵向排列: formatter:function(val){return val.split("&qu ...
- UIButton文字居左显示
今天我们来讲如何让UIButton文字居左显示?我们都应该写过让UILabel的text居左显示.代码也非常简单. UILabel文字居左显示 实现文字居左显示代码如下: UILabel *label ...
- php 中文 过长 省略号,css实现文字过长显示省略号
本篇文章介绍了css实现文字过长显示省略号的方法,具有一定的参考价值,希望对学习css的朋友有帮助! 一.CSS样式 解决文字过长显示省略号问题 1.一般样式 一般 css 样式,当宽度不够时,可能会 ...
- 【css】文字溢出,显示省略符号(...)
前言 CSS3 文字溢出,显示省略符号需要区分情况进行处理:可分为单行和多行的情况. 单行文字溢出 假设有这样的需求,如图: 那么可以用如下代码实现: <!DOCTYPE html> &l ...
- echarts实现给图例添加单位、百分比,以及图例文字过长显示省略号
修改lengend formatter: (name) => {if (this.seriesData.length) {let sum = 0;this.seriesData.forEach( ...
最新文章
- 32位md5解密_用户名与密码前后加密、后台解密实现方案
- 设计模式 — 创建型模式 — 工厂模式
- java dao模式_Java DAO 模式
- WebBenchmark之动态数据测试
- CF626F. Bear and Fair Set
- 个人信息保护呼吁“基本法”
- C#——await与async实现多线程异步编程
- jquery选择器小知识点们
- PHP 必须勾选用户协议,javascript实现用户必须勾选协议实例讲解
- 关于新手学习seo入门的指南建议
- FME进阶视频教程: FME使用技巧之高级扇出,讲解在FME中输出数据的高级方式,满足数据个性化分类输出的需求
- 淘宝网首页登录失败原因分析及解决…
- HTML打开网页自动播放音乐
- eclipse安装STS支持注意的坑
- 用 Python 生成 CSV 文件
- mysql连接异常:The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zo
- java分布式事务——seata,tcc解决方案总结!
- docker安装GraphDB
- 什么是Filter过滤器
- 毕节计算机考试准考证打印,2016年9月毕节计算机三级四级准考证打印入口,计算机等级考试时间查询...
热门文章
- JVM错误日志hs_err_pid****.log分析
- java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
- svn冲突问题详解 SVN版本冲突解决详解
- Map与Json之间的转化
- Linux TTY基本概念之ttys*、tty*、ttyS*、console理解
- 天翼云服务器的一些问题及解决方式
- Salesforce Apex 中常用技能总结(持续更新)
- 教学|3DsMAX怎么样制作环境贴图,3D建模步骤教程
- Word输入一个字,后面就会消失一个字,该怎么办
- 中国石油大学(北京)-《外国文学作品选读》第一阶段在线作业