当绘制的图形需要随着窗口的大小改变而自动改变的时候,一般选择 MM_ISOTROPIC 和 MM_ANISOTROPIC 映射方式。它们的唯一区别就是前者的 X 轴和 Y 轴的逻辑单位的大小是相同的,单 词“isotropic”就是各个方向相等的意思,此映射方式适合绘制圆或正方形。而实际应用中,常常给 X 轴和 Y 轴取不同的比例,这时候选择 MM_ANISOTROPIC 映射方式。单词“anisotropic”就是各个方 向相异的意思。
(4)自定义映射模式 自定义映射模式 “窗口”和“视口”的概念: 窗口” 视口”的概念 窗口( ):对应逻辑坐标系上程序员设定的区域 窗口(Window): ): 视口( ):对应实际输出设备上程序员设定的区域 视口(Viewport): ): 窗口原点是指逻辑窗口坐标系的原点在视口(设备)坐标系中的位置,视口原点是指 设备实际输出区域的原点。 除了映射模式, 窗口和视口也是决定一个点的逻辑坐标如何转换为设备坐标的一个因 素。一个点的逻辑坐标按照如下式子转换为设备坐标: 设备(视口)坐标 = 逻辑坐标 – 窗口原点坐标 + 视口原点坐标//定义坐标映射方式 WINGDIAPI int WINAPI SetMapMode(HDC, int); 此 API 函数在 MFC 中封装为 CDC::virtual int SetMapMode(int nMapMode); //定义逻辑窗口区域,单位为逻辑单位(Logical) WINGDIAPI BOOL WINAPI SetWindowExtEx (HDC, int, int, LPSIZE); 此 API 函数在 MFC 中封装为 CDC::virtual CSize SetWindowExt(int cx, int cy); //设置逻辑窗口的原点坐标,
缺省原点为(0,0)。 WINGDIAPI BOOL WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT); 此 API 函数在 MFC 中封装为 CDC::CPoint SetWindowOrg(int x, int y); 注意:SetWindowOrg(Ex) 只有在映射模式为 MM_ANISOTROPIC 或 MM_ISOTROPIC 时才有意义。 注意: //定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel) WINGDIAPI BOOL WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int cy);
注意:SetViewportExt(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。 //设置视口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);
参考:《GDI中的坐标映射问题》/article/12/12013.shtm
3、创建绘图工具并选入DC
有了画布,要绘图我们必须有画笔画刷。在Windows中有HPEN、HBRUSH等GDI对象,MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。
一般先创建画笔(刷),然后调用CDC::SelectObject函数将画笔(刷)选入设备环境最为当前绘图工具,绘图完毕恢复设备环境以前的画笔(刷)对象,最后调用
CGdiObject::DeleteObject函数删除画笔(刷)对象。
这里需要注意的是,CGdiObject::DeleteObject函数彻底删除底层GDI对象(CPen和CBrush类的基类)。在MFC中,当对象销毁时会调用对象的析构函数自动删除对象,一般不必调用CGdiObject::DeleteObject删除GDI对象,因为如果设备环境还在使用一个GDI对象时,将引起应用程序崩溃或出现难以理解的运行错误。
(1)创建画笔
BOOL CPen::CreatePen( int nPenStyle, int nWidth, COLORREF cfColor ); nPenStyle 指定画笔的风格。其可能取值的列表,请参见CPen构造函数中的nPenStyle参数。
nWidth 指定画笔的宽度。如果这个值为0,则不管是什么映射模式,以设备单位表示的宽度总是一个像素。
crColor 包含画笔的一个RGB颜色,为COLORREF结构。
此外,可通过CDC::SelectStockObject函数来调用系统预定义的库存笔对应的CGdiObject对象。
pOldPen = (Cpen*)pDC->SelectStockObject(BLACK_PEN);
(2)创建画刷
BOOL CBrush::CreateSolidBrush ( COLORREF crColor );
BOOL CBrush::CreateHatchBrush( int nIndex, COLORREF crColor ); 参数: nIndex 指定画刷的阴影线风格。可取的值如下:
HS_HORIZONTAL /* ==== */
HS_VERTICAL /* ||||| */
HS_FDIAGONAL /* ///// */
HS_BDIAGONAL /* ///// */
HS_CROSS /* +++++ */
HS_DIAGCROSS /* xxxxx */
返回值:调用成功时返回非零值,否则为0。
此外,可通过CDC::SelectStockObject函数来调用系统预定义的库存画刷对应的CGdiObject对象。
pOldBrush = (CBrush*)pDC->SelectStockObject(BLACK_BRUSH);
(3)将画笔(刷)选入设备环境。
以下为MFC中默认映射方式下的GDI绘图的模块:

