设为首页 加入收藏

TOP

Windows编程基础 - 文本显示(一)
2014-11-23 21:38:06 来源: 作者: 【 】 浏览:2
Tags:Windows 编程 基础 文本 显示
前一章所介绍的程序只创建了一个的窗口,但是除了窗口的标题栏中显示的窗口名之外,并未用它显示其它信息。应用程序可以在窗口的用户区内显示文本和图形信息。本章仅讨论文本行的显示。通过本章的程序实例,我们将介绍几个用于文本输出的Windows函数以及有效和无效矩形区的概念。同时介绍有关设备对象和字体尺寸的基本概念。这里,我们还将介绍几个重要的Windows消息。应用程序可以利用这些消息进行程序的初始化和终止处理,以及完成应用程序的任务等。

2.1、显示信息
  下面的程序从用户区的左上角开始显示“Hello,Welcome to Windows”。

   // 2-1.c 显示信息
   #include

  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  int PASCAL WinMain(
    HINSTANCE hInstance,
    // 应用程序的实例句柄
     HINSTANCE hPrevInstance,  // 该应用程序前一个实例的句柄
     LPSTR lpszCmdLine,     // 命令行参数串
     int nCmdShow )       // 程序在初始化时如何显示窗口
   {
     char szAppName[] = "DispText";
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    if (!hPrevInstance) {
       // 该实例是程序的第一个实例,注册窗口类
       wndclass.style = CS_VREDRAW | CS_HREDRAW;
      wndclass.lpfnWndProc = WndProc;
      wndclass.cbClsExtra = 0;
      wndclass.cbWndExtra = 0;
      wndclass.hInstance = hInstance;
      wndclass.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
      wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
      wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
      wndclass.lpszMenuName = NULL;
      wndclass.lpszClassName = szAppName;

      if (!RegisterClass(&wndclass))
         // 如果注册失败
         return FALSE;
    }

     // 对每个实例,创建一个窗口对象
     hwnd = CreateWindow(
      szAppName,
      "Display Text",
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT,
      NULL,
      NULL,
      hInstance,
      NULL );

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

    return msg.wParam;
  }


   LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  {
    char msg[] = "Hello, Welcome to Windows!";
    PAINTSTRUCT ps;
    HDC hDC;

    switch(message)
    {
      case WM_PAINT:
        hDC = BeginPaint(hwnd, &ps);
        TextOut (hDC, 0, 0, msg, sizeof(msg) - 1);
        EndPaint(hwnd, &ps);
        return 0;

      case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
  }


  我们首先介绍这个程序中使用的Windows数据类型,然后介绍和这几个类型有的Windows函数,最后介绍消息WM_PAINT的含义。
  HDC是在Windows.h中定义的一个数据类型,类似于HWND,它是用于标识一个设备对象的句柄;许多绘图函数需要这个句柄,这些绘图函数在这个句柄标识的对象上绘图。
  PAINTSTRUCT结构类型的变量所包含的信息可被用来重新绘制窗口的用户区域,下面的定义中只给出应用程序关心的几个域,其它未列出的域是供Windows 系统使用的。

   typedef struct tagPAINTSTRUCT {
    HDC hdc;
    // 标识显示设备对象的句柄
     BOOL fErase;  // 若为非零。说明用户背景已被重画过,否则未被重画
     RECT rcPaint; // 指定要求重画(着色)的矩形区域的左上角和右下角坐标
    //......

   } PAINTSTRUCT;

  其中,类型RECT的说明为:

   typedef struct tagRECT {
    int left;
   // 矩形左上角的X坐标值
     int top;   // 矩形左上角的Y坐标值
     int right;  // 矩形右上角的X坐标值
     int bottom;  // 矩形右上角的Y坐标值
   } RECT;

  函数BeginPaint()使用一个窗口句柄和一个指向PAINTSTRUCT类型的变量的指针为参数,它除了填充该指针所指向的变量的各域以外,同时向Windows借用一个显示设备用于绘制用户区。该函数返回这个设备对象的句柄,有了该句柄,应用程序就可以随意绘制用户区。函数EndPaint()与函数BeginPaint()所使用的参数一样,它必须与函数BeginPaint()配对使用,并且必须同时都用在WM_PAINT消息内。函数EndPaint()有两个作用。其一是归还BeginPaint()所借用的显示设备对象。Windows管理着五个公用的显示设备对象,供应用程序在显示设备上进行文本和图形输出所用。当一个窗口对象要绘制它的用户区时,它必须首先向Windows借用一个显示设备对象。由于公用的显示设备对象有限,因此,窗口对象在绘制完它的用户区之后,必须及时归还它所借用的设备对象,以不影响其它对象使用公用显示设备对象。一般的原则是:在从窗口函数中返回之前,应归还所借用的显示设备对象。EndPaint()函数的第二个作用是消除应用程序消息队列中的WM_PAINT消息,关于WM_PAINT消息,我们放在后面单独讨论。
  函数TextOut()使用BeginPaint()所借用的显示设备对象,在用户区中显示一条消息。表2-1给出该函数的使用说明。

   表2-1 TextOut 函数
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.cli
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Windows编程基础 - 概述 下一篇函数fabs的功能介绍

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: