请教各位,我要在一个对话框上输出字符,代码如下,其中Ymax、Ymin、Xmax、Xmin是实际坐标的范围
输出的字符随着范围的不同大小也会变化,如果用MM_ANISOTROPIC字符大小可以固定,但纵横比又不同,我想要纵横比一样且字符大小不变该怎么做?
CRect rect;
this->GetClientRect(&rect);
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
pDC->SetViewportExt(rect.right,rect.bottom);
pDC->SetWindowOrg(0,0);
double dx=1.5;
pDC->SetWindowExt((Ymax-Ymin)*dx,-(Xmax-Xmin)*dx);//draw title
CFont  titleFont;  
CSize titleSize;
CRect rectTitle;
int nFontSize = 10;//用逻辑单位
CString strFontName = "宋体";
titleFont.CreateFont(nFontSize, 0,0,0, FW_NORMAL, 0,0,0, DEFAULT_CHARSET,
                             OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
                             DEFAULT_PITCH | FF_DONTCARE, strFontName);
            
CFont *pOldFont = pDC->SelectObject(&titleFont);// Get the average character width (in GridCtrl units) and hence the margins
titleSize = pDC->GetTextExtent(_T("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSATUVWXYZ"),52);
titleSize.cx /= 52;rectTitle.top    = ((Xmax-Xmin)*dx/2);//((Xmax-Xmin)*dx/2);//-rect.right /2;
rectTitle.left   =-(Ymax-Ymin)*dx;//-((Xmax-Xmin)*1.8);//rect.bottom /2;
rectTitle.right  = (Ymax-Ymin)*dx ;//cx- (LEFT_MARGIN+RIGHT_MARGIN)*titleSize.cx;
rectTitle.bottom = ((Xmax-Xmin)*dx/2)-HEADER_HEIGHT*titleSize.cy;
  
int nPrevBkMode = pDC->SetBkMode(TRANSPARENT);
  
// print App title on top right margin
CString strHeaderString="导 线 示 意 图";
pDC->DrawText(strHeaderString, &rectTitle, DT_CENTER | DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER);

解决方案 »

  1.   

    先 用GetDeviceCaps 获得目标输出设备的分辨率,然后根据分辨率计算字体在该分辨率中的大小,再创建相应的字体,再输出。
      

  2.   

    这样啊,不是设备无关的吗,为何用MM_ANISOTROPIC又不用这么麻烦呢
      

  3.   

    我将
    pDC->SetWindowExt((Ymax-Ymin)*dx,-(Xmax-Xmin)*dx);
    改成
    pDC->SetWindowExt(0.5*rect.right,-0.5*rect.bottom);
    字体大小好像差不多
    不过如果图太大时会显示不全
    不知道我的实际坐标x,y该做怎样的变换才能在窗口中以合适的大小显示出来,请各位指点。