(一)TextOut函数的参数介绍:
1 BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE 2 HDC hdc, //用于显示字符串的控件ID 3 int nXStart, //字符串所在起始位置左上角(X,Y)的X坐标 4 int nYStart, //字符串所在起始位置左上角(X,Y)的Y坐标 5 LPCTSTR lpString, //显示的字符串内容 6 int cbString //字符串长度 7 ) ;
函数调用示例:
1 TextOut ( hdc, 20, 20, TEXT ("Hello World!"), 12 ) ;
第1个参数:表示显示字符串的控件ID;
第2个参数:表示字符串所在起始位置左上角(x,y)的x值为20;
第3个参数:表示字符串所在起始位置左上角(x,y)的y值为20;
第4个参数:表示字符串内容“Hello World!”;
第5个参数:表示字符串“Hello World!”长度为12;
wsprintf函数与TextOut函数的经典组合:
变量声明:
1 int iLength ; //字符串的长度 2 TCHAR szBuffer [1024] ; //临时变量szBuffer,可以存储最大字符个数为1024
函数调用:
1 iLength = wsprintf ( szBuffer, //将szBuffer指针指向字符串“The sum of %i and %i is %i”的地址 2 TEXT ("The sum of %i and %i is %i"), iA, iB, iA + iB ) ; //返回字符串长度为20 + (iA,iB,iA+iB)这3个数所占的字符长度 3 TextOut = ( hdc, x, y, szBuffer, iLength ) ; //在指定起始位置(x,y)输出字符串szBuffer
swprintf函数的参数介绍:
1 int swprintf( //返回字符串的长度 2 wchar_t *buffer, //将buffer指针指向format指针指向的字符串 3 const wchar_t *format //格式化字符串输出 4 [, argument] ... //可选参数 5 );
(二)TextOut函数实例应用
1 #include <windows.h> 2 3 /* 声明回调函数 */ 4 LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM ) ; 5 6 int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) 7 { 8 static TCHAR szAppName[] = TEXT ( "myTextOut" ) ; 9 HWND hwnd ; 10 MSG msg ; 11 WNDCLASS wndclass ; 12 13 wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口样式 14 wndclass.lpfnWndProc = WndProc ; //窗口的回调函数 15 wndclass.hInstance = hInstance ; //窗口实例句柄 16 wndclass.cbClsExtra = 0 ; //窗口结构体扩展:无 17 wndclass.cbWndExtra = 0 ; //窗口实例扩展:无 18 wndclass.hbrBackground = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ) ; //窗口背景颜色:白色 19 wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ) ; //窗口图标 20 wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ) ; //窗口中的鼠标样式 21 wndclass.lpszClassName = szAppName ; //窗口结构体名称 22 wndclass.lpszMenuName = NULL ; //主菜单名称:无 23 24 if ( !RegisterClass ( &wndclass ) ) 25 { 26 MessageBox ( NULL, TEXT ("无法注册窗口类!"), TEXT ("错误"), MB_OK | MB_ICONERROR ) ; 27 } 28 29 /* 创建窗口 */ 30 hwnd = CreateWindow ( szAppName, TEXT ("输出字符串演示"), 31 WS_OVERLAPPEDWINDOW, 32 CW_USEDEFAULT, CW_USEDEFAULT, 33 CW_USEDEFAULT, CW_USEDEFAULT, 34 NULL, NULL, hInstance, NULL ) ; 35 36 /* 显示与更新窗口 */ 37 ShowWindow ( hwnd, iCmdShow ) ; 38 UpdateWindow (hwnd) ; 39 40 /* 从消息队列中获取消息 */ 41 while ( GetMessage ( &msg, NULL, 0, 0 ) ) 42 { 43 TranslateMessage ( &msg ) ; //将虚拟键消息转换为字符消息 44 DispatchMessage ( &msg ) ; //分发到回调函数 45 } 46 47 return msg.wParam ; 48 } 49 50 /* 回调函数 */ 51 LRESULT CALLBACK WndProc ( HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam ) 52 { 53 static HDC hdc ; 54 PAINTSTRUCT ps ; 55 RECT rect ; 56 57 TCHAR szText [] = TEXT ("Hello World!") ; 58 static int cxChar, cyChar ; 59 60 switch ( umsg ) 61 { 62 case WM_CREATE : //处理窗口创建成功后发来的消息 63 cxChar = LOWORD (GetDialogBaseUnits ()); //获得窗口中内定字体字元宽度(低字组) 64 cyChar = HIWORD (GetDialogBaseUnits ()); //或得窗口中内定字体字元高度(高字组) 65 return 0 ; 66 67 case WM_PAINT: //处理窗口产生无效区域时发来的消息 68 hdc = BeginPaint ( hwnd, &ps ) ; 69 70 GetClientRect ( hwnd, &rect ) ; //获取窗口的矩形区域 71 TextOut ( hdc, 72 rect.right / 2 - cxChar * lstrlen ( szText ) / 2, //使字符串在窗口中水平居中 73 ( rect.bottom - cyChar ) / 2, //使字符串在窗口中垂直居中 74 szText, //字符串的内容 75 lstrlen ( szText ) //lstrlen函数获取字符串的长度 76 ) ; 77 EndPaint ( hwnd, &ps ) ; 78 return 0 ; 79 80 case WM_DESTROY: //处理窗口关闭时发来的消息 81 PostQuitMessage (0) ; 82 return 0 ; 83 } 84 85 return DefWindowProc ( hwnd, umsg, wParam, lParam ) ; 86 }
运行结果:
代码说明:
(1)程序主要包含WinMain主函数与WndProc回调函数;
1 /* 主函数 */ 2 int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ) 3 4 /* 回调函数 */ 5 LRESULT CALLBACK WndProc ( HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam )
(2)在WinMain主函数中,主要实现窗口结构体的声明与属性赋值,窗口结构体注册,以及窗口的创建、显示和消息获取;
<1>窗口结构体的声明、属性赋值与注册
1 WNDCLASS wndclass ; //声明窗口结构体 2 3 wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口样式 4 wndclass.lpfnWndProc = WndProc ; //窗口的回调函数 5 wndclass.hInstance = hInstance ; //窗口实例句柄 6 wndclass.cbClsExtra = 0 ; //窗口结构体扩展:无 7 wndclass.cbWndExtra = 0 ; //窗口实例扩展:无 8 wndclass.hbrBackground = ( HBRUSH ) GetStockObject ( WHITE_BRUSH ) ; //窗口背景颜色:白色 9 wndclass.hIcon = LoadIcon ( NULL, IDI_APPLICATION ) ; //窗口图标 10 wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ) ; //窗口中的鼠标样式 11 wndclass.lpszClassName = szAppName ; //窗口结构体名称 12 wndclass.lpszMenuName = NULL ; //主菜单名称:无 13 /* 注册窗口结构体 */ 14 if ( !RegisterClass ( &wndclass ) ) 15 { 16 MessageBox ( NULL, TEXT ("无法注册窗口类!"), TEXT ("错误"), MB_OK | MB_ICONERROR ) ; 17 }
<2>窗口创建与显示
1 /* 创建窗口 */ 2 hwnd = CreateWindow ( szAppName, TEXT ("输出字符串演示"), 3 WS_OVERLAPPEDWINDOW, 4 CW_USEDEFAULT, CW_USEDEFAULT, 5 CW_USEDEFAULT, CW_USEDEFAULT, 6 NULL, NULL, hInstance, NULL ) ; 7 8 /* 显示与更新窗口 */ 9 ShowWindow ( hwnd, iCmdShow ) ; 10 UpdateWindow (hwnd) ;
<3>消息获取
1 /* 从消息队列中获取消息 */ 2 while ( GetMessage ( &msg, NULL, 0, 0 ) ) 3 { 4 TranslateMessage ( &msg ) ; //将虚拟键消息转换为字符消息 5 DispatchMessage ( &msg ) ; //分发到回调函数 6 }
(3)在WndProc回调函数中,主要对Windows发来的消息进行处理,获取字体的宽度与高度,设置字符串显示的位置,显示字符串。
<1>获取字体的宽度与高度
1 cxChar = LOWORD (GetDialogBaseUnits ()); //获得窗口中内定字体字元宽度(低字组) 2 cyChar = HIWORD (GetDialogBaseUnits ()); //或得窗口中内定字体字元高度(高字组)
<2>设置字符串显示的位置并显示字符串
1 hdc = BeginPaint ( hwnd, &ps ) ; 2 3 GetClientRect ( hwnd, &rect ) ; //获取窗口的矩形区域 4 TextOut ( hdc, 5 rect.right / 2 - cxChar * lstrlen ( szText ) / 2, //使字符串在窗口中水平居中 6 ( rect.bottom - cyChar ) / 2, //使字符串在窗口中垂直居中 7 szText, //字符串的内容 8 lstrlen ( szText ) //lstrlen函数获取字符串的长度 9 ) ; 10 EndPaint ( hwnd, &ps ) ;