赛迪网 > IT技术 今日更新 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

用VC实现竖写汉字的方法

发布时间:2003.08.28 16:09     来源:赛迪网    作者:王卫东

  中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用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实现在线订货 (03-10) · 用VC设计托盘图标程序 (03-06)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管