230 likes | 374 Vues
第五章 Windows 资源及 Window API 基础编程. 5.1 输出 在 Windows 应用程序中,程序的输出工作不能用标准 C 语言的 输出语句来完成,需要使用由 Windows 系统提供的一批专门的函 数来实现这一工作,程序的大部分输出工作是通过用户窗口的用 户区域来实现的。 5.1.1 WM_PAINT 消息 1 、用户区内容需要重新改写时, Windows 系统回向用户消息 队列发送 WM_PAINT 消息。 2 、 WM_PAINT 消息由多种事件引起: ( 1 )改变窗口大小时 ( 2 )窗口移动时
E N D
第五章 Windows资源及Window API基础编程 5.1 输出 在Windows应用程序中,程序的输出工作不能用标准C语言的 输出语句来完成,需要使用由Windows系统提供的一批专门的函 数来实现这一工作,程序的大部分输出工作是通过用户窗口的用 户区域来实现的。 5.1.1 WM_PAINT消息 1、用户区内容需要重新改写时,Windows系统回向用户消息 队列发送WM_PAINT消息。 2、WM_PAINT消息由多种事件引起: (1)改变窗口大小时 (2)窗口移动时 (3)程序中调用UpdateWindow()或InvalidateRect()函数时
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的首地址
(2)EndPaint()函数:函数的工作时释放显示设备描述表DC,(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;
说明: 1、矩形区域是一个RECT的首地址,区域范围由左上角和右下角坐标来指定 lpRect->left,up,right,bottom 2、显示格式的设定标志由wFormat给出:由以下常量组合设定 DT_SINGLELINE DT_CENTER DT_LEFT DT_RIGHT DT_TOP DT_BOTTON
三、颜色 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页)
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 // 指定的显示形式 );
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中 );
3、BOOL LineTo( // 画线 HDC hDC, int x,int y // 从当前画图位置出发画一条直线到 (x,y)处 ) 三、实例(教科书46页)
5.1.4 画图工具 在设备描述表DC中,有一些重要的画图工具,它们包括:画笔、画刷、字体。 一、用户改变DC中的某个画图工具或改变某个画图工具的属性时,需要按照以下的步骤进行: 1、获取设备描述表的句柄hDC 2、设置画图工具 3、选中某个画图工具 4、画图操作 5、恢复原来的画图工具 6、释放hDC 以上这些操作大多是在消息WM_PAINT处理程序中实现的。
二、画笔 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
(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) // 来取得
画笔形式 PS_SOLID 实线笔 PS_HASH 虚线笔 PS_DOT 点线笔 PS_DASHDOT 虚线单点线笔 PS_DASHDOTDOT 虚线双点线笔 PS_NULL 空笔 PS_INSIDERFAME 利用Ellipse等函数画图框架线的笔
三、画刷 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);
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 平行垂线
四、字体 1、字体是正文输出时的前景对象。包括了一个字符集里的每个字母、数字、标点符号的外观特定信息。 如:字的外形尺寸、显示特征,每个字对应的字符编码值 2、函数: BOOL GetTextMetrics(HDC hDC,TEXTMETRIC *pltm); 作用:用来获取当前字体的各种属性信息 TEXTMETRIC *pltm:给出了数据结构TEXTMETRIC的首地址,此数据结构由20个域组成,用来说明一个字体的各种属性特征值。 .tmHeight 字符高度,short型 .tmWidth 字符宽度,short型 .tmItalic 是否为斜体字,BYTE型 .tmUnderLine 是否有下划线,BYTE型
3、五种系统字体 SYSTEM_FONT 系统字体 OEM_FIXED_FONT 固定宽度的OEM字体 ANSI_FIXED_FONT 固定宽度的ANSI字体 ANSI_VAR_FONT 可变宽度ANSI字体 DEVICE_DEFAULT_FONT 缺省字体 4、设定当前字体 调用: GetStockObject()和SelectObject()函数 3、自定义字体 函数 CreateFont()由14个参数,返回值为新创建的字体句柄
类型 参数名 意义 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 字体名
5.2 输入 三种输入消息及处理方法:键盘、鼠标器、定时器 5.2.1键盘输入 键盘的输入事件不能直接由应用程序来处理,而由Windows系统处理,然后以消息的形式通知对应的应用程序。 一、Windows系统产生的键盘的种类: WM_KEYDOWN 一个键被按下 WM_KEYUP 一个键被释放 WM_SYSKEYDOWN 组合键被按下 WM_SYSKEYUP 组合键被释放
说明: 1、组合键:如Alt+Tab , Alt + F1,这两个消息一般由系统加以处理,而不是由用户程序加以处理。 2、WM_KEYDOWN产生时,在消息参数wParam中存放了被按下键的虚拟键盘代码值 3、由TranslateMessage()函数负责接收键盘消息,如果接收到的消息WM_KEYDOWN 时,这个函数会对ASCII字符产生一个消息WM_CHAR并放入用户的消息队列中;同时在消息结构的参数wParam中存入对应键的ANSI字符码值。
5.2.2鼠标输入 一、鼠标消息 当用户在用户区内按动鼠标键时所产生的消息: WM_MOUSEMOVE 移动鼠标 WM_LBUTTONDOWN 按下左键 WM_LBUTTONUP WM_LBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK
二、用户区产生消息时,在消息结构的参数wParam中含有按键状态的位标记值,指明键盘上shift键和ctrl键是否被按下。二、用户区产生消息时,在消息结构的参数wParam中含有按键状态的位标记值,指明键盘上shift键和ctrl键是否被按下。 if( wParam & MK_CONTROL )==1) { …… } 判别其他状态的,可以用位标记符号常量: MK_LBUTTON MK_RBUTTON MK_MBUTTON MK_SHIFT MK_CONTROL
三、鼠标位置: 消息结构中的参数值lParam中含有鼠标位置, x=LOWORD(lParam), y=HIWORD(lParam); 四、设定鼠标位置:SetCursorPos(x,y) 五、获得鼠标控制权:SetCapture(hWnd); 释放鼠标控制权:ReleaseCapture();