如何让CDC输出文字的时候让文字竖向排列

时间:2020-11-23 23:48:34
举个例子:我有一个个字符串“我想试一试”
输出结果如下:




12 个解决方案

#1


设置文字的效果啊,比如说宋体,改为 @宋体

#2


m_Font.CreateFont(nHeight, nWidth, nEscapement, nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, nCharSet, nOutPrecision, nClipPrecision, nQuality, nPitchAndFamily, _T("@宋体"));
//在字体名称前加@,你试一试

#3


或者插入回车换行

#4


#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevdLine,LPSTR lpCamce,int nCmdShow)
{
MSG msg;
WNDCLASS wcex;
wcex.style= CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName="Textclass";
wcex.lpszClassName="TextClass";

RegisterClass(&wcex);

HWND hWnd;
hWnd=CreateWindow("TextClass","show Text",WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
HANDLE hFont;
PAINTSTRUCT ps;

static int num=0;
const char *str[]=
{"请击鼠标左键或任意字符键",
"第一次击键,再击一次键。",
"第二次击键,再击一次键.",
"再击一次键结束程序运行"
};
switch(message)
{
case WM_CHAR:
if(++num==4) PostQuitMessage(0);
InvalidateRect(hWnd,NULL,true);
break;
case WM_LBUTTONDOWN:
if(++num==4) PostQuitMessage(0);
InvalidateRect(hWnd,NULL,true);
break;
case WM_PAINT:
int inix,iniy;
RECT rt;
GetClientRect(hWnd,&rt);
hdc=BeginPaint(hWnd,&ps);
hFont=CreateFont(25,18,-900,0,FW_BLACK,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"@宋体");
SelectObject(hdc,hFont);
SetBkColor(hdc,RGB(200,200,200));
SetTextColor(hdc,RGB(255,0,0));
inix=rt.right/9;
iniy=rt.bottom/3;
TextOut(hdc,inix,iniy+20*num,str[num],strlen(str[num]));
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}

#5


我用LOGFONT做的,
CFont* pOldFont=pDC->GetCurrentFont();
CFont newFont;
LOGFONT logfont;
pOldFont->GetLogFont(&logfont);

strcpy(logfont.lfFaceName,"@宋体");
newFont.CreateFontIndirect(&logfont);
pOldFont=pDC->SelectObject(&newFont);
CSize tSize =pDC->GetOutputTextExtent(sID);
// pDC->SetTextAlign(TA_BASELINE); 

pDC->TextOut(pSeat->m_nCenX-tSize.cx/2,pSeat->m_nCenY-tSize.cy/2,sID);
pDC->SelectObject(pOldFont);
可是结果是,所有字仍是横向排列,只不过每个字都倒下了。
后来我用了logfont.lfOrientation=2700;没有任何效果。

#6


//在OnDraw中。我已试过,绝对可以。
CFont MyFont;
LOGFONT logfont;
lstrcpy((LPSTR)logfont.lfFaceName, (LPSTR)"楷体_2312");
logfont.lfWeight = 700;
logfont.lfWidth = 20;
logfont.lfHeight = 50;
logfont.lfEscapement = 2700;
logfont.lfUnderline = FALSE;
logfont.lfItalic = FALSE;
logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = GB2312_CHARSET;
MyFont.CreateFontIndirect(&logfont);
HFONT__ * hOldFont;
hOldFont = (HFONT__*)pDC->SelectObject(MyFont);
pDC->TextOut(100, 100, "Hello, World");

#7


logfont.nEscapement=270*10即可,我用过!

#8


谢谢大家,不过现在还有一个问题,如果我输出的是阿拉伯数字的话,数字是倒下的,而汉字都没问题。
例如:
1




其中1是倒下的-

#9


数字是应该倒下的

#10


focus

#11


这个数字上下颠倒问题,以前我倒没留心,不过现在我有两个解决方案可以试试
1.创建两种字模,一个字模是logfont.nEscapement=270*10,另一个字模是logfont.nEscapement=90*10,
当前设备环境中究竟选用哪个字模取决于即将输出的当前码是Alpha码(汉字和英文字母),还是阿拉伯数字.
2.上述办法如果不能奏效,就单独对数字特别处理,把数字用MoveTo和LineTo画出来.

#12


把半角符号转换成全角的,就立起来了,呵呵。。。

#1


设置文字的效果啊,比如说宋体,改为 @宋体

#2


m_Font.CreateFont(nHeight, nWidth, nEscapement, nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, nCharSet, nOutPrecision, nClipPrecision, nQuality, nPitchAndFamily, _T("@宋体"));
//在字体名称前加@,你试一试

#3


或者插入回车换行

#4


#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevdLine,LPSTR lpCamce,int nCmdShow)
{
MSG msg;
WNDCLASS wcex;
wcex.style= CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName="Textclass";
wcex.lpszClassName="TextClass";

RegisterClass(&wcex);

HWND hWnd;
hWnd=CreateWindow("TextClass","show Text",WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
HANDLE hFont;
PAINTSTRUCT ps;

static int num=0;
const char *str[]=
{"请击鼠标左键或任意字符键",
"第一次击键,再击一次键。",
"第二次击键,再击一次键.",
"再击一次键结束程序运行"
};
switch(message)
{
case WM_CHAR:
if(++num==4) PostQuitMessage(0);
InvalidateRect(hWnd,NULL,true);
break;
case WM_LBUTTONDOWN:
if(++num==4) PostQuitMessage(0);
InvalidateRect(hWnd,NULL,true);
break;
case WM_PAINT:
int inix,iniy;
RECT rt;
GetClientRect(hWnd,&rt);
hdc=BeginPaint(hWnd,&ps);
hFont=CreateFont(25,18,-900,0,FW_BLACK,FALSE,TRUE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"@宋体");
SelectObject(hdc,hFont);
SetBkColor(hdc,RGB(200,200,200));
SetTextColor(hdc,RGB(255,0,0));
inix=rt.right/9;
iniy=rt.bottom/3;
TextOut(hdc,inix,iniy+20*num,str[num],strlen(str[num]));
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}

#5


我用LOGFONT做的,
CFont* pOldFont=pDC->GetCurrentFont();
CFont newFont;
LOGFONT logfont;
pOldFont->GetLogFont(&logfont);

strcpy(logfont.lfFaceName,"@宋体");
newFont.CreateFontIndirect(&logfont);
pOldFont=pDC->SelectObject(&newFont);
CSize tSize =pDC->GetOutputTextExtent(sID);
// pDC->SetTextAlign(TA_BASELINE); 

pDC->TextOut(pSeat->m_nCenX-tSize.cx/2,pSeat->m_nCenY-tSize.cy/2,sID);
pDC->SelectObject(pOldFont);
可是结果是,所有字仍是横向排列,只不过每个字都倒下了。
后来我用了logfont.lfOrientation=2700;没有任何效果。

#6


//在OnDraw中。我已试过,绝对可以。
CFont MyFont;
LOGFONT logfont;
lstrcpy((LPSTR)logfont.lfFaceName, (LPSTR)"楷体_2312");
logfont.lfWeight = 700;
logfont.lfWidth = 20;
logfont.lfHeight = 50;
logfont.lfEscapement = 2700;
logfont.lfUnderline = FALSE;
logfont.lfItalic = FALSE;
logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = GB2312_CHARSET;
MyFont.CreateFontIndirect(&logfont);
HFONT__ * hOldFont;
hOldFont = (HFONT__*)pDC->SelectObject(MyFont);
pDC->TextOut(100, 100, "Hello, World");

#7


logfont.nEscapement=270*10即可,我用过!

#8


谢谢大家,不过现在还有一个问题,如果我输出的是阿拉伯数字的话,数字是倒下的,而汉字都没问题。
例如:
1




其中1是倒下的-

#9


数字是应该倒下的

#10


focus

#11


这个数字上下颠倒问题,以前我倒没留心,不过现在我有两个解决方案可以试试
1.创建两种字模,一个字模是logfont.nEscapement=270*10,另一个字模是logfont.nEscapement=90*10,
当前设备环境中究竟选用哪个字模取决于即将输出的当前码是Alpha码(汉字和英文字母),还是阿拉伯数字.
2.上述办法如果不能奏效,就单独对数字特别处理,把数字用MoveTo和LineTo画出来.

#12


把半角符号转换成全角的,就立起来了,呵呵。。。