第10单元图形设备接口 200- witch(m cOlor) brushNew. CreateSolidBrush(RGB(255, 0, 0)) penNew. CreatePen(PS DASH, 1, RGB(0, 0, 0)) case brushNew. CreateHatchBrush(HS DIAGCROSS, RGB(, 255, 0)) penNew. CreatePen(PS SOLID, 1, RGB (255, 0, 0)) break case brushNew. CreateSolidBrush(RGB(0, 0, 255)) (0,255,0); break pbrushold dc SelectObject(&brushNew) lold ( &pen New) dc SelectObject(pbrushold) void CMyWnd:: OnLButton Down ( UINT nFlags, CPoint point) f(m rectEllipse. PtInRect(point)) /应用程序类 class CMy App: public CWinApp BOOLInitInstance o
第 10 单元 图形设备接口 - 200 - CPaintDC dc(this); CBrush brushNew, *pbrushOld; CPen penNew, *ppenOld; switch(m_nColor) { case 0: brushNew.CreateSolidBrush(RGB(255,0,0)); penNew.CreatePen(PS_DASH, 1, RGB(0,0,0)); break; case 1: brushNew.CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0)); penNew.CreatePen(PS_SOLID, 1, RGB(255,0,0)); break; case 2: brushNew.CreateSolidBrush(RGB(0,0,255)); penNew.CreatePen(PS_SOLID, 3, RGB(0,255,0)); break; } pbrushOld = dc.SelectObject(&brushNew); ppenOld = dc.SelectObject(&penNew); dc.Ellipse(m_rectEllipse); dc.SelectObject(pbrushOld); dc.SelectObject(ppenOld); } void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { if(m_rectEllipse.PtInRect(point)) { m_nColor = (m_nColor+1)%3; InvalidateRect(m_rectEllipse); } } // 应用程序类 class CMyApp: public CWinApp { public: BOOLInitInstance(); };
第10单元图形设备接口 201 /应用程序类的成员函数 BOOL CMyApp: InitInstanceO CMyWnd *kpFrame new CMy Wnd pFrame->Create(0, T("Change the Color of a Ellipse ")) pFrame->ShowWindow(m nCmdShow) pFrame->Update Window O this->m pMainWnd pFr return TRUe //全局应用程序对象 输出:在窗口客户区显示一个椭圆,用鼠标左键点击可以改变它的颜色等设置。 分析:该程序的基本结构仍与例91相同。在由 CFrameWnd类派生的框架窗口类 中添了两个数据成员,一个是椭圆的包含矩形,一个是其颜色参数。这两个数据成员的初始 化在重载的 CMy Wnd类的构造函数中进行 在 On Paint()函数中,根据变量 m n color的值设置画笔和画刷,然后画出椭圆 如果用户按下鼠标左键则触发 OnLButton Down()函数。在 On LButtonDown()函数 中,首先检测鼠标的位置,如果是在椭圆的包含矩形中,则修改数据成员 m n color的值 调用Wnd类的成员函数 Invalidate Rect()的用途是强制更新窗口客户区的内容。我们 知道, OnPaint()函数仅在创建窗口或窗口发生变化的情况下调用,因此为了显示修改过 的效果,就必须强行更新窗口客户区。不过,因为被修改的仅仅是客户区的一小块内容(椭 圆),所以使用 InvalidateRect()函数,该函数仅强制更新指定的矩形区域,这样可以减少 因大面积更新带来的图形抖动影响。如果要更新整个客户区,可使用Wnd类的成员函数 validate()。 本程序中使用缺省的逻辑坐标系 MM TEXT,其特点是其坐标与工作区坐标系统(设 备坐标系)恰好一致。这样,在就避免了在检测鼠标位置时转换坐标,因为鼠标位置用设备 坐标给出,而绘图函数(包括 PtInrect()函数)使用逻辑坐标系。 自学内容 104字体 描述输出文字的字体可用 CFont对象。 CFont对象的使用方法与画笔、画刷类似,也要 定义字体对象,创建字体并保存原来的字体,在文字输出工作结束后恢复原来的字体。创建 字体的 CFont类成员函数的原型为:
第 10 单元 图形设备接口 - 201 - // 应用程序类的成员函数 BOOL CMyApp::InitInstance() { CMyWnd *pFrame = new CMyWnd; pFrame->Create(0,_T("Change the Color of a Ellipse")); pFrame->ShowWindow(m_nCmdShow); pFrame->UpdateWindow(); this->m_pMainWnd = pFrame; return TRUE; } // 全局应用程序对象 CMyApp ThisApp; 输 出:在窗口客户区显示一个椭圆,用鼠标左键点击可以改变它的颜色等设置。 分 析:该程序的基本结构仍与例 9-1 相同。在由 CFrameWnd 类派生的框架窗口类 中添了两个数据成员,一个是椭圆的包含矩形,一个是其颜色参数。这两个数据成员的初始 化在重载的 CMyWnd 类的构造函数中进行。 在 OnPaint()函数中,根据变量 m_nColor 的值设置画笔和画刷,然后画出椭圆。 如果用户按下鼠标左键则触发 OnLButtonDown()函数。在 OnLButtonDown()函数 中,首先检测鼠标的位置,如果是在椭圆的包含矩形中,则修改数据成员 m_nColor 的值。 调用 Wnd 类的成员函数 InvalidateRect()的用途是强制更新窗口客户区的内容。我们 知道,OnPaint()函数仅在创建窗口或窗口发生变化的情况下调用,因此为了显示修改过 的效果,就必须强行更新窗口客户区。不过,因为被修改的仅仅是客户区的一小块内容(椭 圆),所以使用 InvalidateRect()函数,该函数仅强制更新指定的矩形区域,这样可以减少 因大面积更新带来的图形抖动影响。如果要更新整个客户区,可使用 Wnd 类的成员函数 Invalidate()。 本程序中使用缺省的逻辑坐标系 MM_TEXT,其特点是其坐标与工作区坐标系统(设 备坐标系)恰好一致。这样,在就避免了在检测鼠标位置时转换坐标,因为鼠标位置用设备 坐标给出,而绘图函数(包括 PtInRect()函数)使用逻辑坐标系。 自学内容 10.4 字体 描述输出文字的字体可用 CFont 对象。CFont 对象的使用方法与画笔、画刷类似,也要 定义字体对象,创建字体并保存原来的字体,在文字输出工作结束后恢复原来的字体。创建 字体的 CFont 类成员函数的原型为: