在视图上描绘

来源:互联网 发布:冒险与挖矿 源码 编辑:程序博客网 时间:2024/04/29 19:00
  1. /*
  2.     DC的分类:
  3.     设备上下文是一个包含了设备属性等信息的Windows数据结构,所有与描画相关的
  4.     函数调用都是通过DC对象完成的,DC对象封装了WindowsAPI函数.DC允许设备独立
  5.     地在系统是进行描画,可以描画到显示器上,打印机及中间文件上.
  6.     CPaintDC封装了Windows的常用描画流程:先调用BeginPaint,然后进行描画,最后
  7.     调用EndPaint.CPaintDC的构造函数会帮助我们调用BeginPaint,析构函数会帮助
  8.     我们调用EndPaint.基本流程就是创建CDC对象,然后描画,最后销毁CDC对象.在
  9.     编程框架中,这些流程都是自动完成的,它会向我们的OnDraw函数传递一个CD指针,
  10.     然后我们就可以在这个DC上进行描画操作了.传递过来的DC指针会被编程框架
  11.     销毁,底层的设备上下文会根据我们OnDraw函数的返回值决定是否被释放.
  12.     CClientDC封装只工作在窗口客户区的设备上下文,它的构造函数会调用GetDC,
  13.     其析构函数会调用ReleaseDC。
  14.     CWindowDC封装了工作在整个窗口,包括边框的设备上下文。
  15.     CMeteFileDC封装了工作在Windows中间文件上的设备上下文,在这种情况下,
  16.     为了获得DC,我们需要手工调用OnPrepareDC。
  17. */
  18. /*
  19.     在视图上描绘:
  20.     几乎所有的描绘操作都发生在视图的OnDraw函数里,所以我们应该重载我们自己
  21.     视图的OnDraw函数:
  22.     1:通过我们自己的文档类方法获取数据
  23.     2:通过编程框架传递过来的DC进行数据的显示
  24.     当文档类的数据发生变化的时候,视图类需要即时地反映出这一变化。常规情况
  25.     下,变化是用户通过文档的视图操作完成的。这种情况下,视图通过调用文档类
  26.     的UpdateAllViews来通知本文档的所有视图去更新他们自己。UpdateAllViews
  27.     会调用每一个视图的OnUpdate方法,默认情况下OnUpdate会重绘整个视图的客户区。
  28.     当然我们可以重载OnUpdate以便能让其只重绘与变化数据相关的区域。
  29.     文档的UpdateAllViews和视图的OnUpdate允许用户只传递针对已变化数据的信息。
  30.     这种“微量机制”就允许我们限制客户区域的重绘区域,从而提高效率。OnUpdate
  31.     需要两个“微量参数”,第一个类型为LPARAM,允许你传递任何你喜欢的数据,
  32.     第二个类型为CObject,允许你传递任何派生自CObject的对象指针,这里体现出
  33.     了针对接口编程的思想。
  34.     当视图无效之后,系统会向其发送WM_PAINT消息,视图的OnPaint函数会响应这个
  35.     消息,它会创建一个CPaintDC类型的DC,然后调用视图的OnDraw函数,一般情况
  36.     下我们不需要重载OnPaint函数。
  37.     经典的在视图中进行描绘操作的代码是先获得相关文档的指针,然后调用DC的方法
  38.     进行描绘操作。
  39. */
  40. void CMyView::OnDraw(CDC* pDC)
  41. {
  42.     CMyDoc* pDoc = GetDocument();//获得文档指针
  43.     ASSERT_VALID(pDoc);
  44.     if (!pDoc)
  45.         return;
  46.     CString s = pDoc->GetData();//在我们自己的文档类中,我们可以复杂化GetData
  47.     CRect rect;
  48.     GetClientRect(&rect);
  49.     pDC->SetTextAlign(TA_BASELINE | TA_CENTER);
  50.     pDC->TextOut(rect.right / 2, rect.bottom / 2, s, s.GetLength());
  51. }
  52. /*
  53.     通过视图解析用户的输入:
  54.     视图的其它成员函数会处理和解析用户的所有输入。通常情况下你应该在视力类中
  55.     定义一个消息响应函数去处理以下内容:
  56.     
  57.     产生自鼠标和键盘的Windows消息。
  58.     来自菜单,工具栏和快捷键的命令消息。
  59.     这些消息处理函数会将鼠标的单击,双击,移动,拖拽,键盘按下,菜单命令解析
  60.     为数据的输入,选择,编辑,及复制与粘贴等。
  61.     程序应该处理哪些消息应该根据程序本身的需要。
  62. */