9单元 WINDOWS编程 的程序段。 BEGIN MESSAGE MAP()宏包含两个参数 CMy Wnd和 FRame Wnd,分别是 当前定义的窗口类及其父类的名称。在 BEGIN MESSAGE MAP()和 END MESSAGE MAP ()之间,含有该窗口类要处理的各种 Windows消息的入口。MFC包含了大量的预定义消 息映射宏,用来指定各种成员函数与各种形如WM××××的消息相对应,如 ON WM LBUTTONDOWN宏指定 WM LBUTTONDOWN消息的处理成员函数为 OnLButton Down()。这时,只需要写出要处理的消息就够了,不必再写出处理函数名 我们在 CMy Wnd类中声明了一个数组成员 m rectBubble,用于存放泡泡的数据(这里 是圆的包含矩形)。另外还声明了一个整型数据成员 m nUbble count,用来存放数组中泡 泡的实际数量。在框架窗口类的构造函数中该成员变量被初始化为0。由于构造函数非常简 单,所以使用了内联函数形式 OnPaint()函数根据数组 m rect Bubble的内容画出一个个泡泡。 OnPaint()函数在窗 口生成、大小改变或覆盖在其上的其他窗口被移开时被自动调用。其中语句 dc. SelectStockObject(LTGRAY BRUSH 用于选择一个库存画刷,画刷决定了所画图形(如椭圆、矩形和多边形等)内部的颜色。(参 看10.5:“库存图形对象” 在处理鼠标消息的 OnLButton Down()函数中,语句 nt r rand(%50+10 随机确定了要画出的泡泡半径(范围为10~50),其中全局函数rand()可产生一个随机 整数。而语句 CRect rect(point x-r, point. y-r, point x+r, point y+r) m rectBubble [m nBubbleCount]= rect m nBubblecount+ 使用鼠标位置 point和半径r构造一个泡泡的包含矩形并将其存入数组 m rect Bubble。语句 InvalidateRect(rect, FALSE) 用于通知 On Paint()函数更新窗口客户区指定区域的内容。我们记得, On Paint()函数只 在窗口生成、大小改变或覆盖其上的其他对象移动时调用,因此在数据发生变动(如增加泡 泡)时则需用CWnd类的成员函数 InvalidateRect()函数通知 On Paint()函数重画窗口客 户区中的部分区域。 93在窗口的客户区输出文字和图形 例9-1中的 On Paint()函数用于绘制客户区的内容。要完成这项任务,需要先建立 个设备环境( Device Context),这可以通过声明一个 CPaintDC类的对象dc实现。在声明语 句中,应将当前窗口对象指针this传给 CPaintDC类的构造函数,把绘制区域确定为当前窗 口的客户区。 Windows在窗口更新、移动、改变尺寸或移去覆盖在其上的其他窗口对象时
第 9 单元 WINDOWS 编程 - 179 - 的程序段。BEGIN_MESSAGE_MAP()宏包含两个参数 CMyWnd 和 CFrameWnd,分别是 当前定义的窗口类及其父类的名称。在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP ()之间,含有该窗口类要处理的各种 Windows 消息的入口。MFC 包含了大量的预定义消 息映射宏,用来指定各种成员函数与各种形如 WM_×××× 的消息相对应,如 ON_WM_LBUTTONDOWN 宏指定 WM_LBUTTONDOWN 消息的处理成员函数为 OnLButtonDown()。这时,只需要写出要处理的消息就够了,不必再写出处理函数名。 我们在 CMyWnd 类中声明了一个数组成员 m_rectBubble,用于存放泡泡的数据(这里 是圆的包含矩形)。另外还声明了一个整型数据成员 m_nBubbleCount,用来存放数组中泡 泡的实际数量。在框架窗口类的构造函数中该成员变量被初始化为 0。由于构造函数非常简 单,所以使用了内联函数形式。 OnPaint()函数根据数组 m_rectBubble 的内容画出一个个泡泡。OnPaint()函数在窗 口生成、大小改变或覆盖在其上的其他窗口被移开时被自动调用。其中语句 dc.SelectStockObject(LTGRAY_BRUSH); 用于选择一个库存画刷,画刷决定了所画图形(如椭圆、矩形和多边形等)内部的颜色。(参 看 10.5:“库存图形对象”)。 在处理鼠标消息的 OnLButtonDown()函数中,语句 int r = rand()%50+10; 随机确定了要画出的泡泡半径(范围为 10~50),其中全局函数 rand()可产生一个随机 整数。而语句 CRect rect(point.x-r, point.y-r, point.x+r, point.y+r); m_rectBubble[m_nBubbleCount] = rect; m_nBubbleCount++; 使用鼠标位置 point 和半径 r 构造一个泡泡的包含矩形并将其存入数组 m_rectBubble。语句 InvalidateRect(rect, FALSE); 用于通知 OnPaint()函数更新窗口客户区指定区域的内容。我们记得,OnPaint()函数只 在窗口生成、大小改变或覆盖其上的其他对象移动时调用,因此在数据发生变动(如增加泡 泡)时则需用 CWnd 类的成员函数 InvalidateRect()函数通知 OnPaint()函数重画窗口客 户区中的部分区域。 9.3 在窗口的客户区输出文字和图形 例 9-1 中的 OnPaint()函数用于绘制客户区的内容。要完成这项任务,需要先建立一 个设备环境(Device Context),这可以通过声明一个 CPaintDC 类的对象 dc 实现。在声明语 句中,应将当前窗口对象指针 this 传给 CPaintDC 类的构造函数,把绘制区域确定为当前窗 口的客户区。Windows 在窗口更新、移动、改变尺寸或移去覆盖在其上的其他窗口对象时
9单元 WINDOWS编程 均会向该窗口发送 WM PAINT消息,从而触发应用程序调用 On Paint()函数重绘窗口客 户区。 CPaintDC类中封装了大量的绘图和文字输出方法(成员函数),如: 1.文字信息显示 BOOL TextOut (int x, int y, LPCTSTR lpszString 在指定坐标(x,y)处显示字符串 lpszString的内容,显示成功返回非0值,否则返回0。坐 标原点(0,0)在客户区左上角,Y轴向下。下面各成员函数的坐标参数均同此。参数类 型 LPCTS TR和返回值类型BOOL均为 Windows的数据类型,前者意为常量字符指针,后 者为逻辑类型。下面的 COLORREF, POinT, LPPOINT, LPCRECT等均类此。关于这些 Windows类型,请参看9.7:“ Windows数据类型与变量的命名规则”。 2.画点 COLORREF SetPixel (int x, int y, COLORREF color) COLORREF SetPixel(POINT point, COLORREF color) 该函数在指定坐标(用参数x,y或点 point给出)处按给定颜色( color)画点,返回值为 原来此坐标处的颜色 3.取指定坐标点的颜色 COLORREF Get Pixel int x, int y )const COLORREF GetPixel( POINT point )const; 返回值为指定坐标处的颜色 4.画线 画线工作需经两步完成:首先确定线的起始端位置,这可通过调用成员函数 Move To完 成,其原型为: CPoint Move To( int x, inty ) CPoint Move To( POinT point ) MoveTo将绘图位置(“看不见”)移至指定坐标处,并返回移动前的绘图位置。确定了线的 起点后,即可使用成员函数Lneo画线: BOOL Line To( int x, int y) BOOL Line To( POinT point 其参数为线终点的坐标。 5.绘制矩形 绘制矩形的成员函数为: BOOL Rectangle( int xl, int yl, int x2, int y2); 实际上,Y轴的方向取决于使用的逻辑映射方式(见第10单元),这里假定使用了缺省的逻辑映射方法 MM TEXT
第 9 单元 WINDOWS 编程 - 180 - 均会向该窗口发送 WM_PAINT 消息,从而触发应用程序调用 OnPaint()函数重绘窗口客 户区。 CPaintDC 类中封装了大量的绘图和文字输出方法(成员函数),如: 1.文字信息显示 BOOL TextOut(int x, int y, LPCTSTR lpszString); 在指定坐标(x, y)处显示字符串 lpszString 的内容,显示成功返回非 0 值,否则返回 0。坐 标原点(0,0)在客户区左上角,Y 轴向下1。下面各成员函数的坐标参数均同此。参数类 型 LPCTSTR 和返回值类型 BOOL 均为 Windows 的数据类型,前者意为常量字符指针,后 者为逻辑类型。下面的 COLORREF,POINT,LPPOINT,LPCRECT 等均类此。关于这些 Windows 类型,请参看 9.7:“Windows 数据类型与变量的命名规则”。 2.画点 COLORREF SetPixel (int x, int y, COLORREF color); COLORREF SetPixel (POINT point, COLORREF color); 该函数在指定坐标(用参数 x,y 或点 point 给出)处按给定颜色(color)画点,返回值为 原来此坐标处的颜色。 3.取指定坐标点的颜色 COLORREF GetPixel ( int x, int y ) const; COLORREF GetPixel ( POINT point ) const; 返回值为指定坐标处的颜色。 4. 画线 画线工作需经两步完成:首先确定线的起始端位置,这可通过调用成员函数 MoveTo 完 成,其原型为: CPoint MoveTo ( int x, int y ); CPoint MoveTo ( POINT point ); MoveTo 将绘图位置(“看不见”)移至指定坐标处,并返回移动前的绘图位置。确定了线的 起点后,即可使用成员函数 LineTo 画线: BOOL LineTo ( int x, int y ); BOOL LineTo ( POINT point ); 其参数为线终点的坐标。 5. 绘制矩形 绘制矩形的成员函数为: BOOL Rectangle ( int x1, int y1, int x2, int y2 ); 1 实际上,Y 轴的方向取决于使用的逻辑映射方式(见第 10 单元),这里假定使用了缺省的逻辑映射方法 MM_TEXT