第二章 一个简单的二维光栅图形软件包 ----Windows API简介 用图形软件包绘图 基本的交互处理 光栅操作 5/6/2019 淮工计算机系
用图形软件包绘图(1/6) 图元的声明 扫描转换 绘图纸,屏幕,坐标系 扫描转换:将转换为点阵表示的图形 顶点(参数) 表示的图形 用户 显示系统 5/6/2019 淮工计算机系
用图形软件包绘图(2/6) 点 COLORREF GetPixel( int x, int y ) const COLORREF SetPixel( int x, int y, COLORREF crColor ); 直线段 CPoint MoveTo( int x, int y ); BOOL LineTo( int x, int y ); 折线 BOOL Polyline( LPPOINT lpPoints, int nCount ); 5/6/2019 淮工计算机系
用图形软件包绘图(3/6) 圆弧 BOOL AngleArc( int x, int y, int nRadius, float fStartAngle, float fSweepAngle ); 椭圆弧 BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); (x3,y3) (x4,y4) 5/6/2019 淮工计算机系
用图形软件包绘图(4/6) 图元的属性 线型、线宽 CPen ( int nPenStyle, int nWidth, COLORREF crColor ); BOOL CreatePen (int nPenStyle,int nWidth, COLORREF crColor); 颜色 三种指定颜色的方式 通过查色表索引值 通过颜色名称 通过红、绿、兰三分量 COLORREF GetBkColor( ) const; COLORREF SetBkColor( COLORREF crColor ); COLORREF GetTextColor( ) const; COLORREF SetTextColor( COLORREF crColor ); 5/6/2019 淮工计算机系
用图形软件包绘图(5/6) 填充图元及其属性 椭圆 BOOL Ellipse( int x1, int y1, int x2, int y2 ); BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); 多边形 BOOL Polygon( LPPOINT lpPoints, int nCount ); 矩形 BOOL Rectangle( int x1, int y1, int x2, int y2 ); 填充模式 均匀填色 BOOL CreateSolidBrush( COLORREF crColor ); 以图像填充 BOOL CreatePatternBrush( CBitmap* pBitmap ); 5/6/2019 淮工计算机系
用图形软件包绘图(6/6) 保存和恢复图元的属性:提高程序的模块化程度 字符 BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount ); 5/6/2019 淮工计算机系
基本的交互处理(1/3) 几条原则 逻辑输入设备 简单一致的交互操作序列 清晰的可选项 不能有过多的选项 反馈 Undo功能 目标:屏蔽物理设备的差异,获得系统的设备无关性 二维定位设备 键盘设备 设备驱动程序完成从物理设备到逻辑设备的映射 解决方法:菜单、按钮、加亮、变灰、光标变化等等 5/6/2019 淮工计算机系
基本的交互处理(2/3) 输入方式 取样(轮询)方式 中断驱动方式 事件驱动方式 5/6/2019 淮工计算机系
基本的交互处理(3/3) 事件驱动方式 简单的程序结构 初始化; Do{ waitEvent(event); Switch(event) { Case EVENT1: precedure1; break; Case EVENT2: procedure2; … } }while(TRUE); 5/6/2019 淮工计算机系
光栅操作 画布(Canvas) 抽象的数据类型,用户可以在其中画图 包括一个像素图和一些控制信息 具有独立的坐标系 系统可以同时有多个画布,只有一个处于激活状态 屏幕是一个特殊的画布 绘图命令的作用对象是处于激活状态的画布 Windows中对应的概念:DC 例子 5/6/2019 淮工计算机系
光栅操作 裁剪窗口 为什么裁剪? 内裁剪:保留窗口之内的图形 外裁剪:保留窗口之外的图形 UINT SetBoundsRect( LPCRECT lpRectBounds, UINT flags ); UINT GetBoundsRect( LPRECT lpRectBounds, UINT flags ); 5/6/2019 淮工计算机系
光栅操作 位块拷贝 (x,y) (xSrs,ySrc) BitBlt(Bit Block Transfer) BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); (x,y) (xSrs,ySrc) 5/6/2019 淮工计算机系
光栅操作 显示模式 为什么有显示模式? 4中简单的显示模式 覆盖/Replace 或/Or 异或/Xor 与/And 5/6/2019 淮工计算机系
光栅操作 Windows中的显示模式 int GetROP2( ) const; int SetROP2( int nDrawMode ); R2_BLACK R2_WHITE R2_NOP R2_NOT R2_COPYPEN R2_NOTCOPYPEN R2_MERGEPENNOT R2_MASKPENNOT R2_MERGENOTPEN R2_MASKNOTPEN R2_MERGEPEN R2_NOTMERGEPEN R2_MASKPEN R2_NOTMASKPEN R2_XORPEN R2_NOTXORPEN 5/6/2019 淮工计算机系
光栅操作 11001001 Xor 11111111 ------------------- 00110110 异或的用途:光标的显示 5/6/2019 淮工计算机系