学习目的 掌握获取字体句柄的两种方法;调用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字符类型! |
原文:http://www.cnblogs.com/leftshine/p/5698610.html