胸怀天下 脚踏实地  
第10课
1.画图:
   a.创建四个菜单,为其添加消息响应;
   b.在View中添加m_DrawType,保存绘画类型;
   c.增加成员变量,m_PtOrigin,当按下鼠标左键时,保存此点;
   d.在OnLButtonUp中画点,线,矩形,椭圆,别忘记设置成透明画刷
2.为其添加一个设置对话框(线型和线宽)
   a.创建对话框,为其创建一个新类关联它;
   b.为其中的线宽关联成员变量;
   c.在View中增加一个菜单,响应新的对话框;
   d.添加线型选项设置,将其Group属性选中,并为单选按纽关联成员变量。在view中增加一个线型变量m_nLineStyle
3.添加一个颜色对话框
   a.实例化一个CColorDialog
   b.调用DoModal方法
4.添加字体对话框,将选择的字体在View中显示出来。
   a.实例化一个对象;
   b.为View添加一个字体成员变量,得到用户选择的字体。
   c.调用Invadate()发出重绘消息;
   d.再次注意一个对象只能创建一次,故要再次创建,必须将原告的删除!
5.为设置对话框增加示例功能。
   a.当控件内容改变时,发出En_change消息。而Radio按纽则为Clicked。需先UpdateData()。另外还需要ScreenToClient(&rect)
6.改变对话框的背景色和控件颜色。
  每个控件被绘制时都发出WM_CTlColor消息,
7.如何改变OK按纽的字体和背景?
  OK按纽
  a.创建一个新类,CTestBtn,基类为CButton
  b.在类中增加虚函数,DrawItem,添加代码。
  c.将OK按纽关联成员变量。类型为CTestBtn,注意将OK按纽的OwnerDraw特性选中。
  Cancel按纽
  用新类来改变。
  a.加入新文件。
  b.为Cancel关联一个成员变量,类型为CSXBtn;
  c.调用CSXBtn的方法。
  Cancel2按纽
  a.方法同上。
8.在窗口中贴图,4个步骤
  1、创建位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
2、创建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
3、将位图选到兼容DC中
dcCompatible.SelectObject(&bitmap);
4、将兼容DC中的位图贴到当前DC中。在WM_EraseBkgnd()中调用,但不能再调用基类的擦除背景函数。也可以在OnDraw函数中完成,但效率低,图像会闪烁,因为它先擦除背景,慢。
pDC->BitBlt(rect.left,rect.top,rect.Width(),
rect.Height(),&dcCompatible,0,0,SRCCOPY);

第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型。添加LButtonDown和Up消息。 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据。为此创建一个新类来记录绘画类型和两个点。 class CGraph { public: CPoint m_ptOrigin;//起点 CPoint m_ptEnd;//终点 UINT m_nDrawType;//绘画类型 CGraph(); CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd);//此为构造函数。 virtual ~CGraph();

}; 然后在void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)中加入如下代码 //CGraph graph(m_nDrawType,m_ptOrigin,point);//不能用局部变量 //m_ptrArray.Add(&graph);//加入这种指针数组中 /* OnPrepareDC(&dc);//这个函数中可以重新设置窗口原点,对于滚动条中,保存数据前要调用此函数 dc.DPtoLP(&m_ptOrigin);//将设备坐标转换为逻辑坐标 dc.DPtoLP(&point);// CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);//在堆中创建新的对象 m_ptrArray.Add(pGraph);*///加入到指针数组中 在GraphicView.h中有如下代码 CPtrArray m_ptrArray; 在OnDraw中重画时调出数据 for(int i=0;i<m_ptrArray.GetSize();i++) 3.在CView::OnPaint()调用了OnDraw(),但在void CGraphicView::OnPaint()中MFC的Wizard没有调用OnDraw(),要注意这个区别。如果你此时想调用,必须手动添加代码。 OnDraw(&dc); 4.让窗口具有滚动条的功能。 第1.将CGraphicView的头文件中的CView全部替换成CSrollView 第2.添加如下的代码 void CGraphicView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); // TOD Add your specialized code here and/or call the base class SetScrollSizes(MM_TEXT,CSize(800,600));//设置映射模式,设定窗口大小。OK! } 5.坐标系的转换,此处不再详细介绍,需要时请查阅相关资料。 6.解决重绘时线跑到上面的问题。为什么会错位?因为逻辑坐标和设备坐标没有对应起来。 解决方法: 在OnLButtonDown画完图后,保存之前。调用 /* OnPrepareDC(&dc);//重新设置逻辑坐标的原点!!! dc.DPtoLP(&m_ptOrigin);//设备坐标转化为逻辑坐标 dc.DPtoLP(&point); CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point); m_ptrArray.Add(pGraph);*/ 7.另外两种方法来保存数据。 一种是用CMetaFileDC 另一种是利用兼容DC,重绘时利用 pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY); 将兼容DC的图拷贝到屏幕DC上去。 此处不再详细介绍这两种方法,因为介绍多了容易搞晕。呵呵

posted on 2009-08-04 10:40  icey  阅读(226)  评论(0编辑  收藏  举报