5.1 输出 在 windows 应用程序中,程序的输出工作不能用标准 c 语言的...

23
5.1 输输 输 Windows 输输输输输 输输输输输输输输输输输输 C 输输输 输输输输输输输 输输输输输 Windows 输 输输输输 输输输输输 统一 输输输输输 输输输 输输输输输输输输输输输输输输输输输输输 一, 输输输输输输输5.1.1 WM_PAINT 输输 1 输输输输输输输输输输输输输 、, Windows 输 输输输输输输 输输输输 WM_PAINT 输输2 WM_PAINT 输输输输输输输输输1 输输输输输输输 2 输输输输输 3 输输输输输 UpdateWindow() 输 InvalidateRect() 输输 输输输 Windows 输输输 Window API 输输输输

Upload: azriel

Post on 13-Jan-2016

138 views

Category:

Documents


0 download

DESCRIPTION

第五章 Windows 资源及 Window API 基础编程. 5.1 输出 在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函 数来实现这一工作,程序的大部分输出工作是通过用户窗口的用 户区域来实现的。 5.1.1 WM_PAINT 消息 1 、用户区内容需要重新改写时, Windows 系统回向用户消息 队列发送 WM_PAINT 消息。 2 、 WM_PAINT 消息由多种事件引起: ( 1 )改变窗口大小时 ( 2 )窗口移动时 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5.1 输出 在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的输出语句来完成,需要使用由 Windows 系统提供的一批专门的函数来实现这一工作,程序的大部分输出工作是通过用户窗口的用户区域来实现的。5.1.1 WM_PAINT 消息1 、用户区内容需要重新改写时, Windows 系统回向用户消息 队列发送 WM_PAINT 消息。2 、 WM_PAINT 消息由多种事件引起:( 1 )改变窗口大小时( 2 )窗口移动时 ( 3 )程序中调用 UpdateWindow() 或 InvalidateRect() 函数时

第五章 Windows 资源及 Window API 基础编程

Page 2: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

3 、响应 WM_PAINT 消息,需要作的工作(1) 为了是窗口改变大小时发出 WM_PAINT 消息,需要在应用程序主函数 WinMain() 中定义窗口类时,将其属性域 style 定义为:WndClass.style = CS_VREDRAW | CS_HREDRAW;

(2) 在 switch()-case 分支语句中,增加一个条件分支语句 case WM_PAINT ,用来完成对这消息的处理。4 、 WM_PAINT 处理程序段 ( 1 ) BeginPaint() 函数:此函数为这个消息处理程序段的首语句,用来获取对应的显示器设备的设备描述表 DC , DC 为系统设置的设备接口,用户通过 DC 进行与显示有关的操作。(体现了程序设计与设备无关性)HDC BeginPaint(// 返回值是这个显示设备表述表的 DC 的句柄 hDC

HWND hWnd, // 本窗口的句柄PAINTSTRUCT FAR *PaintStruct); // 画图数据结构 // PAINTSTRUCT 的首地址

Page 3: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

( 2 ) EndPaint() 函数:函数的工作时释放显示设备描述表 DC ,以便让其他的用户使用这个显示设备。void EndPaint(

HWND hWnd,

PAINTSTRUCT FAR *PaintStruct);

( 3 )处理程序段形式如下:case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: Add any drawing code here...

RECT rt;

GetClientRect(hWnd, &rt);

DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);

EndPaint(hWnd, &ps);

break;

Page 4: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

说明:

1 、矩形区域是一个 RECT 的首地址,区域范围由左上角和右下角坐标来指定 lpRect->left,up,right,bottom

2 、显示格式的设定标志由 wFormat 给出:由以下常量组合设定

DT_SINGLELINE

DT_CENTER

DT_LEFT

DT_RIGHT

DT_TOP

DT_BOTTON

Page 5: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

三、颜色SetTextColor(hDC,RGB(250,0,0)) :设置字符颜色SetBkColor(hDC,RGB(0,0,250)) :设置显示区背景色说明: RGB(R,G,B) 为一条宏语句,根据 R,G,B 三种颜色组

合产生颜色的参考值恢复原来的显示特性SetTextColor(hDC,GetSysColor(COLOR_WINDOWTEXT))

:恢复字符颜色SetBkColor(hDC,GetSysColor(COLOR_WINDOW)) :恢复

显示区背景色 四、实例(教科书 43 页)

Page 6: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5.1.2 显示正文一、 TextOut()

BOOL TextOut( // 将字符串显示在用户区内HDC hDC, // 设备描述表句柄int x,int y, // 字符串在用户区的开始显示位置,坐标值相对于用户区的 // 左上角坐标原点LPSTR lpString,int nCount); // 字符串的首地址,以及字符串的长

度二、 DrawText()

int DrawText(

HDC hDC, // 设备描述表句柄LPSTR lpString, int nCount, // 字符串的首地址及长度RECT lpRect, // 显示的矩形区域WORD wFormat // 指定的显示形式) ;

Page 7: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5.1.3 显示图形 一、画点COLORREF SetPixel( // 颜色的参考值类型HDC hDC,

int x,int y, // 点的位置COLORREF clrref) ; // 颜色 RGB(R,G,B)

二、画线1 、 POINT : 点结构,包含 x, y 两个整数 int 型域,用来表示一个坐

标点2 、 BOOL MoveToEx( // 画笔移动HDC hDC,

int x,int y, // 将当前画笔移动到 (x,y) 处POINT FAR *lpPoint // 若不为 NULL, 将原先的画笔位置 // 保存到 lpPoint 中) ;

Page 8: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

3 、 BOOL LineTo( // 画线

HDC hDC,

int x,int y // 从当前画图位置出发画一条直线到 (x,y) 处

)

三、实例(教科书 46 页)

Page 9: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5.1.4 画图工具 在设备描述表 DC 中,有一些重要的画图工具,它们包括:画笔、画刷、字体。 一、用户改变 DC 中的某个画图工具或改变某个画图工具的属性时,需要按照以下的步骤进行: 1 、 获取设备描述表的句柄 hDC

2 、 设置画图工具 3 、 选中某个画图工具 4 、 画图操作 5 、 恢复原来的画图工具 6 、 释放 hDC

以上这些操作大多是在消息 WM_PAINT 处理程序中实现的。

Page 10: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

二、画笔1 、画笔工具是用来画出图形前景物体的工具。比如:各种类

型的线条,如直线、虚线框2 、包含的特性:画笔的宽度、颜色、形式3 、系统提供的三种缺省画笔:BLACK_PEN 黑色画笔 // 画黑色线条WHITE_PEN 白色画笔 // 画白色线条NULL_PEN 空画笔 // 画出没有边框的线条 4 、相关函数( 1 )函数: HGDIOBJ GetStockObject(int fnObject)

用来得到 fnObject 中指定的 Windows 系统提供的画笔、画刷、字体的句柄

如: HPEN hNewPen,hOldPen

hNewPen = GetStockObject(WHITE_PEN) ; // 返回代表白色

// 画笔的句柄,并将这个画笔句柄返回给变量 hNewPen

Page 11: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

( 2 )函数:HGDIOBJ SelectObject(HDC hDC,HGDIOBJ hgdiobj)

用来将 hgdiobj 指定的对象选作为 hDC 指定的设备描述表的当前选择对象。

hOldPen = SelectObject(hDC,hNewPen)

说明: 此函数将这只刚设定的白色画笔当作当前画笔,返回值是原来的画笔句柄值,以备处理结束后恢复原来的画笔( 3 )函数: HPEN CreatePen( // 定义自己设想的画笔int nPenStyle, // 画笔形式 int nWidth, // 画笔宽度COLORREF crColor); // 画笔颜色 可用 RGB(R,G,B

)

// 来取得

Page 12: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

画笔形式

PS_SOLID 实线笔

PS_HASH 虚线笔

PS_DOT 点线笔

PS_DASHDOT 虚线单点线笔

PS_DASHDOTDOT 虚线双点线笔

PS_NULL 空笔

PS_INSIDERFAME利用 Ellipse等函数画图框架线的笔

Page 13: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

三、画刷1 、用来画出图形背景的工具。如:画出一个矩形图形时,边

框由画笔画出,矩形内部由画刷填充。2 、七种缺省的画刷:BLACK_BRUSH 黑画刷DKGRAY_BRUSH 深灰色画刷GRAY_BRUSH 灰色画刷HOLLOW_BRUSH 虚影画刷LTGRAY_BRUSH 浅灰画刷NULL_BRUSH 空画刷WHITE_BRUSH 白色画刷3 、设置画刷HBRUSH hNewBrush,hOldBrush;

hNewBrush = GetStockObject(DKGRAY_BRUSH);

hOldBrush = SelectObject(hDC,hNewBrush);

Page 14: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

4 、自定义画刷hNewBrush = CreateSolidBrush(RGB(250,0,0)); // 定义一个红色画刷

hOldBrush = SelectObject(hDC,hNewBrush);

5 、 CreateHatchBrush(nHatchIndex,crColor) // 用来设置一个背景网格图案

Windows 系统提供的 6 种背景网格图案,用来作为特殊的画刷充满所画图形的封闭区域背景:

HS_DBIAGONAL 斜线背景HS_CROSS 正方网格HS_DIAGCROSS 斜方网格HS_FDIAGONAL 反斜线背景HS_HORIZONTAL 平行水平线HS_VERTICAL 平行垂线

Page 15: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

四、字体1 、字体是正文输出时的前景对象。包括了一个字符集里的每

个字母、数字、标点符号的外观特定信息。 如:字的外形尺寸、显示特征,每个字对应的字符编码值

2 、函数:BOOL GetTextMetrics(HDC hDC,TEXTMETRIC *pltm);

作用:用来获取当前字体的各种属性信息TEXTMETRIC *pltm :给出了数据结构 TEXTMETRIC 的

首地址,此数据结构由 20 个域组成,用来说明一个字体的各种属性特征值。

.tmHeight 字符高度, short 型

.tmWidth 字符宽度, short 型

.tmItalic 是否为斜体字, BYTE 型

.tmUnderLine 是否有下划线, BYTE 型

Page 16: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

3 、五种系统字体SYSTEM_FONT 系统字体OEM_FIXED_FONT 固定宽度的 OEM 字体ANSI_FIXED_FONT 固定宽度的 ANSI 字体ANSI_VAR_FONT 可变宽度 ANSI 字体DEVICE_DEFAULT_FONT 缺省字体 4 、设定当前字体调用: GetStockObject ()和 SelectObject ()函数3 、自定义字体 函数 CreateFont ()由 14 个参数,返回值为新创建的字体

句柄

Page 17: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

类型 参数名 意义

int hHeight 字符高

int hWidth 字符宽

int nEscaptement 每行的倾角, 1/10度为一单位

int nOrientation 字符倾角, 1/10度为一单位

int nWeight 字体加权 400或 700

BYTE fItalic 是否为斜体字

BYTE fUnderline 是否有下划线

BYTE fStrickOut 是否有强调线

BYTE bCharSet 字符集标准

BYTE bOutputPrecision 输出质量

BYTE bClipPrecision 剪辑质量

BYTE bQuality 显示质量

BYTE bPichAndFamily 是否可变宽度及字体类别名

LPSTR lpszFace 字体名

Page 18: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

五、实例(教科书 52 页)

Page 19: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5. 2 输入三种输入消息及处理方法:键盘、鼠标器、定时器 5.2.1 键盘输入键盘的输入事件不能直接由应用程序来处理,而由 Windows 系统处理,然后以消息的形式通知对应的应用程序。一、 Windows 系统产生的键盘的种类:WM_KEYDOWN 一个键被按下WM_KEYUP 一个键被释放WM_SYSKEYDOWN 组合键被按下 WM_SYSKEYUP 组合键被释放

Page 20: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

说明:1 、组合键:如 Alt+Tab , Alt + F1 ,这两个消息一般由系统加以处理,而不是由用户程序加以处理。2 、 WM_KEYDOWN 产生时,在消息参数 wParam 中存放了被按下键的虚拟键盘代码值3 、由 TranslateMessage ()函数负责接收键盘消息,如果接收到的消息 WM_KEYDOWN 时,这个函数会对 ASCII 字符产生一个消息 WM_CHAR并放入用户的消息队列中;同时在消息结构的参数 wParam 中存入对应键的 ANSI 字符码值。

Page 21: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

5.2.2 鼠标输入一、鼠标消息当用户在用户区内按动鼠标键时所产生的消息:WM_MOUSEMOVE 移动鼠标WM_LBUTTONDOWN 按下左键WM_LBUTTONUP

WM_LBUTTONDBLCLK

WM_MBUTTONDOWN

WM_MBUTTONUP

WM_MBUTTONDBLCLK

WM_RBUTTONDOWN

WM_RBUTTONUP

WM_RBUTTONDBLCLK

Page 22: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

二、用户区产生消息时,在消息结构的参数 wParam 中含有按键状态的位标记值,指明键盘上 shift键和 ctrl键是否被按下。if( wParam & MK_CONTROL )==1)

{

……

}

判别其他状态的,可以用位标记符号常量:MK_LBUTTON

MK_RBUTTON

MK_MBUTTON

MK_SHIFT

MK_CONTROL

Page 23: 5.1  输出       在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函

三、鼠标位置:消息结构中的参数值 lParam 中含有鼠标位置,x=LOWORD(lParam),

y=HIWORD(lParam);

四、设定鼠标位置: SetCursorPos ( x,y )五、获得鼠标控制权: SetCapture ( hWnd );

释放鼠标控制权: ReleaseCapture() ;