文本输出方法与字体的设置
学习目的 掌握获取字体句柄的两种方法;调用CreateFont函数创建自定义字体; 调用SetTextColor和SetBkColor函数设置字体的颜色和背景色; 掌握文本输出的过程(获取字体信息, 格式化文本, 输出文本).
1. 掌握获取字体句柄的方法: HFONT hF; //定义字体句柄变量hF hF=GetStockObject(); //获得系统字体句柄 SelectObject(hdc,hF); //将字体选入设备环境
2. CreateFont函数创建自定义字体 HFont = CreateFont( int nHeight, // height of font int nWidth, // average character width int nEscapement, // angle of escapement int nOrientation, // base-line orientation angle int fnWeight, // font weight DWORD fdwItalic, // italic attribute option DWORD fdwUnderline, // underline attribute option DWORD fdwStrikeOut, // strikeout attribute option DWORD fdwCharSet, // character set identifier DWORD fdwOutputPrecision, // output precision DWORD fdwClipPrecision, // clipping precision DWORD fdwQuality, // output quality DWORD fdwPitchAndFamily, // pitch and family LPCTSTR lpszFace // typeface name ); 3.设置字体的颜色和背景色 SetTextColor(hdc,crColor); //设置字体颜色 SetBkColor(hdc,crColor); //设置背景色色 4. 掌握文本输出的过程 (1)获取字体信息 GetTextMetrics(hdc,&tm); (2) 格式化文本 用GetTextExtentPoint32()确定后续文本的坐标,然后根据当前字体信息确定换行后的坐标。 (3) 输出文本 使用TextOut或者DrawText输出文本:
5.编写程序: 在窗口上设计一行文字, 要求文字能在窗口中向左滚动显示, 而且每显示一轮, 改变一次颜色和字体. 程序主要代码如下: static int Flag=0; int X=0; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hDC; RECT clientRect; //TCHAR szHello[MAX_LOADSTRING]; //LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); HFONT hF; TEXTMETRIC tm; char text[]="Windows 程序设计实验三"; //输出的字符串. char chFont[7]; //定义包含字体的字符串. int xOrg,yOrg,Y=0,nCharlen=strlen(text); switch (message) { case WM_CREATE: SetTimer(hWnd,1,50,NULL); //设定定时器.每0.2秒发出WM_TIMER消息. break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd,&clientRect); xOrg=(clientRect.left+clientRect.right)/2; yOrg=(clientRect.top+clientRect.bottom)/2;
SetViewportOrgEx(hDC,0,yOrg,NULL); // TODO: Add any drawing code here...
if(Flag%4==0) //设置字体颜色. { SetTextColor(hDC,RGB(255,0,0)); strcpy(chFont,"楷体"); } else if(Flag%4==1) { SetTextColor(hDC,RGB(0,255,0)); strcpy(chFont,"宋体"); } else if(Flag%4==2) { SetTextColor(hDC,RGB(0,0,255)); strcpy(chFont,"仿宋体"); } else if(Flag%4==3) { SetTextColor(hDC,RGB(255,255,0)); strcpy(chFont,"黑体"); } hF=CreateFont( //获得字体句柄. 100, //字体高度 0, //系统自动调整宽度. 0, //文本水平 0, //字体倾斜度为0 400, //字体粗度.400为正常. 0, //字体不倾斜. 0, //无下划线. 0, //无中划线. GB2312_CHARSET, //字符集 OUT_DEFAULT_PRECIS, //默认输出精度. CLIP_DEFAULT_PRECIS,//默认裁剪精度 DEFAULT_QUALITY, //默认输出质量. DEFAULT_PITCH|FF_DONTCARE,//默认间距 chFont); //字体名称.
SelectObject(hDC,hF); //选入字体. GetTextMetrics(hDC,&tm); //得到字体的信息. TextOut(hDC,X,Y-tm.tmHeight/2,&text[0],nCharlen); //输出.
X-=10; if(X+tm.tmAveCharWidth*nCharlen<0){ Flag++; if(Flag==4) Flag=0; X=clientRect.right; }
DeleteObject(hF); //删除字体. EndPaint(hWnd, &ps); break; case WM_TIMER: InvalidateRect(hWnd,NULL,1); //刷新用户区. break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } 编译并调试程序, |
滚动文字运行结果如下图:
本次学习的涉及文本输出,需要注意Windows字符类型! |