您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: