[乱]mfc与sdk笔记[八]

这个主要笔记的是视图和保存吧。我也不知道。

  1. 如果需要初始化ScrollBar

    1. //添加虚函数OnInitialUpdate()
    2.     SetScrollSizes(MM_TEXT,CSize(800,600));
    1. //改变视口原点
    2.     SetViewportOrg();
    3.     //改变窗口原点
    4.     SetWindowOrg();
  2. 当我们在窗口中点击鼠标左键的时候,得到的是设备坐标(680,390),在MM_TEXT的映射模式下,逻辑坐标和设备坐标是相等的,所以我们利用集合类保存的这个点的坐标是以象素为单位,坐标值为(680,390)。在调用OnDraw函数前,在OnPaint函数中调用了OnPrepareDC函数,调整了显示上下文的属性,将视口的原点设置为了(0,-150),这样的话,窗口的原点,也就是逻辑坐标(0,0)将被映射为设备坐标(0,-150),在画线的时候,因为GDI的函数使用的是逻辑坐标,而图形在显示的时候,Windows需要将逻辑坐标转化为设备坐标,因此,原先保存的坐标点(680,390)(在GDI函数中,作为逻辑坐标使用),根据转换公式xViewport = xWindow-xWinOrg+xViewOrg 和yViewport = yWindow-yWinOrg+yViewOrg,得到设备点的x坐标为680-0+0=680,设备点的y坐标为390-0+(-150)=240,于是我们看到图形在原先显示地方的上方出现了。
    解决:
    首先我们在绘制图形之后,在保存坐标点之前,调用OnPrepareDC函数,调整显示上下文的属性,将视口的原点设置为(0,-150),这样的话,窗口的原点,也就是逻辑坐标(0,0)将被映射为设备坐标(0,-150),然后我们调用DPtoLP函数将设备坐标(680,390)转换为逻辑坐标,根据设备坐标转换为逻辑坐标的公式:
    xWindow = xViewport-xViewOrg+xWinOrg,
    yWindow = yViewport-yViewOrg+yWinOrg,
    得到逻辑点的x坐标为680-0+0=680,y坐标为390-(-150)+0=540,将逻辑坐标(680,540)保存起来,在窗口重绘时,会先调用OnPrepareDC函数,调整显示上下文的属性,将视口的原点设置为了(0,-150),然后GDI函数用逻辑坐标点(680,540)绘制图形,被Windows转换为设备坐标点(680,390),和原先显示图形时的设备点是一样的,当然图形就还在原先的地方显示出来。
  3. 使用CMetaFileDC源文件播放图形
    1. //首先设置成员变量CMetaFileDC
    2.   CMetaFileDC m_dcMetaFile;
    3.   //再在View类构造函数调用Create
    4.   m_dcMetaFile.Create();    //新建一个内存源文件
    5.   //在绘画的地方的dc换成源文件的dc,例如MoveTo,LineTo函数
    6.   //再在显示的地方Close
    7.   HMETAFILE hmetaFile;
    8.   hmetaFile = m_dcMetaFile.Close();
    9.   pDC->PlayMetaFile(hmetaFile);//它在绘制图形
    10.   m_dcMetaFile.Create();
    11.   m_dcMetaFile.PlayMetaFile(hmetaFile);
    12.   DeleteMetaFile(hmetaFile);
    13.  
    14.   //如果使用文件源文件
    15.     CopyMetaFile(hmetaFile,"abc.wmf");//保存源文件
    16. //增加打开文件命令响应:
    17.     hmetaFile = GetMetaFile("abc.wmf");
    18.     m_dcMetaFile.PlayMetaFile(hmetaFile);
    19.  
    20.     Invalidate(); //使之无效,使之重绘
  4. 兼容DC与兼容位图中保存
    1. CDC m_dcCompatible;
    2.    //创建兼容DC。
    3.    if(!m_dcCompatible.m_hDC)
    4.    {
    5.         m_dcCompatible.CreateCompatibleDC(&dc);//选择当前dc做兼容
    6.         CRect rect;
    7.         GetClientRect(&rect);
    8.         CBitmap bitmap;
    9.         bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//创建兼容位图
    10.         m_dcCompatible.SelectObject(&bitmap);
    11.         m_dcCompatible.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
    12.         m_dcCompatible.SelectObject(pBrush);
    13.     }
    14.  
    15.     //在OnDraw中
    16.     CRect rect;
    17.     GetClientRect(&rect);
    18.     pDC->Bitblt(0,0,rect.Width(),rect.Height(),&m_dcCompatible,0,0,SRCCOPY);
    19.  
    20.     /*CreateCompatibleBitmap返回的位图对象只包含相应设备描述表中的位图的位图信息头,不包含颜色表和象素数据块。因此,选入该位图对象的设备描述表不能像选入普通位图对象的设备描述表一样应用,必须在SelectObject函数之后,调用BitBlt将原始设备描述表的颜色表及象素数据块拷贝到兼容设备描述表。*/

Tags: ,

打开了评论功能,但是需要被审核,所以请耐心等待。