MFC Windows 程序设计 第二章 在窗口中绘图

来源:互联网 发布:海迅开料软件 编辑:程序博客网 时间:2024/05/16 19:01
第二章 在窗口中绘图

1、设备描述表 CPaintDC、CClientDC、CWindowDC、CMetaFileDC、CDC,通过这些DC使用GDI(图形设备接口)进行画图,6个常用GDI对象Pen、Brush、Font、Bitmap、Palette、Region。
2、绘图模式:默认模式是R2_COPYPEN,将像素点复制到显示平面上,使用SetROP2修改绘图模式,R2_NOT模式通过反转像素来画图,还有其他一些模式可供选择。
3、映射模式:cdc输出函数使用的是逻辑坐标值,设备坐标值指的是窗口中相应像素点位置,默认使用的是MM_TEXT,1个单位等于1个像素点,使用非MM_TEXT映射模式可以方便的按比例缩放输出,这时尺寸和距离与输出设备的物理分辨率无关。
   常用映射模式:MM_TEXT(1像素)、MM_LOMETRIC(0.1mm)、MM_HIMETRIC(0.01mm)、MM_LOENGLISH(0.01in)、MM_HIENGLISH(0.001in)、MM_TWIPS(1/1440in)、MM_ISOTROPIC(用户自定义,x和y同等缩放)、MM_ANISOTROPIC(用户自定义,x和y独立缩放)
   坐标原点在左上角,MM_TEXT正向是向下,其他模式正向是向上,因此使用其他模式时,y坐标值应给负值,可使用函数SetMapMode来改变默认映射模式。
   在使用公制映射模式时,在屏幕上显示的1逻辑英寸并不等于实际中的1英寸,因为window并不知道您的显示器的物理分辨率dpi(指监视器在水平或者垂直方向上每英寸内可显示的点数),不过打印机与其他硬拷贝设备不同,可以控制一个600dpi的激光打印机在1英寸内打印600点,
   所以在MM_LOENGLISH映射模式下,100单位长的线在打印纸上的长度也正好是1英寸。
4、MM_ISOTROPIC和、MM_ANISOTROPIC模式通常用于根据窗口尺寸按比例自动调节画图的输出大小的场合,以下是范例代码:
   CRect rect;
   GetClientRect(&rect);
   dc.SetMapMode(MM_ANISOTROPIC);
   dc.SetWindowExt(500,500);
   dc.SetViewportExt(rect.Width(),rect.Height());
   dc.Ellipse(0,0,500,500);
   这时x轴正向向右,y轴正向向下,可以通过传负值进行反转。
   SetWindowExt设置窗口尺寸,以逻辑单位表示,SetViewportExt设置窗口视口大小,以设备单位(像素点)计算。
5、坐标转换:CDC::DPtoLP(设备坐标值转为逻辑坐标值)和CDC::LPtoDC(逻辑坐标值转为设备坐标值(像素表示)),通常用于鼠标命中测试,鼠标点击返回的是设备坐标值(像素表示)。
6、移动原点:CDC::SetWindowOrg移动窗口原点,CDC::SetViewportOrg移动视口的原点,这两个函数的区别还分不太清,需要再研究。
   SetWindowOrg(x,y)等于将设备点原点(0,0)(左上角)将
7、用户坐标值是原点设立在窗口客户区左上角的设备坐标值,屏幕坐标值是原点位于屏幕左上角的设备坐标值,可以通过CWnd::ClientToScreen和CWnd::ScreenToClient进行转换。
8、GetDeviceCaps获取设备信息。
9、备用GDI对象,NULL_PEN、NULL_BRUSH等,GDI对象的删除与取消,使用备用GDI对象在不使用后可以不进行删除。
10、滚动条的添加,OnCreate、OnSize、OnHScroll、OnVScroll函数。
11、框架窗口的删除,在继承于CFrameWnd中的OnNcDestroy函数中的执行 delete this进行删除。
原创粉丝点击