《Windows程序设计》读书笔记之输出文本

来源:互联网 发布:淘宝移动端详情页尺寸 编辑:程序博客网 时间:2024/05/21 09:24


1.客户区(Client Area):整个应用程序窗口中未被标题栏,窗口边框以及可选的菜单栏,工具栏,状态栏和滚动条占据的部分。

2.WM_PAINT消息产生:
    (1)在用户移动窗口或显示窗口时,窗口中先前隐藏的区域重新可见;
    (2)用户改变窗口的大小。
    (3)程序使用ScrollWindow或ScrollDC函数滚动客户区的一部分;
    (4)程序使用InvalidateRect或InvalidateRgn函数显式产生WM_PAINT消息
    (5)覆盖了部分窗口的对话框或消息框被移开;
    (6)菜单下拉出来,然后被释放;
    (7)显示工具提示;

Windows为每个窗口保存一个绘图信息结构体:PAINTSTRUCT,

无效矩形:包围无效区域的最小矩形

两个函数:
(1)InvalidateRect:使客户区的矩形区域无效
BOOL InvalidateRect(
  HWND hWnd,  // handle of window with changed update region
  CONST RECT *lpRect,
              // address of rectangle coordinates
  BOOL bErase // erase-background flag
);
如:InvalidateRect(hwnd,NULL,TRUE);//使整个客户区变为无效,并擦除背景

 

(2)ValidateRect:使客户区内的任意矩形区域变为有效.
BOOL ValidateRect(
  HWND hWnd,  // handle of window
  CONST RECT *lpRect
              // address of validation rectangle coordinates
);

如:ValidateRect(hwnd,NULL); //使整个客户区有效

 

3.设备描述表(Device Context)
(1)DC是GDI内部保存的数据结构,与特定的显示设备相关.
(2)程序绘图前,必须先获取设备描述表句柄
(3)程序绘图完后,必须释放设备描述表句柄.句柄释放后不再有效.
(4)获得DC的方法

方法一:在处理WM_PAINT消息时,使用BeginPaint和EndPaint两个函数

HDC hdc;
hdc=BeginPaint(hwnd,&ps);
  [GDI functions]
EndPaint(hwnd,&ps);

注:
①BeginPaint函数一般在准备绘制时导致无效区域的背景被擦除,使无效区域变为有效,从而整个客户区变为有效.
②BeginPaint和EndPaint必须成对调用.
③若窗口过程函数不处理WM_PAINT消息,则应传递给DefWindowProc处理.

方法二:在处理非WM_PAINT消息时,使用GetDC和ReleaseDC函数

hdc=GetDC(hwnd);
 [GDI functions]
ReleaseDC(hwnd,hdc);

注:
①GetDC不会使无效区域变为有效.
②GetDC和ReleaseDC必须成对调用.

★总结:BeginPaint和GetDC的异同
            
相同:
①都返回设备描述表句柄hdc
②都必须成对使用.
③BeginPaint在处理WM_PAINT消息时使用,GetDC在处理非WM_PAINT消息时使用.

不同: 
①BeginPaint会导致无效区域变为有效,而GetDC不会.
②BeginPaint获得的hdc,默认的剪取区域为无效区域,而GetDC获得的hdc,默认的剪取区域为整个客户区.
   

4.输出文本

方法一:DrawText
useage:
int DrawText(
  HDC hDC,          // handle to device context
  LPCTSTR lpString, // pointer to string to draw
  int nCount,       // string length, in characters
  LPRECT lpRect,    // pointer to struct with formatting dimensions
  UINT uFormat      // text-drawing flags
);
 
注:If nCount is –1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically.

例:
HDC hdc;
RECT rect;
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Beijing!"),-1,&rect,DT_SINGLELINE|DT_CENTER |DT_VCENTER);

方法二:TextOut
useage:
 BOOL TextOut(
  HDC hdc,           // handle to device context
  int nXStart,       // x-coordinate of starting position
  int nYStart,       // y-coordinate of starting position
  LPCTSTR lpString,  // pointer to string
  int cbString       // number of characters in string
);

例:

TCHAR szbuffer[100];
TextOut(hdc,200,200,szbuffer,wsprintf(szbuffer,"Hello,Beijing!"));
注:sprintf(在<stdio.h>中定义)/wsprintf:将指定字符串存储到szbuffer中,返回字符串长度

原创粉丝点击