Windows程序设计:文字输出

标签: windowsnullcallbackwinapiapplicationborder
809人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:567279次
    • 积分:7416
    • 等级:
    • 排名:第3263名
    • 原创:189篇
    • 转载:6篇
    • 译文:0篇
    • 评论:97条
    博客专栏
    文章分类
    最新评论