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 技术内幕学习四

第十六章、读和写文档 知识点: 序列化流程 持续文档对象 Serialize CArchive归档对象 CFile对象 磁盘 你在Serialize函数中需要做的就是,将数据存到归档对...
  • windows_nt
  • windows_nt
  • 2012年03月31日 13:30
  • 620

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

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

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

第十一章、windows消息处理和多线程编程           Windows提供了两种线程:辅助线程和用户界面线程。用户界面线程有窗口,因此它有自己的消息循环,辅助线程没有窗口,没有自己的消息循...
  • windows_nt
  • windows_nt
  • 2012年03月31日 13:19
  • 666

跟我一起学习mysql技术内幕(第五版)吧!(学习日志)

学习日记 mysql技术内幕第五版
  • CCyutaotao
  • CCyutaotao
  • 2016年03月22日 23:54
  • 3860

《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

索引: 一、SQL Server的体系结构 二、查询 三、表表达式 四、集合运算 五、透视、逆透视及分组 六、数据修改 七、事务和并发 八、可编程对象 一、SQL Server体系结构 1.1 数据...
  • mss359681091
  • mss359681091
  • 2017年03月22日 11:21
  • 575

VC++ .Net 实例学习

VC++.NET中添加由C#编译的DLL引用的方法 http://blog.csdn.net/much0726/article/details/4986627 关于VC.NET的资料网络上...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年06月18日 16:55
  • 826

跟我一起学习MySQL技术内幕(第五版):(第一章学习日记6)

1.4.9.6 -1.4.9.10
  • CCyutaotao
  • CCyutaotao
  • 2016年04月03日 01:57
  • 648

MySQL技术内幕InnoDB存储引擎学习笔记(第二章)

第二章 InnoDB存储引擎 一、实验环境 宿主机系统:windows7 虚拟机:OracleVMVirtualBox Linux:ubuntukylin-14.04.1-amd64.iso jdk:...
  • lanonola
  • lanonola
  • 2016年07月14日 20:19
  • 1248

MySQL技术内幕系列 电子书 作者: 姜承尧

下载地址
  • Cloud_Strife_1985
  • Cloud_Strife_1985
  • 2017年07月15日 17:30
  • 714

MySQL技术内幕InnoDB存储引擎学习笔记(第一章)

第一章 MySQL体系结构和存储引擎 一、实验环境 宿主机系统:windows7 虚拟机:OracleVMVirtualBox Linux:ubuntukylin-14.04.1-amd64.iso ...
  • lanonola
  • lanonola
  • 2016年07月13日 21:20
  • 1028
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++.NET技术内幕学习一
举报原因:
原因补充:

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