映射模式

来源:互联网 发布:历代windows开机音乐 编辑:程序博客网 时间:2024/04/30 06:35

在VC里, 准确的说是在Windows编程中,映射模式有:MM_TEXT,(设备坐标)
MM_HIMETRIC,(逻辑坐标)
MM_ISOTROPIC,MM_ANISOTROPIC,.....在的开发环境下,(Windows 默认的模式是MM_TEXT),我们可以通过SetMapMode()来改变当是的映射模式~
   MM_TEXT :X向右方向递增加,Y向下方向递增加,我们可以通过SetViewportOrg()和SetWindowOrg()来改变坐标原点的位置.
 void CInSide_VCView::OnDraw(CDC* pDC)
{
 pDC->TextOut (0,0,"TEST");
 pDC->SelectStockObject (GRAY_BRUSH);
 pDC->SetMapMode (MM_TEXT);
 //pDC->SetWindowOrg (100,100);  交替使用这两句看有什么现象
 //pDC->SetViewportOrg(CPoint(100,100));
 pDC->Ellipse (CRect(0,0,300,300));
 pDC->TextOut (0,0,"22");
 
}
   固定比例模式:X向右方向递减(我认为是增加),Y向下方向递减,MM_LOENGLISH(0.01英寸) MM_HIENGLISH(0.001英寸) MM_LOMETRIC(0.1mm) MM_HIMETRIC(0.01mm) MM_TWIPS(1/1400英寸,一般用于打印机)
   可变比例模式:M_ISOTROPIC(1:1),MM_ANISOTROPIC(可为任意比例),用SetWindowsExt() 和SetViewportExt()来设定比例,
void CInSide_VCView::OnDraw(CDC* pDC)
{
        CRect rectClient;
 GetClientRect(rectClient);
 pDC->SelectStockObject (m_nColor);
 pDC->SetMapMode (MM_ANISOTROPIC);
 pDC->SetWindowExt (1000,1000);
 pDC->SetViewportExt (rectClient.right,rectClient.bottom );
 pDC->SetViewportOrg (rectClient.right/2,rectClient.bottom/2);
 pDC->Ellipse (CRect(-500,-500,500,500));
}
  物理坐标,即我们现实中的尺寸,屏幕中一英寸是现实中的12英寸,如果我们使用MM_LOENGLISH(0.01英寸)的映射模式,那么26.75英寸将是电脑的26.75/12=2.23(英寸),在电脑里1个逻辑单位是0.01英寸,所以,26.75英寸 转换为逻辑单位是223单位,但是这过程中有省略,为了防止这样的情况,我们可以使用物理坐标保存。

  转换函数;DPtoLP() 设备坐标到逻辑坐标; LPtoDP()逻辑坐标到设备坐标;物理坐标到逻辑坐标的转换全是由我们自己计算;

MFC 中一般情况下有下面的情况:
  CDC类中的所有成员函数用的是逻辑坐标做参数
  CWND类中的所有成员函数用的是设备坐标做参数
  所有的选中-测试(HIT-TEST)操作都是用的设备坐标,有些函数只能使用设备坐标如:CRect::PtInRect()
  所有要长期保存的值一般用逻辑坐标,用设备坐标则用户对窗口滚动就会改变,该坐标就会失效了;

 下一例子,测试鼠标左键点的区域是不是在指定的地方
void CMyView::OnLButtonDown(UINT uFlags,CPoint point)
{
     CRect rect=m_rect;
     CClientDC dc(this);
     dc.SetMapMode(MM_TEXT);
     dc.LPtoDP(rect);
     if(rect.PtInRect(point))
       {
          MessageBox("YES");
       }

}

一般设置映射模式在OnPrepareDC() 中比较合适~,OnPrepareDC在OnDraw前调用!
 

MFC 对140 种Windows 消息提供了直接的消息控制函数,特别注意下面5个:WM_CREATE,WM_CLOSE,WM_DESTROY,WM_NCDESTROY,WM_QUERYENDSESSION.

WM_CREATES 是WINDOWS 发送给视图的第一个消息,所以在OnCreate()中不能调用那写依赖窗口完全处于激活的WINDOWS函数!,一般来说可以在OnInitialUpdate()中调用,如:设置映射模式~,但是必须注意,OnInitialUpdate()在视图生存之间可能被调用多次~
 

原创粉丝点击