第四章 文本输出(1.文本显示)
来源:互联网 发布:你为什么选择淘宝客服 编辑:程序博客网 时间:2024/05/18 09:19
client 顾客;
窗口过程可以通过调用 InvalidateRect 函数来强制使自己的客户区中的一个矩形失效。可以通过调用GetUpdateRect函数来获取无效区域坐标。
也可以通过调用 ValidateRect 函数来使客户区中任意的矩形变得有效。
常用的字符输出函数格式:
TextOut (hdc, x, y, psText, iLength);
TextOut函数向窗口的客户区输出一个字符串。
hdc :设备环境句柄
x, y 定义了字符串在客户区中的开始位置。
第三个参数:psText 是指向字符串的指针,
第四个参数:iLength 是字符串的长度(以字符为单位)
设备环境中的某些值是图形“属性”。这些属性决定了GDI绘图函数的工作细节。
例如在TextOut函数中,设备环境的属性决定着文本的颜色、文本背景的颜色、函数的参数x,y如何映射到窗口的客户区,以及WINDOWS用什么字体显示文本。
获取设备环境(一)
hdc = BeginPaint(hwnd, &ps);[使用GDI函数]EndPaint(hwnd,&ps);
这种方法在处理WM_PAINT消息时使用。用到了两个函数:BeginPaint 和 EndPaint
这两个函数需要两个参数:一个是窗口的句柄,这是窗口消息处理过程的参数;
另一个是一个类型为PAINTSTRUCT结构的变量的地址。
在处理WM_PAINT消息时,窗口过程首先调用BeginPaint 函数。这个函数通常会擦去无效区域的背景以便绘图。它同时还会填充ps结构的各个字段。
函数的返回值就是一个设备环境句柄
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT;
程序只能使用前三个字段,其他的供Windows内部使用。
PAINTSTRUCT结构中的rcPaint字段定义了无效矩形的边界,这4个字段以像素为单位的,并相对于客户区的左上角。
通常WINDOWS收到WM_PAINT会重绘整个客户区而不管rcPaint结构的值如何
获取设备环境(二)
在处理非WM_PAINT消息时使用,
hdc = GetDC(hwnd);[使用GDI函数]ReleaseDC(hwnd,hdc);
与从BnginPaint函数返回的设备环境句柄不同,从GetDC返回的设备环境句柄中的裁剪矩形是整个客户区。
GetDC不会将无效区域有效化。
但可以调用函数:ValidateRect(hwnd, NULL);
通常,GetDC 和 ReleaseDC函数用于处理键盘消息或者鼠标消息
GetDC返回的是窗口客户区的设备环境句柄,GetWindowDC返回的则是整个窗口的设备环境句柄。例如,程序可以使用从GetWindowDC返回的设备环境句柄在窗口的标题栏输出,相应的,程序也必须要处理WM_NCPAINT(非客户区绘制)消息。
调用 GetSystemMetrics 函数来获取用户界面的尺寸,返回值是一个整数
同样调用 GetTextMetrics 函数可以获取字体尺寸,它需要一个设备环境句柄,因为它会返回该设备环境中当前选定的字体的信息。
Windows将把字符尺寸的各种值复制到类型为TEXTMETRIC的结构中,该结构在WINGDI.H头文件中定义,有20个字段,但我们只关心其中前7个;
typedef struct tagTEXTMETRIC { LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; LONG tmOverhang; LONG tmDigitizedAspectX; LONG tmDigitizedAspectY; TCHAR tmFirstChar; TCHAR tmLastChar; TCHAR tmDefaultChar; TCHAR tmBreakChar; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmPitchAndFamily; BYTE tmCharSet; } TEXTMETRIC, *PTEXTMETRIC; 这些字段的值的单位取决于设备环境中当前选定的映射模式。默认的映射模式是 MM_TEXT ,所以它们的值是以像素为单位的。
TEXTMETRICS结构中的另一个字段是tmExternalLeading是设计者建议在两行文字之间留出的空间大小。
文本的格式化:Windows运行时,系统字体不会变化。因此,应用程序只需要调用一次GetTextMetrics函数。最好的时机是在窗口过程处理WM_CREATE消息时。WM_CREATE消息是窗口过程收到的第一条消息。
#define WINVER 0x0500 //一个版本标号 #include <windows.h>#include "sysmets.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 ; RegisterClass (&wndclass); 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 ; int i ; PAINTSTRUCT ps ; TCHAR szBuffer [10] ; TEXTMETRIC tm ; switch (message) { case WM_CREATE: hdc = GetDC (hwnd) ; GetTextMetrics (hdc, &tm) ; //获取系统字体属性并保存在tm前7个字段中 cxChar = tm.tmAveCharWidth ; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;//tmPitchAndFamily决定低位是否为等宽字体:1代表变宽字体,0代表等宽字体 cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; for (i = 0 ; i < NUMLINES ; i++) { TextOut (hdc, 0, cyChar * i, sysmetrics[i].szLabel, lstrlen (sysmetrics[i].szLabel)) ; TextOut (hdc, 22 * cxCaps, cyChar * i, sysmetrics[i].szDesc, lstrlen (sysmetrics[i].szDesc)) ; SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;//相对右上角对齐方式 TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer, wsprintf (szBuffer, TEXT ("%5d"), GetSystemMetrics (sysmetrics[i].iIndex))) ; //TextOut 最后一个参数:为字符串的长度,而wsprintf正好返回值为字符串的长度。 SetTextAlign (hdc, TA_LEFT | TA_TOP) ;//取消右上角对齐方式 } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;}
************************** sysmets.h *************************
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))struct{ int iIndex ; TCHAR * szLabel ; TCHAR * szDesc ;}sysmetrics [] ={ SM_CXSCREEN, TEXT ("SM_CXSCREEN"), TEXT ("Screen width in pixels"), SM_CYSCREEN, TEXT ("SM_CYSCREEN"), TEXT ("Screen height in pixels"), SM_CXVSCROLL, TEXT ("SM_CXVSCROLL"), TEXT ("Vertical scroll width"), SM_CYHSCROLL, TEXT ("SM_CYHSCROLL"), TEXT ("Horizontal scroll height"), SM_CYCAPTION, TEXT ("SM_CYCAPTION"), TEXT ("Caption bar height"), SM_CXBORDER, TEXT ("SM_CXBORDER"), TEXT ("Window border width"), SM_CYBORDER, TEXT ("SM_CYBORDER"), TEXT ("Window border height"), SM_CXFIXEDFRAME, TEXT ("SM_CXFIXEDFRAME"), TEXT ("Dialog window frame width"), SM_CYFIXEDFRAME, TEXT ("SM_CYFIXEDFRAME"), TEXT ("Dialog window frame height"), SM_CYVTHUMB, TEXT ("SM_CYVTHUMB"), TEXT ("Vertical scroll thumb height"), SM_CXHTHUMB, TEXT ("SM_CXHTHUMB"), TEXT ("Horizontal scroll thumb width"), SM_CXICON, TEXT ("SM_CXICON"), TEXT ("Icon width"), SM_CYICON, TEXT ("SM_CYICON"), TEXT ("Icon height"), SM_CXCURSOR, TEXT ("SM_CXCURSOR"), TEXT ("Cursor width"), SM_CYCURSOR, TEXT ("SM_CYCURSOR"), TEXT ("Cursor height"), SM_CYMENU, TEXT ("SM_CYMENU"), TEXT ("Menu bar height"), SM_CXFULLSCREEN, TEXT ("SM_CXFULLSCREEN"), TEXT ("Full screen client area width"), SM_CYFULLSCREEN, TEXT ("SM_CYFULLSCREEN"), TEXT ("Full screen client area height"), SM_CYKANJIWINDOW, TEXT ("SM_CYKANJIWINDOW"), TEXT ("Kanji window height"), SM_MOUSEPRESENT, TEXT ("SM_MOUSEPRESENT"), TEXT ("Mouse present flag"), SM_CYVSCROLL, TEXT ("SM_CYVSCROLL"), TEXT ("Vertical scroll arrow height"), SM_CXHSCROLL, TEXT ("SM_CXHSCROLL"), TEXT ("Horizontal scroll arrow width"), SM_DEBUG, TEXT ("SM_DEBUG"), TEXT ("Debug version flag"), SM_SWAPBUTTON, TEXT ("SM_SWAPBUTTON"), TEXT ("Mouse buttons swapped flag"), SM_CXMIN, TEXT ("SM_CXMIN"), TEXT ("Minimum window width"), SM_CYMIN, TEXT ("SM_CYMIN"), TEXT ("Minimum window height"), SM_CXSIZE, TEXT ("SM_CXSIZE"), TEXT ("Min/Max/Close button width"), SM_CYSIZE, TEXT ("SM_CYSIZE"), TEXT ("Min/Max/Close button height"), SM_CXSIZEFRAME, TEXT ("SM_CXSIZEFRAME"), TEXT ("Window sizing frame width"), SM_CYSIZEFRAME, TEXT ("SM_CYSIZEFRAME"), TEXT ("Window sizing frame height"), SM_CXMINTRACK, TEXT ("SM_CXMINTRACK"), TEXT ("Minimum window tracking width"), SM_CYMINTRACK, TEXT ("SM_CYMINTRACK"), TEXT ("Minimum window tracking height"), SM_CXDOUBLECLK, TEXT ("SM_CXDOUBLECLK"), TEXT ("Double click x tolerance"), SM_CYDOUBLECLK, TEXT ("SM_CYDOUBLECLK"), TEXT ("Double click y tolerance"), SM_CXICONSPACING, TEXT ("SM_CXICONSPACING"), TEXT ("Horizontal icon spacing"), SM_CYICONSPACING, TEXT ("SM_CYICONSPACING"), TEXT ("Vertical icon spacing"), SM_MENUDROPALIGNMENT, TEXT ("SM_MENUDROPALIGNMENT"), TEXT ("Left or right menu drop"), SM_PENWINDOWS, TEXT ("SM_PENWINDOWS"), TEXT ("Pen extensions installed"), SM_DBCSENABLED, TEXT ("SM_DBCSENABLED"), TEXT ("Double-Byte Char Set enabled"), SM_CMOUSEBUTTONS, TEXT ("SM_CMOUSEBUTTONS"), TEXT ("Number of mouse buttons"), SM_SECURE, TEXT ("SM_SECURE"), TEXT ("Security present flag"), SM_CXEDGE, TEXT ("SM_CXEDGE"), TEXT ("3-D border width"), SM_CYEDGE, TEXT ("SM_CYEDGE"), TEXT ("3-D border height"), SM_CXMINSPACING, TEXT ("SM_CXMINSPACING"), TEXT ("Minimized window spacing width"), SM_CYMINSPACING, TEXT ("SM_CYMINSPACING"), TEXT ("Minimized window spacing height"), SM_CXSMICON, TEXT ("SM_CXSMICON"), TEXT ("Small icon width"), SM_CYSMICON, TEXT ("SM_CYSMICON"), TEXT ("Small icon height"), SM_CYSMCAPTION, TEXT ("SM_CYSMCAPTION"), TEXT ("Small caption height"), SM_CXSMSIZE, TEXT ("SM_CXSMSIZE"), TEXT ("Small caption button width"), SM_CYSMSIZE, TEXT ("SM_CYSMSIZE"), TEXT ("Small caption button height"), SM_CXMENUSIZE, TEXT ("SM_CXMENUSIZE"), TEXT ("Menu bar button width"), SM_CYMENUSIZE, TEXT ("SM_CYMENUSIZE"), TEXT ("Menu bar button height"), SM_ARRANGE, TEXT ("SM_ARRANGE"), TEXT ("How minimized windows arranged"), SM_CXMINIMIZED, TEXT ("SM_CXMINIMIZED"), TEXT ("Minimized window width"), SM_CYMINIMIZED, TEXT ("SM_CYMINIMIZED"), TEXT ("Minimized window height"), SM_CXMAXTRACK, TEXT ("SM_CXMAXTRACK"), TEXT ("Maximum draggable width"), SM_CYMAXTRACK, TEXT ("SM_CYMAXTRACK"), TEXT ("Maximum draggable height"), SM_CXMAXIMIZED, TEXT ("SM_CXMAXIMIZED"), TEXT ("Width of maximized window"), SM_CYMAXIMIZED, TEXT ("SM_CYMAXIMIZED"), TEXT ("Height of maximized window"), SM_NETWORK, TEXT ("SM_NETWORK"), TEXT ("Network present flag"), SM_CLEANBOOT, TEXT ("SM_CLEANBOOT"), TEXT ("How system was booted"), SM_CXDRAG, TEXT ("SM_CXDRAG"), TEXT ("Avoid drag x tolerance"), SM_CYDRAG, TEXT ("SM_CYDRAG"), TEXT ("Avoid drag y tolerance"), SM_SHOWSOUNDS, TEXT ("SM_SHOWSOUNDS"), TEXT ("Present sounds visually"), SM_CXMENUCHECK, TEXT ("SM_CXMENUCHECK"), TEXT ("Menu check-mark width"), SM_CYMENUCHECK, TEXT ("SM_CYMENUCHECK"), TEXT ("Menu check-mark height"), SM_SLOWMACHINE, TEXT ("SM_SLOWMACHINE"), TEXT ("Slow processor flag"), SM_MIDEASTENABLED, TEXT ("SM_MIDEASTENABLED"), TEXT ("Hebrew and Arabic enabled flag"), SM_MOUSEWHEELPRESENT, TEXT ("SM_MOUSEWHEELPRESENT"), TEXT ("Mouse wheel present flag"), SM_XVIRTUALSCREEN, TEXT ("SM_XVIRTUALSCREEN"), TEXT ("Virtual screen x origin"), SM_YVIRTUALSCREEN, TEXT ("SM_YVIRTUALSCREEN"), TEXT ("Virtual screen y origin"), SM_CXVIRTUALSCREEN, TEXT ("SM_CXVIRTUALSCREEN"), TEXT ("Virtual screen width"), SM_CYVIRTUALSCREEN, TEXT ("SM_CYVIRTUALSCREEN"), TEXT ("Virtual screen height"), SM_CMONITORS, TEXT ("SM_CMONITORS"), TEXT ("Number of monitors"), SM_SAMEDISPLAYFORMAT, TEXT ("SM_SAMEDISPLAYFORMAT"), TEXT ("Same color format flag")} ;
客户区的尺寸:
使用 GetClientRect 函数来获取客户区的大小。但每次窗口发生变化都需要就显得没有效率。
更好的方法是在窗口过程处理 WM_SIZE 消息时获取窗口的窗户区的大小。当窗口的大小发生变化时,Windows会向窗口过程发送一条WM_SIZE消息。
相应的 lParam变量的低位字是客户区的宽度,而高位字是高度。
case WM_SIZE: cxClient = LOWORD(lParam); //static int cxClient,cyClient; cyClient = HIWORD(lParam); return 0;
在WM_SIZE消息之后经常会有一个WM_PAINT消息。因为窗口类定义的风格:CS_HREDRAW | CS_VREDRAW 窗口水平、垂直发生变化重绘。
- 第四章 文本输出(1.文本显示)
- 第四章 文本输出 (2.滚动条)
- Windows Programming 第四章 文本输出
- windows程序设计:第四章(1):文本输出
- 第四章 4-1 文本的输出
- 第四天 文本显示组件(TextView)
- Win32学习笔记 第四章 输出文本_1
- Win32学习笔记 第四章 输出文本_2
- Programming Windows程式开发设计指南->第四章 输出文本
- [学习笔记]Windows程序设计:第四章 文本输出
- 第四章 JavaFx 文本处理
- 输出文本
- 输出文本
- 文本输出
- 文本输出
- 文本输出
- 读书笔记_GDI+程序设计_第四章(文本和字体)
- 文本分页显示(2)
- NetBean 字体美化 Source Code Pro
- 编译libevent遇到的问题
- 开始学习Java
- 设置对话框大小和位置
- Cassandra学习笔记之一致性hash回顾
- 第四章 文本输出(1.文本显示)
- C语言实现异常处理
- Flash Builder 开发视频播放器客户端(myhslider)
- centos 安装autopy报错
- 【二叉树的后续遍历】Binary Tree Postorder Traversal
- Android RadioGroup 换行, 支持多行多列
- android实现alpha渐变动画效果
- genymotion- 快速的android模拟器
- Unzip 6.0 fails to compile under 64-bit systems with the instructionsin the book