1、建立一个新MFC AppWizard(exe)项目“82”,除选择单文档外其余全用默认项。
2、重载My82View类的OnPrepareDC函数void CMy82View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo){pDC->SetMapMode (MM_ANISOTROPIC);//应该还记得此种映射模式是X,Y的比例因子可以独立变化pDC->SetWindowExt (1440,1440);//将映射模式设置成逻辑twips即一个逻辑单位等于1/1440逻辑英寸。pDC->SetViewportExt (pDC->GetDeviceCaps (LOGPIXELSX),-pDC->GetDeviceCaps (LOGPIXELSY));//用SetWindowExt和SetViewportExt定义比例GetDeviceCaps函数可以获得各种显示参数,典型的参数如下:/*在640X480分辨率下:HORZSIZE 物理宽度(毫米) 320VERTSIZE 物理高度(毫米) 240HORZRES 象素宽度 640VERTRES 象素高度 480LOGPIXEXSX 每逻辑英寸的水平点数 96LOGPIXEXSY 每逻辑英寸的垂直点数 96*/}
3、加入一个Private类型的辅助函数ShowFont用来显示文本。可以用Add Member Function的方法加入,也可以直接修改代码在82View.h中瑕铆幌约加入class CMy82View : public CView{private:void ShowFont(CDC* pDC, int& nPos, int nPoints);//以下为原生成代码,不需改变......}在82View.cpp中加入void CMy82View::ShowFont(CDC* pDC, int& nPos, int nPoints){TEXTMETRIC tm;/*TEXTMETRIC结构包含字体的所有逻辑单位信息原型如下:typedef struct tagTEXTMETRIC { /* tm */int tmHeight;int tmAscent;int tmDescent;int tmInternalLeading;int tmExternalLeading;int tmAveCharWidth;int tmMaxCharWidth;int tmWeight;BYTE tmItalic;BYTE tmUnderlined;BYTE tmStruckOut;BYTE tmFirstChar;BYTE tmLastChar;BYTE tmDefaultChar;BYTE tmBreakChar;BYTE tmPitchAndFamily;BYTE tmCharSet;int tmOverhang;int tmDigitizedAspectX;int tmDigitizedAspectY;} TEXTMETRIC;*/CFont fontText;CString strText;CSize sizeText;fontText.CreateFont(-nPoints * 20, 0, 0, 0, 400, FALSE, FALSE, 0,ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_ROMAN, "Tahoma");//调用CFont::CreateFont函数,建立GDI的字体对象,参数1和2是字体的高度和宽度,最后一个参数是字体的名称CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);//将新字体选进设备,并返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它pDC->GetTextMetrics(&tm);//参数是指向TEXTMETRIC结构的指针,得到当前字体的属性,strText.Format("%d磅 WINDOWS 中文字体范例 1234567890", nPoints);sizeText = pDC->GetTextExtent(strText);pDC->TextOut(0, nPos, strText);pDC->SelectObject(pOldFont);//恢复原来的对象nPos -= tm.tmHeight + tm.tmExternalLeading;}
4、编辑CMy82View::OnDraw函数void CMy82View::OnDraw(CDC* pDC){int nPosition = 0;for (int i = 12; i <= 24; i += 2) {ShowFont(pDC, nPosition, i);}}
5、编译运行,可以看到7行逐渐放大的同字体字符串。