您的位置:首页 > 其它

第四章--输出文字学习记录

2009-02-27 13:10 246 查看
1: 在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息:

---在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见
  ---使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)
---程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分
---程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息

2: 显示区域是整个应用程序窗口中未被标题列、窗口边框,以及可选的菜单列、工具列、状态列和滚动条占据的部分

3: 在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:

---鼠标光标穿越显示区域。
---图标拖过显示区域。
 

4: 用于将字符串输出到窗口的显示区域内。我们已经在上一章看过DrawText函数,但是目前使用最为普遍的文字输出
函数是TextOut。该函数的格式如下:
TextOut (hdc, x, y, psText, iLength) ;

TextOut向窗口的显示区域写入字符串。psText参数是指向字符串的指针,iLength是字符串的长度。x和y参数定义了
字符串在显示区域的开始位置(不久会讲述关于它们的详细情况)。hdc参数是「设备内容句柄」,它是GDI的重要部
分。实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。

5: 取得设备内容句柄:方法一
在处理WM_PAINT消息时,使用这种方法。它涉及BeginPaint和EndPaint两个函数,这两个函数需要窗口句柄(作为参
数传给窗口消息处理程序)和PAINTSTRUCT结构的变量(在WINUSER.H表头文件中定义)的地址为参数。Windows程序
写作者通常把这一结构变量命名为ps并且在窗口消息处理程序中定义它:
PAINTSTRUCT ps ;

6: case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
//使用GDI函数
EndPaint (hwnd, &ps) ;
return 0 ;

7: typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
}PAINTSTRUCT;

8: InvalidateRect (hwnd, NULL, TRUE)
该呼叫在BeginPaint呼叫之前进行,它使整个显示区域变为无效,并擦除背景。但是,如果最后一个参数等于FALSE,
则不擦除背景,原有的东西将保留在原处。

9: 取得设备内容句柄:方法二
可以呼叫GetDC来取得句柄,在使用完后呼叫ReleaseDC:
hdc = GetDC (hwnd) ;
//使用GDI函数
ReleaseDC (hwnd, hdc) ;

10: GetDC传回用于写入窗口显示区域的设备内容句柄,而GetWindowDC传回写入整个窗口的设备内容句柄。例如,
可以使用从GetWindowDC传回的设备内容句柄在窗口的标题列上写入文字。然而,程序同样也应该处理WM_NCPAINT
(非显示区域绘制)消息。
TextOut:细节
TextOut是用于显示文字的最常用的GDI函数。语法是:
TextOut (hdc, x, y, psText, iLength);

11: TextOut中的x和y定义显示区域内字符串的开始位置,x是水平位置,y是垂直位置。字符串中第一个字符的左
上角位于坐标点(x,y)。在内定的设备内容中,原点(x和y均为0的点)是显示区域的左上角。如果在TextOut中将
x和y设为0,则将从显示区域左上角开始输出字符串

12: 系统字体是一种「点阵字体」,这意味着字符被定义为图素块

13: 呼叫GetTextMetrics取得字体大小。GetTextMetrics传回设备内容中目前选取的字体信息

14: 要使用GetTextMetrics函数,需要先定义一个结构变量(通常称为tm):
TEXTMETRIC tm ;

15: 文字大小:细节

TEXTMETRIC结构提供了关于目前设备内容中选用的字体的丰富信息。但是,字体的纵向大小只由5个值确定,最重要的值
是tmHeight,它是tmAscent和tmDescent的和。这两个值表示了基准在线下字符的最大纵向高度。「tmExternalLeading。它是字体设计者建议加在横向字符之间的空间大小

tmAveCharWidth:小写字母加权平均宽度
tmMaxCharWidth:字体中最宽字符的宽度

大写字母的平均宽度,这可以用tmAveCharWidth乘以150%大致计算出来

17: 变量名的前缀c代表「count」,在这里指图素数

18: cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
//cyChar时包括了tmExternalLeading字段,虽然该字段在系统字体中为0,但是因为它使得文字的可读性更好

19: 1: int iLength ;
TCHAR szBuffer [40] ;
iLength = wsprintf (szBuffer, TEXT ("The sum of %i and %i is %i"),
iA, iB, iA + iB) ;
TextOut (hdc, x, y, szBuffer, iLength) ;
2: TextOut (hdc, x, y, szBuffer,
wsprintf (szBuffer, TEXT ("The sum of %i and %i is %i"),
iA, iB, iA + iB)) ;

20: GetSystemMetrics传回一个整数,这个整数通常就是参数中指定的图形组件大小

21: 大写字母的平均宽度保存在静态变量cxCaps中。对于固定宽度的字体, cxCaps等于cxChar。对于可变宽度字体,cxCaps设定为cxChar

乘以150%。对于可变宽度字体,TEXTMETRIC结构中的tmPitchAndFamily字段的低位为1,对于固定宽度字体,该值为0。 SYSMETS1使用这个

位从cxChar计算cxCaps:
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;

22: 确定窗口显示区域大小的更好方法是在窗口消息处理程序中处理WM_SIZE消息

23: 用如下公式计算可以在显示区域内显示的文字的总行数:
cyClient / cyChar

24: 很容易在应用程序中包含水平或者垂直的滚动条,程序写作者只需要在CreateWindow的第三个参数中包括窗口样式(WS)标识符

WS_VSCROLL(垂直卷动)和/或WS_HSCROLL(水平卷动)即可

25: 每个滚动条均有一个相关的范围(这是一对整数,分别代表最小值和最大值)和位置(它是卷动方块在此范围内的位置)。当卷动方块在卷动列的顶部(或左部)时,卷动方块的位置是范围的最小值;在卷动列的底部(或右部)时,卷动方块的位置是范围的最大值.
在内定情况下,滚动条的范围是从0(顶部或左部)至100(底部或右部),但将范围改变为更方便于程序的数值也是很容易的:
SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw)
---参数iBar为SB_VERT或者SB_HORZ,iMin和iMax分别是范围的最小值和最大值。如果想要Windows根据新范围重画滚动条,则
设置bRedraw为TRUE(如果在呼叫SetScrollRange后,呼叫了影响滚动条位置的其它函数,则应该将bRedraw设定为FALSE以避
免过多的重画)。卷动方块的位置总是离散的整数值。例如,范围为0至4的滚动条具有5个卷动方块位置

26: Windows对滚动条的处理:
• 处理所有滚动条鼠标事件
• 当使用者在滚动条内单击鼠标时,提供一种「反相显示」的闪烁
• 当使用者在滚动条内拖动卷动方块时,移动卷动方块
• 为包含滚动条窗口的窗口消息处理程序发送滚动条消息
以下是程序写作者应该完成的工作:
• 初始化滚动条的范围和位置
• 处理窗口消息处理程序的滚动条消息 
• 更新滚动条内卷动方块的位置 
• 更改显示区域的内容以响应对滚动条的更改

27: 在用鼠标单击滚动条或者拖动卷动方块时,Windows给窗口消息处理程序发送WM_VSCROLL(供上下移动)和WM_HSCROLL(供左右移动)

消息。在滚动条上的每个鼠标动作都至少产生两个消息,一条在按下鼠标按钮时产生,一条在释放按钮时产生。

28: 在滚动条的各个部位按住鼠标键,程序就能收到多个滚动条消息。当释放鼠标键后,程序会收到一个带有SB_ENDSCROLL通知码的消息。一般可以忽略这个消息,Windows不会去改变卷动方块的位置,而您可以在程序中呼叫SetScrollPos来改变卷动方块的位置。当把鼠标的光标放在卷动方块上并按住鼠标键时,您就可以移动卷动方块。这样就产生了带有SB_THUMBTRACK和SB_THUMBPOSITION通知码的滚动条消息。

29: Win32 API介绍的两个滚动条函数称作SetScrollInfo和GetScrollInfo。这些函数可以完成以前函数的全部功能,并增加了两个新特性:
第一个功能该函数能改变卷动方块的大小。卷动方块大小在SYSMETS2程序中是固定的。然而实际可能使用到的一些Windows应用程序中,卷动方块大小与在窗口中显示的文件大小成比例
GetScrollInfo函数增加了第二个重要的功能,或者说它改进了目前API的不足。假设您要使用65,536或更大单位的范围,这在16位Windows中是不可能的。通过GetScrollInfo函数可以取得真实的32位值

30: SetScrollInfo和GetScrollInfo函数的语法是
SetScrollInfo (hwnd, iBar, &si, bRedraw);
GetScrollInfo (hwnd, iBar, &si);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: