中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用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.编译连接,运行。

以上实例在Windows98下,以VC++6.0编译通过。

用VC实现竖写汉字的方法的更多相关文章

  1. springmvc2 一个控制器写多个方法(非注解方式)

    出处:http://blog.csdn.net/xuewenke/article/details/23895999 springmvc2 一个控制器写多个方法(非注解方式) 分类: spring 20 ...

  2. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  3. struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

    struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

  4. SpringMVC实现一个controller写多个方法

    MultiActionController与ParameterMethodNameResolver在一个Controller类中定义多个方法,并根据使用者的请求来执行当中的某个方法,相当于Struts ...

  5. 使用第三方工具覆写Object中方法

    我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...

  6. CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写

    Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...

  7. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  8. 应用反射写的tostring方法

    应用反射写的tostring方法 应用反射写的tostring方法,方便以后查询 代码 package com.chzhao.reflecttest; import java.lang.reflect ...

  9. [改善Java代码]覆写变长方法也循规蹈矩

    建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...

随机推荐

  1. 运行计划之误区,为什么COST非常小,SQL却跑得非常慢?

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38321477 2014.7.31就晚20:30 My Oracle Support组猫大师 ...

  2. c++实现查询天气预报

    原地址:http://blog.csdn.net/x_iya/article/details/8583015 用到的函数.API等 1.中央气象台API返回的JSON数据(http://m.weath ...

  3. Oracle10g数据泵EXPDP和IMPDP备份与恢复数据

    Oracle10g数据泵EXPDP和IMPDP备份与恢复数据 一.数据库备份前准备工作 新建备份DIRECTORY目录,并授权给用户 步骤: 1.登录sqlplus 账户名:ptemp 密码:0000 ...

  4. Swift - 给图片添加滤镜效果(棕褐色老照片滤镜,黑白滤镜)

    Core Image是一个强大的滤镜处理框架.它除了可以直接给图片添加各种内置滤镜,还能精确地修改鲜艳程度, 色泽, 曝光等,下面通过两个样例演示如何给UIImage添加滤镜. 1,棕褐色滤镜  -  ...

  5. openssl生成pem,密钥证书的创建

    使用OpenSSL生成证书 首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情: o Creation of RSA, DH and DSA Key Paramet ...

  6. (step 8.2.8)hdu 1079(Calendar Game)

    题目大意是: 两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month.......... 而且如果下一个月没有当前day的话, 你就不能移动mo ...

  7. Android Gradle Plugin指南(六)——高级构建定制

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization ...

  8. Android UI 学习 自定义的布局 平滑移动 VelocityTracker()

    /**  * Helper for tracking the velocity of touch events, for implementing  * flinging and other such ...

  9. ASP.NET - Eval数据绑定

    <!--新闻分类--> <div id ="category" class ="Frm"> <h4>新闻分类</h4& ...

  10. overflow:hidden与position:absolute

    在做一个下拉框的动画效果中遇到了这个bug,记录一下. 在写下拉框的动画的时候,一般我们的做法都是把下拉框的外盒子设为overflow:hidden,然后设下外层盒子高度,之后通过js慢慢的改变高度从 ...