MFC GDI使用实例源码、逻辑坐标系、设备坐标系及需要注意的事项
2013-03-21 13:22
507 查看
GDI类的使用需要注意的是:在创建相关的GDI对象时,如果我们使用的是MFC给定的构造函数去创建对象,那么应用程序结束后系统将自动帮我们清理该资源,但当我们使用create*相关的函数去初始化GDI对象时,我们应该确保只对该对象初始化一次且一次,否则,系统就会报错。而若要再次初始化我们应该确保改对象没有被初始化过,判断对象的m_hObject成员变量是否有值。
一个让人头疼的坐标映射:Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标
设备坐标系分为屏幕坐标系(GetDC(NULL) )、窗口坐标系(GetWindowDC() )和客户区坐标系(GetDC(NULL) )三种相互独立的坐标系。
l 屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。
l 窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。
l 客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。
MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。
映射模式(映射方向是窗口到视口)确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向,所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角
Windows定义了8种映射模式:一般常用的是MM_TEXT模式,在这个模式下,逻辑坐标系和设备坐标系重合,什么意思?也就是说它们的原点相同,单位都是pixel,坐标的生长方向也一样x向右、y向下。到这来你应该明白定义模式的意义所在及重要性了吧。
视口是与设备相关的一个矩形区域,坐标单位是与设备相关的。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐标的原点始终对应于同一点。窗口原点是与视口原点相同的,(也就是说,位于屏幕上的同一个位置),为了体会不窗口坐标与视口坐标的转换,先用SetwindowtOrg(100, -300)将窗口移到(100,-300),这相当于把 逻辑点(100,-300)映射到设备点(0,0)(注意:如果改用SetviewportOrg移动原点,则其原点的移动尺寸与映射模式无关,其300个长度单位等于9厘米)
(注:这个设备点也是相对于当前的DC而言,如果当前的DC是整个屏幕,那么设备点(100,-300)的原点就在屏幕的左上角,如果当前的DC是某个应用程序的客户区,那么设备点(100,-300)的原点就是应用程序的客户区的左上角,)
MFC源码实例下载地址:http://download.csdn.net/detail/weiyong1999/5167088
一个让人头疼的坐标映射:Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标
设备坐标系分为屏幕坐标系(GetDC(NULL) )、窗口坐标系(GetWindowDC() )和客户区坐标系(GetDC(NULL) )三种相互独立的坐标系。
l 屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。
l 窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。
l 客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。
MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。
映射模式(映射方向是窗口到视口)确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向,所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角
Windows定义了8种映射模式:一般常用的是MM_TEXT模式,在这个模式下,逻辑坐标系和设备坐标系重合,什么意思?也就是说它们的原点相同,单位都是pixel,坐标的生长方向也一样x向右、y向下。到这来你应该明白定义模式的意义所在及重要性了吧。
视口是与设备相关的一个矩形区域,坐标单位是与设备相关的。窗口的坐标是逻辑坐标,与设备无关。窗口坐标的原点与视口坐标的原点始终对应于同一点。窗口原点是与视口原点相同的,(也就是说,位于屏幕上的同一个位置),为了体会不窗口坐标与视口坐标的转换,先用SetwindowtOrg(100, -300)将窗口移到(100,-300),这相当于把 逻辑点(100,-300)映射到设备点(0,0)(注意:如果改用SetviewportOrg移动原点,则其原点的移动尺寸与映射模式无关,其300个长度单位等于9厘米)
(注:这个设备点也是相对于当前的DC而言,如果当前的DC是整个屏幕,那么设备点(100,-300)的原点就在屏幕的左上角,如果当前的DC是某个应用程序的客户区,那么设备点(100,-300)的原点就是应用程序的客户区的左上角,)
MFC源码实例下载地址:http://download.csdn.net/detail/weiyong1999/5167088
相关文章推荐
- s使用eval解析json实例与注意事项
- 使用auto_ptr需要注意的事项
- 使用静态库时需要注意的事项(gcc下程序调用静态库编译命令:主文件必须在静态库前面!)
- 使用oracle utl_http包需要注意的事项
- hive中使用sql语句需要注意的事项
- 使用UITextView的dataDetectorTypes实现超链接需要注意的事项!
- 存储过程游标注意事项——表需要使用别名,如红色字体
- MFC 带comm口控件程序编写及使用注意事项
- Laravel5.5源码详解 -- Laravel-debugbar及使用elementUI-ajax的注意事项
- 使用SVN提交工程需要注意和遵循的事项
- 使用C++实现JNI接口需要注意的事项
- 使用C++实现JNI接口需要注意的事项
- 使用auto_ptr需要注意的事项
- gsoap-2.8使用时需要注意的几个事项
- 使用静态库时需要注意的事项
- Java多维数组使用需要注意的事项
- 非MFC工程使用CMarkup解析XML注意事项
- TensorFlow Lite demo——就是为嵌入式设备而存在的,底层调用NDK神经网络API,注意其使用的tf model需要转换下,同时提供java和C++ API,无法使用tflite的见后
- 使用运算放大器需要注意的6个事项
- c++ GDI 中SelectObject使用方法和注意事项