VC++.NET技术内幕学习一

原创 2012年03月31日 11:42:27

第五章消息映射

遇到的问题:

一、映射模式。

坐标使用的经验规则:

1、  可以认为CDC的所有成员函数都以逻辑坐标作为其参数。

2、  可以认为CWnd的成员函数都以设备坐标作为其参数。

3、  所有点中测试(hit-test)操作都应该考虑设备坐标。区域的定义应采用设备坐标。某些像CRect::PtInRect之类的函数只有在采用设备坐标参数时才会保证有正确的结果。

4、  将一些长期使用的值用逻辑坐标或物理坐标来保存。如果用设备坐标来保存某点得坐标的话,那么只要用户对窗口进行一下滚动,该点得坐标就不再有效了。

 

SetWindowOrg(x,y):把设备坐标的原点映射到逻辑坐标的(x, y)处。如:

dc.SetWindowOrg(20, 20);             //将(20,20)作为设备环境的原点。

GDI绘图使用的是逻辑坐标。但是,从windows的鼠标消息所获得的鼠标光标的坐标值(如:OnLButtonDown的point参数)却是设备坐标。而且许多其他的MFC库函数,尤其是类CRect的成员函数,则只能在设备坐标下才能正确工作。

CRect函数总是假定右大于左且底大于顶,如果出现(0,0,1000,-1000)等情况时,有些函数就无法处理,如CRect::PtInRect函数就不行。需先调用CRect::NormallizeRect,这样就能将矩形的数据成员改变为(0,-1000,1000,0)。

 

框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式最合适的地方。

 

二、窗口重绘问题,打算用GetUpdateRect();函数获得无效区域,却达不到想要的效果。

GetUpdateRect()函数可能需要你提供一个无效区域,返回包含此无效区域的最小矩形。待验证,有高手请留言。。。

 

知识点:

 

CEx07cDialog(CView *pView);          //无模式窗口构造函数

CEx07cDialog(CWnd* pParent = NULL);   //模式窗口构造函数

如果用CView类或其派生类作为参数来调用构造函数的话,编译器就会自动选择调用无模式构造函数;但如果用CWnd或其派生类作为参数来调用构造函数的话,编译器就会自动产生对模式构造函数的调用。

 

对于无模式对话框,一定不要调用CDialog::OnOK()和CDialog::OnCancel(),必须在派生类中改写这些虚函数;否则,当使用Esc或回车时,就会激发对相应基类函数的调用,进而导致调用window的EndDialog函数,而此函数只适合模式对话框。无模式对话框必须调用DestroyWindow函数。

除了主框架之外,对于其他几乎所有的窗口类型,DestroyWindow函数都不会将C++对象销毁掉,正好符合我们要在析构中销毁。

 

相关文章推荐

VC++.NET 技术内幕学习三

第十五章、文档与视图的分离 CView::GetDocument();非虚函数。返回的是指向文档的指针。 当MFC产生CView的派生类时,它同时也创建类型安全的GetDocument函数,该函数...

vc++.net技术内幕

  • 2013年03月25日 17:09
  • 35.54MB
  • 下载

VC++.net 技术内幕6 源码 part11

  • 2008年08月20日 17:58
  • 977KB
  • 下载

VC++技术内幕』学习笔记(10)

第十篇:模式对话框和通用控件(下)     大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞了...

VC++.net 技术内幕6 源码part9

  • 2008年08月20日 17:50
  • 977KB
  • 下载

VC++.net 技术内幕6 源码 part3

  • 2008年08月20日 17:27
  • 977KB
  • 下载

VC++调用webservice (不使用.NET的托管技术)

正在看着AV(AreCont)SDK的时候,老大突然让我转到soap上,原因是刚进公司的我,第一项任务便是研究ONVIF(so many specifications),当然主要的还是看core ...

VC++.net 技术内幕6 源码 part8

  • 2008年08月20日 17:39
  • 977KB
  • 下载

VC++.net 技术内幕6 源码 part7

  • 2008年08月20日 17:34
  • 977KB
  • 下载

VC++ .Net 实例学习

VC++.NET中添加由C#编译的DLL引用的方法 http://blog.csdn.net/much0726/article/details/4986627 关于VC.NET的资料网络上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++.NET技术内幕学习一
举报原因:
原因补充:

(最多只允许输入30个字)