VC++编程常见
问题 51、如何创建一个具有特定点大小的字体 可以指定字体逻辑单位的大小, 但有时指定字体的点的大小可能会更方便一 些。可以如下将字体的点转换为字体的高度: intnHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72); 下例创建了一个 8 点的 Apial 字体: … CClientDC dc (AqfxGetMainWnd ()); m_font.CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY), 72),0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET, OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY, VARIABLE_PITCH | FF-SWISS,_T ("Arial")); ... 52、如何计算一个串的大小 函数 CDC:: Det text Extent 根据当前选择的字体计算一个串的高度和宽 度 。如果使用的不是系统字体而是其他字体,则在调用 GetTextExtent 之前将字体 选 进设备上下文中是很重要的,否则计算高度和宽度时将依据系统字体,由此得出 的结果当然是不正确的。 下述样板程序当改变下压按钮的标题时动态调整按钮的 大小,按钮的大小由按钮的字体和标题的大小而定。响应消息 WM_SETTEXT 时调 用 OnSetText,该消息使用 ON_MESSAE 宏指令定义的用户自定义消息。
LRESULT CMyButton::OnSettext (WPARAM wParam, LPARAM lParam) { //Pass message to window procedure. LRESULT bResult=CallWindowProc (*GetSuperWndProcAddr (), m_hWnd, GetCurrentMessage () ->message,wParam,lParam); //Get title of push button. CStringstrTitle; GetWindowText (strTitle); //Select current font into device context. CDC* pDC=GetDc (); CFont*pFont=GetFont (); CFont*pOldFont=pDC->SelectObject (pFont);
//Calculate size of title. CSize size=pDC->GetTextExent (strTitle,strTitle.GetLength ()); //Adjust the button's size based on its title. //Add a 5-pixel border around the button. SetWindowPos (NULL, 0, 0, size.cx+10, size.cy+10, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); //Clean up. pDC->SelectFont (pOldFont); ReleaseDC (pDC); returnbResult; } 53、如何显示旋转文本 只要用户使用 TrueType 或者 GDI 笔或字体就可以显示旋转文本(有些硬件设 备 也支持旋转光栅字体)。LOGFONT 结构中的 ifEscapement 成员指定了文本行和 x 轴 的角度,角度的单位是十分之一度而不是度,例如,ifEscapement 为 450 表示 字体 旋转 45 度。为确保所有的字体沿坐标系统的同一方向旋转,一定要设置 ifEscapement 成员的 CLIP_LH_ANGLES 位,否则,有些字体可能反向旋转。下例 使 用了 14 点 Arial 字体每间隔 15 度画一个串。 voidCSampleView:: OnDraw (CDC* pDC) { //Determine the size of the window. CRectrcClient; GetClientRect (rcClient); //Create sample string. CStringstr (_T ("Wheeee...I am rotating!")); //Draw transparent, red text. pDC->SetBkMode (TRANSPARENT); pDC->SetTextColor (RGB (255,0,0)); CFont font; //font object LOGFONT stFont; //font definition //Set font attributes that will not change. memset (&;stFont, 0, sizeof (LOGFONT)); stFont.i
fheight=MulDiv (14, -pDC->GetDeviceCaps (LOGPIXELSY), 72); stFont.ifWeight=FW_NORMAL;
stFont.ifClipPrecision=LCIP_LH_ANGLES; strcpy (stFont.lfFaceName, "Arial"); //Draw text at 15degree intervals. for (intnAngle=0; nAngle<3600; nAngle+=150) { //Specify new angle. stFont.lfEscapement=nAngle; //Create and select font into dc. font.CreateFontIndirect (&;stfont); CFont* pOldFont=pDC->SelectObject (&;font); //Draw the text. pDC->SelectObject (pOldFont); font.DelectObjext (); } } 54、如何正确显示包含标签字符的串 调用 GDI 文本绘画函数时需要展开标签字符,这可以通过调用 CDC:: TabbedTextO