C語言Windows程序開發—TextOut函數介紹【第02天】


(一)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 }
View Code

運行結果:

 

代碼說明:

(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 ) ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM