DrawText 函数的问题? 我想使输出的效果是“效 果 是 这 样 的”即是竖向排列的?怎么办? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void draw( HDC hDC ){ 计算字体大小;\\用API函数GetTextMetrics(...),查查手册吧,我也记不清楚。 while( 要显示的字符串没结束 ) { ::Textout(...);\\显示下一个字符,注意该函数中将要显示字符坐标的参数。 }} 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;} 中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用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.编译连接,运行。 楼主为什么非要用DrawText, 用TextOut实现不是很好吗? 老大们,其实是这样的,我在网上找了一个类似QQ弹出窗口的例子它自己生成了一个Tab,在Tab上可一些文本和放图标可是当这个窗口在左边和右边的时候,它的图标是显示在下面的文字也是紧接图标的,可是我想改成图标在上边的,并且文字也是竖向排列的效果,那位大哥要是有兴趣我可以发给你,随便帮小弟看看能实现不? 对话框中双缓存问题 腾讯既然做了个TXGuiFoundation,那有没有说过这个库的授权? 使用AutoLoad创建位图按钮编译通过了但是运行不起来是怎么回事啊 GetQueuedCompletionStatus 为何没有返回呢!郁闷! VC中在基于dialog的程序中调用一个Wnd的窗口 线程中的定时器问题,在线等急! 一个C++成员函数的问题 菜鸟问题:使用_T宏和不使用_T宏有什么区别? 如何比较两个数据库里的数据完全一样,提供可行思路就给分 一个简单的问题,我用vc怎么复制一个文件,或者给一个文件改名 wm_notify 消息在什么时候可用 如何在SQL语句中引用变量???
{
计算字体大小;\\用API函数GetTextMetrics(...),查查手册吧,我也记不清楚。
while( 要显示的字符串没结束 )
{
::Textout(...);\\显示下一个字符,注意该函数中将要显示字符坐标的参数。
}
}
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;
}
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.编译连接,运行。
它自己生成了一个Tab,在Tab上可一些文本和放图标
可是当这个窗口在左边和右边的时候,它的图标是显示在下面的
文字也是紧接图标的,可是我想改成图标在上边的,并且文字也是
竖向排列的效果,那位大哥要是有兴趣我可以发给你,随便帮小弟看看
能实现不?