我要绘一些线段,因为精度的要求,不能使用MM_TEXT模式,并且要求是笛卡尔坐标,于是我就选用了MM_ISOTROPICAN模式绘图。
我使用MM_ISOTROPICAN模式绘图,坐标原点设在了右下角,因为精度有要求,我将它放大了100倍。
本来直接画也没问题,可因为刷新的时候闪得太厉害,所以我想用内存DC画,可就一个改变花了两天时间都没搞定。
高手们帮忙想想怎么办?
我是这样做的: int PRE=3;
CBitmap bitmap,*oldBitmap;
CRect rectClient;
GetClientRect(&rectClient);
bitmap.CreateCompatibleBitmap(&dc, rectClient.Width()*PRE, rectClient.Height()*PRE);//???是不是要创建这么大的图?要是PRE太大了甚至会把我的内存用光

CDC memdc;
memdc.CreateCompatibleDC(&dc);
oldBitmap = memdc.SelectObject(&bitmap);

memdc.SetMapMode(MM_ISOTROPIC);//设置绘图模式
memdc.SetWindowOrg(0,0);
memdc.SetViewportOrg(0,rectClient.Height());//设置视口的坐标原点为右下角
memdc.SetWindowExt(PRE,-PRE);//放大的精度,因为是向上,所以Y方向用负值
memdc.SetViewportExt(1,1);

//绘图操作
memdc.FillSolidRect(0,0,rectClient.Width()*PRE,rectClient.Height()*PRE,RGB(200,200,100););
memdc.Rectangle(300*PRE,300*PRE,600*PRE,600*PRE);画完后若直接使用StretchBlt,则图像并没有以右下角为原点绘制,还是在右上角,这是为什么?StretchBlt是这样写的:
dc.StretchBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(),&memdc, rectClient.left, rectClient.top,rectClient.Width()*PRE, rectClient.Height()*PRE, SRCCOPY);//不知道有没有错后来我不知怎么想到修改把实际DC的绘图模式也改一下:
int nMapMode = dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowOrg(0,0);
dc.SetViewportOrg(0,rectClient.Height());
dc.SetWindowExt(1,-1);
dc.SetViewportExt(1,1);
//再进行 dc.StretchBlt(……);
这样子原点到是在右下角了,可是前面却要创建的BITMAP内存也太大了,机子甚至提示虚拟内存不足!!高手看看到底要怎么操作才行,主要的问题就是坐标原点不在右下角。
分数不是问题!(虽然我很穷)

解决方案 »

  1.   

    在往屏幕DC绘制之前,把内存DC恢复为MM_TEXT的映射模式,屏幕DC不需要改变映射模式。
      

  2.   

    在将内存中绘制的图形拷贝到屏幕前一定要先恢复内存中的视口坐标,再恢复内存原模式memoDC.SetViewportOrg(m_ClientRect.left,m_ClientRect.top);           
    memoDC.SetMapMode(MM_TEXT); //再进行dc.StretchBlt(……);实际DC的绘图模式完全不用改,因为你的绘图操作都是用内存DC完成的