湖北大学 数计学院 1
第四章 一个简单的二维光栅图形软件包
----Windows API简介
用图形软件包绘图
基本的交互处理
光栅操作湖北大学 数计学院 2
用图形软件包绘图( 1/6)
图元的声明
绘图纸,屏幕,坐标系
扫描转换:将转换为点阵表示的图形扫描转换顶点(参数)表示的图形用户点阵表示的图形显示系统湖北大学 数计学院 3
用图形软件包绘图 (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 );
湖北大学 数计学院 4
用图形软件包绘图 (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 );
湖北大学 数计学院 5
用图形软件包绘图( 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 );
湖北大学 数计学院 6
用图形软件包绘图( 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
湖北大学 数计学院 7
用图形软件包绘图( 6/6)
保存和恢复图元的属性,提高程序的模块化程度
字符
BOOL TextOut( int x,int y,LPCTSTR lpszString,
int nCount );
湖北大学 数计学院 8
基本的交互处理( 1/3)
几条原则
简单一致的交互操作序列
清晰的可选项
不能有过多的选项
反馈
Undo功能
逻辑输入设备
目标:屏蔽物理设备的差异,获得系统的设备无关性
二维定位设备
键盘设备
设备驱动程序完成从物理设备到逻辑设备的映射解决方法:菜单、按钮、加亮、
变灰、光标变化等等湖北大学 数计学院 9
基本的交互处理( 2/3)
输入方式取样(轮询)方式中断驱动方式事件驱动方式湖北大学 数计学院 10
基本的交互处理( 3/3)
事件驱动方式
简单的程序结构初始化;
Do{
waitEvent(event);
Switch(event)
{
Case EVENT1,precedure1;
break;
Case EVENT2,procedure2;
break;

}
}while(TRUE);
湖北大学 数计学院 11
光栅操作
画布( Canvas)
抽象的数据类型,用户可以在其中画图
包括一个像素图和一些控制信息
具有独立的坐标系
系统可以同时有多个画布,只有一个处于激活状态
屏幕是一个特殊的画布
绘图命令的作用对象是处于激活状态的画布
Windows中对应的概念:
DC
例子湖北大学 数计学院 12
光栅操作
裁剪窗口
为什么裁剪?
内裁剪:保留窗口之内的图形
外裁剪:保留窗口之外的图形
UINT SetBoundsRect( LPCRECT lpRectBounds,UINT
flags );
UINT GetBoundsRect( LPRECT lpRectBounds,UINT
flags );
湖北大学 数计学院 13
位块拷贝
BitBlt(Bit Block Transfer)
BOOL BitBlt( int x,int y,int nWidth,int
nHeight,CDC* pSrcDC,int xSrc,int ySrc,
DWORD dwRop );
光栅操作
(xSrs,ySrc)
(x,y)
湖北大学 数计学院 14
光栅操作
显示模式
为什么有显示模式?
4中简单的显示模式
覆盖 /Replace
或 /Or
异或 /Xor
与 /And
湖北大学 数计学院 15
光栅操作
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
湖北大学 数计学院 16
光栅操作
异或的用途:光标的显示
11001001
Xor 11111111
-------------------
00110110
Xor 11111111
-------------------
11001001
湖北大学 数计学院 17
思考题
2.在复杂环境(包括颜色丰富的背景和其它图形对象)下,如何实现图形对象的拖放和修改?