• 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 ) ;
  • 相关阅读:
    十分钟-Nginx 入门到上线
    83.面向忙碌开发者的 Android 知识点收录 (转)
    技术人,为什么需要构建知识图谱 (转载)
    C# 4.0四大新特性代码示例与解读
    .NET 项目代码风格要求
    .NET 推荐博客
    C# 五、谈扩展方法的理解
    ASP.NET 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
    ASP.NET 你必须知道的EF知识和经验
    Linq表达式、Lambda表达式你更喜欢哪个?
  • 原文地址:https://www.cnblogs.com/petrol/p/9784640.html
Copyright © 2020-2023  润新知