关闭

Windows程序设计:文字输出

标签: windowsnullcallbackwinapiapplicationborder
900人阅读 评论(1) 收藏 举报
分类:


1.TextOUT函数

TextOUT是最为普遍的文字输出函数。TextOut向窗口的显示区域写入字符串。该函数结构如下:
BOOL TextOut(
  __in  HDC hdc,          //设备内容句柄,它是图形设备接口(GDI)的重要部分
  __in  int nXStart,      //字符串显示区域的开始位置,X坐标
  __in  int nYStart,      //字符串显示区域的开始位置,Y坐标
  __in  LPCTSTR lpString, //指向字符串的指针
  __in  int cbString      //字符串的长度
);

1.参数hdc为设备内容句柄,取得设备内容句柄可以用BeginPaint/EndPaint函数或GetDC/ReleaseDC函数。
2.参数nXStartnYStart为定义显示区域内字符串的开始位置,nXStart是水平位置,nYStart是垂直位置。字符串中第一个字符的左上角位于坐标点(nXStart,nYStart)。在内定的设备内容中,原点(nXStartnYStart均为0的点)是显示区域的左上角。
3.参数lpString是指向字符串的指针,可以有Text函数得到。例如:TEXT(“Hello World!”)。
4.参数
cbString为指针lpString指向的字符串的长度,可以由函数wsprintf得到。例如:

int iLength ;
TCHAR szBuffer [40] ; 
iLength = wsprintf (szBuffer, TEXT(“Hello World!”) ) ;
TextOut (hdc, 0, 0, szBuffer, iLength) ;

2.BeginPaint/EndPaint函数

BeginPaint函数准备指定的窗口来重绘并将绘画相关的信息放到一个PAINTSTRUCT结构中。

HDC BeginPaint(
  __in HWND hWnd,                    //被重绘的窗口的句柄
  __out const PAINTSTRUCT *lpPaint    //指向一个用来接收绘画信息的PAINTSTRUCT结构
);

如果函数成功,返回值是指定窗口的显示设备内容HANDLE。并且BeginPaint使得显示区域变得有效。
如果函数失败,返回值是NULL,指示没有得到显示设备内容。

EndPaint函数标记指定窗口的绘画过程结束;这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。

BOOL EndPaint(
  __in  HWND hWnd,                   //已经被重画的窗口的句柄
  __in const PAINTSTRUCT *lpPaint    //指向一个PAINTSTRUCT结构,该结构包含了绘画信息,
                                     //是BeginPaint函数返回的返回值
);

EndPaint返回值始终是非0。

3.GetDC/ReleaseDC函数

GetDC函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用返回的HDC该句柄来在设备上下文环境中绘图。
HDC GetDC(
  __in  HWND hWnd
);

参数hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。
如果成功,返回指定窗口客户区的设备内容句柄HDC;如果失败,返回值为Null。

ReleaseDC函数释放设备内容句柄HDC供其他应用程序使用。

int ReleaseDC(
  __in  HWND hWnd,
  __in  HDC hDC
);

4.示例

#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("SysMets1") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
 
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
 
     if (!RegisterClass (&wndclass))  
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
 
     hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 1"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
 
     ShowWindow (hwnd, iCmdShow) ;
     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)
{
     static int  cxChar, cxCaps, cyChar ;
     HDC         hdc ;
     PAINTSTRUCT ps ;
 
     switch (message)
     {
     case WM_CREATE:
          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
 
     case WM_PAINT :
          hdc = BeginPaint (hwnd, &ps) ;
 
          int iLength ; 
          TCHAR szBuffer [40] ;  
          iLength = wsprintf (szBuffer, TEXT("从坐标(0,0)开始绘制文字!") ) ; 
          TextOut (hdc, 0, 0, szBuffer, iLength);
 
          iLength = wsprintf (szBuffer, TEXT("从坐标(400,50)开始绘制文字,左对齐!") ) ; 
          TextOut (hdc, 400, 50, szBuffer, iLength);
 
          //SetTextAlign设定传给后续TextOut函数的坐标将指定字符串的右上角(右对齐)
          SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
          iLength = wsprintf (szBuffer, TEXT("从坐标(400,100)开始绘制文字,右对齐!") ) ; 
          TextOut (hdc, 400, 100, szBuffer, iLength);
 
          //SetTextAlign设定传给后续TextOut函数的坐标将指定字符串的左上角(左对齐)
          SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
 
          EndPaint (hwnd, &ps) ;
          return 0 ;
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
0
0
查看评论

Windows程序设计-输出文字

WM_PAINT消息窗口消息处理程序会接收到一个WM_PAINT消息的事件: 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。 使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。 程序使用ScrollWindow或ScrollDC函数滚...
  • lilongsy
  • lilongsy
  • 2017-09-05 11:08
  • 212

windows程序设计——输出文字

通常windows程序以响应WM_PAINT消息的方式而不是主动绘制,在客户区中输出文字和图形来向用户展示信息。在发生下面几种事件之一时,视窗讯息处理程式会接收到一个WM_PAINT 消息: 1.在使用者移动视窗或显示视窗时,视窗中先前被隐藏的区域重新可见。 2.使用者改变视窗的大小(如果视窗类...
  • pokeyode
  • pokeyode
  • 2017-05-26 15:37
  • 174

windows程序设计第四章 输出文字

绘制和更新 WM_PAINT消息 Windows通过发送WM_PAINT消息通知窗口消息处理程序,窗口的部分显示区域需要绘制。 在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息: 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。 使用者改变窗口的...
  • dy106
  • dy106
  • 2013-04-08 22:13
  • 905

WINDOWS程序设计示例:输出文字

<br />在对话框中显示输出文字,并利用卷动列进行查看文本内容。<br /> <br />#include <windows.h><br />#include "Sysmets.h"<br />L...
  • zxs421819166
  • zxs421819166
  • 2011-03-30 17:49
  • 364

Windows程序设计--文本输出(一)

绘制和重绘 之前就写过,windows是一个消息驱动的系统,有两种方式把各种事件通知给应用程序:1是把消息放在应用程序的消息队列中;2是向适当的窗口过程直接发送消息。 这里主要讨论的是WM_PAINT消息 ,以下任何一个事件发送,窗口过程都会收到一条WM_PAINT消息: 1用户移动一个窗口,...
  • wangshubo1989
  • wangshubo1989
  • 2015-10-21 23:10
  • 20326

Windows程序设计-文本输出

1.WM_PAINT 消息 大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要调用函数UpdataWindow。Windows利用这一机会给窗口过程发送第一个WM_PAINT消息。       1.窗口过程会接收到一个WM_PAINT消息的事...
  • dby3579
  • dby3579
  • 2016-07-30 22:21
  • 723

windows程序设计学习笔记-文本和字体

BOOL TextOut( In HDC hdc, In int nXStart, In int nYStart, In LPCTSTR lpString, In int cchString );在指定位置写字符串。使用当前选择的字体,...
  • x13262608581
  • x13262608581
  • 2016-07-15 06:24
  • 1335

Windows程序设计——第四章《输出文字》要点摘要

1.WM_PAINT的时机: (1)在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。 (2)使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。 (3)程序使用ScrollWindow或ScrollDC函数滚...
  • zy00648280
  • zy00648280
  • 2008-06-28 11:25
  • 275

《Windows程序设计》读书笔记------------->>文字输出——多行文字<<

    因为TextOut是不能使用/n进行多行输出的,它的每一个行的位置都是由坐标决定的,所以要实现多行输出就要自己算每行的位置,所以就要知道每行的高度(在不考虑会超出右边界的情况下)。        程序取...
  • roybinux
  • roybinux
  • 2007-07-07 21:10
  • 880

windows程序设计笔记__输出文字1

显示区域1:显示区域是整个应用程序中为被标题列,窗口边框,以及可选的菜单列,工具列,状态列和滚动条占据的部分。简而言之,就是窗口中可以由程序而难以书写和传递视觉信息的部分。2:显示区域内可以为所欲为,只不过不能假定窗口大小是某一特定尺寸,所以尽管可以建立固定大小的窗口(这对于计算器之类的应用是合理的...
  • haskio
  • haskio
  • 2006-11-25 22:52
  • 779
    个人资料
    • 访问:603915次
    • 积分:7744
    • 等级:
    • 排名:第3261名
    • 原创:192篇
    • 转载:6篇
    • 译文:0篇
    • 评论:99条
    博客专栏
    文章分类
    最新评论