?? vctip7.html
字號:
<html><head><meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"><meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0"><meta NAME="doccomm" CONTENT="sss"><meta NAME="Template" CONTENT="C:\MSOffice\Template\Sl_BOOK.dot"><meta NAME="Author" CONTENT="Cheng Jinxing"><title>Visual C++編程技巧之七</title></head><body TEXT="#000000" BGCOLOR="#CCFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><p align="center"><br><font SIZE="+3" FACE="楷體_GB2312">Visual C++編程技巧之七</font> </p><p><a HREF="#tip49"><font SIZE="+0" FACE="Times New Roman">49</font><font SIZE="+0">、如何實現一個橡皮區矩形</font></a> </p><p><a HREF="#tip50"><font SIZE="+0" FACE="Times New Roman">50</font><font SIZE="+0">、如何更新翻轉背景顏色的文本</font></a> </p><p><a HREF="#tip51"><font SIZE="+0" FACE="Times New Roman">51</font><font SIZE="+0">、如何創建一個具有特定點大小的字體</font></a> </p><p><a HREF="#tip52"><font SIZE="+0" FACE="Times New Roman">52</font><font SIZE="+0">、如何計算一個串的大小</font></a> </p><p><a HREF="#tip53"><font SIZE="+0" FACE="Times New Roman">53</font><font SIZE="+0">、如何顯示旋轉文本</font></a> </p><p><font FACE="宋體"><a HREF="#tip54">54、如何正確顯示包含標簽字符的串</a></font> </p><p><a HREF="#tip55"><font SIZE="+0" FACE="Times New Roman">55</font><font SIZE="+0">、串太長時如何在其末尾顯示一個省略號</font></a> </p><p><a HREF="#tip56"><font SIZE="+0" FACE="Times New Roman">56</font><font SIZE="+0">、如何快速地格式化一個</font><fontSIZE="+0" FACE="Times New Roman">CString</font><font SIZE="+0">對象</font></a> </p><p><font SIZE="+2"><b> </b></font> </p><p><a NAME="tip49"></a><b><font SIZE="+2"><font FACE="Times New Roman">49</font><fontFACE="黑體">、如何實現一個橡皮區矩形</font></font></b> </p><p><font SIZE="+0"><font FACE="Times New Roman">CRectTracker</font>是一個很有用的類,可以通過調用<fontFACE="Times New Roman">CRectTracker:: TrackRubberBand</font>響應<fontFACE="Times New Roman">WM_LBUTTONDOWN</font>消息來創建一個橡皮區矩形。下例表明使用<fontFACE="Times New Roman">CRectTracker</font>移動和重置視窗中的藍色橢圓的大小是很容易的事情。</font> </p><p><font SIZE="+0">首先,在文件檔中聲明一個<font FACE="Times New Roman">CRectTracker</font>數據成員:</font> </p><p><font SIZE="+0" FACE="Times New Roman">class CSampleView : Public CView</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">public :</font> </p><p><font SIZE="+0" FACE="Times New Roman">CrectTracker m_tracker;</font> </p><p><font SIZE="+0">…</font> </p><p><font SIZE="+0" FACE="Times New Roman">};</font> </p><p><font SIZE="+0">其次,在文檔類的構造函數中初始化<fontFACE="Times New Roman">CRectTracker </font>對象:</font> </p><p><font SIZE="+0" FACE="Times New Roman">CSampleDoc:: CSampleDOC ()</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Initialize tracker position, size and style.</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_tracker.m_rect.SetRect (0, 0, 10, 10);</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_tracker.m_nStyle=CRectTracker:: resizeInside |</font> </p><p><font SIZE="+0" FACE="Times New Roman">CRectTracker:: dottedLine;</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">然后,在<font FACE="Times New Roman">OnDraw</font>函數中畫橢圓和蹤跡矩形:</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView:: OnDraw (CDC* pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">CSampleDoc* pDoc=GetDocument ();</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT_VALID (pDoc);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Select blue brush into device context.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CBrush brush (RGB (0, 0, 255));</font> </p><p><font SIZE="+0" FACE="Times New Roman">CBrush* pOldBrush=pDC->SelectObject (&brush);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//draw ellipse in tracking rectangle.</font> </p><p><font SIZE="+0" FACE="Times New Roman">Crect rcEllipse;</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->m_tracker.GetTrueRect (rcEllipse);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->Ellipse (rcEllipse);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Draw tracking rectangle.</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->m_tracker.Draw (pDC);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Select blue brush out of device context.</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->Selectobject (pOldBrush);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0">最后,使用<font FACE="Times New Roman">ClassWizard</font>處理<fontFACE="Times New Roman">WM_LBUTTONDOWN</font>消息,并增加下述代碼。該段代碼根據鼠標擊鍵情況可以拖放、移動或者重置橢圓的大小。</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Get pointer to document.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CSampleDoc* pDoc=GetDocument ();</font> </p><p><font SIZE="+0" FACE="Times New Roman">ASSERT_VALID (pDoc);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//If clicked on ellipse, drag or resize it. Otherwise create a</font> </p><p><font SIZE="+0" FACE="Times New Roman">//rubber-band rectangle nd create a new ellipse.</font> </p><p><font SIZE="+0" FACE="Times New Roman">BOOL bResult=pDoc->m_tracker.HitTest (point)!=</font> </p><p><font SIZE="+0" FACE="Times New Roman">CRectTracker::hitNothing;</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Tracker rectangle changed so update views.</font> </p><p><font SIZE="+0" FACE="Times New Roman">if (bResult)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->m_tracker.Track (this,point,TRue);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->SetModifiedFlag ();</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->UpdateAllViews (NULL);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><font SIZE="+0" FACE="Times New Roman">else</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDoc->m-tracker.TrackRubberBand (this,point,TRUE);</font> </p><p><font SIZE="+0" FACE="Times New Roman">CView:: onLButtonDown (nFlags,point);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip50"></a><b><font SIZE="+2"><font FACE="Times New Roman">50</font><fontFACE="黑體">、如何更新翻轉背景顏色的文本</font></font></b> </p><p><font SIZE="+0">調用<font FACE="Times New Roman">CDC:: SetBkmode</font>并傳送<fontFACE="Times New Roman">OPAQUE</font>用當前的背景顏色填充背景,或者調用<fontFACE="Times New Roman">CDC::SetBkMode</font>并傳送<font FACE="Times New Roman">TRANSPAARENT</font>使背景保持不變,這兩種方法都可以設置背景模式。下例設置背景模式為<fontFACE="Times New Roman">TRANSPARENT</font>,可以兩次更新串,用花色帶黑陰影更新文本。黑色串在紅色串之后,但由于設置了背景模式仍然可見。</font> </p><p><font SIZE="+0" FACE="Times New Roman">void CSampleView:: OnDraw (CDC* pDC)</font> </p><p><font SIZE="+0" FACE="Times New Roman">{</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Determint size of view.</font> </p><p><font SIZE="+0" FACE="Times New Roman">CRect rcView;</font> </p><p><font SIZE="+0" FACE="Times New Roman">GetClientRect (rcVieew);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Create sample string to display.</font> </p><p><font SIZE="+0"><font FACE="Times New Roman">CString str (_T ("Awesome Shadow Text</font>...<fontFACE="Times New Roman">"));</font></font> </p><p><font SIZE="+0" FACE="Times New Roman">//Set the background mode to transparent.</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->SetBKMode (TRANSPARENT);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Draw black shadow text.</font> </p><p><font SIZE="+0" FACE="Times New Roman">rcView.OffsetRect (1, 1);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDc->SetTextColor (RGB (0, 0, 0));</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->DrawText (str, str.GetLength (), rcView,</font> </p><p><font SIZE="+0" FACE="Times New Roman">DT_SINGLELINE | DT_CENTER | DT_VCENTER);</font> </p><p><font SIZE="+0" FACE="Times New Roman">//Draw red text.</font> </p><p><font SIZE="+0" FACE="Times New Roman">rcView.OffsetRect (-1,-1);</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDc->SetTextColor (RGB (255, 0, 0));</font> </p><p><font SIZE="+0" FACE="Times New Roman">pDC->DrawText (str, str.GetLength (), rcView,</font> </p><p><font SIZE="+0" FACE="Times New Roman">DT_SINGLELINE | DT_CENTER | DT_VCENTER);</font> </p><p><font SIZE="+0" FACE="Times New Roman">}</font> </p><p><a NAME="tip51"></a><b><font SIZE="+2"><font FACE="Times New Roman">51</font><fontFACE="黑體">、如何創建一個具有特定點大小的字體</font></font></b> </p><p><font SIZE="+0">可以指定字體邏輯單位的大小,但有時指定字體的點的大小可能會更方便一些。可以如下將字體的點轉換為字體的高度:</font> </p><p><font SIZE="+0" FACE="Times New Roman">int nHeigth=mulDiv (nPointSize, -dc.GetDeviceCaps (LOGPIXELSY), 72);</font> </p><p><font SIZE="+0">下例創建了一個<font FACE="Times New Roman">8</font>點的<fontFACE="Times New Roman">Apial</font>字體:</font> </p><p><font SIZE="+0" FACE="Times New Roman">CClientDC dc (AqfxGetMainWnd ());</font> </p><p><font SIZE="+0" FACE="Times New Roman">m_font. CreateFont (MulDiv (8, -dc.GetDeviceCaps (LOGPIXELSY),</font> </p><p><font SIZE="+0" FACE="Times New Roman">72),0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,</font> </p><p><font SIZE="+0" FACE="Times New Roman">OUT_STROKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,</font> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -