文章編號: 145994 - 上次校閱: 2006年11月21日 - 版次: 4.1

如何計算對話方塊方塊單位根據 Visual C++ 中目前的字型

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
附註Microsoft Visual C++.NET (2002),支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。

在此頁中

全部展開 | 全部摺疊

結論

GetDialogBaseUnits() 計算對話方塊單位時,一律假設系統字型。如果您使用系統字型以外的任何字型,傳回值可能無法正確您的對話方塊。本文提供可用來計算依據目前的字型對話方塊方塊單位的兩個替代方案。

其他相關資訊

水平的基本刻度間距等於系統字型中的字元平均寬度 (以像素為單位)。GetDialogBaseUnits() 的說明會建議下列程式碼來計算正確的單位:
pixelX = (dialogunitX * baseunitX) / 4
pixelY = (dialogunitY * baseunitY) / 8
				

但是,您不使用系統字型,如果您需要進行一些額外的計算以取得正確的座標。這裡有兩種方法:

方法 1

垂直對話方塊方塊單位就等於字元高度。水平對話方塊方塊單位相當於對話方塊字型的平均字元寬度。平均字元寬度的計算方式是尋找字母的字元組的平均的文字範圍。這是必要的因為 tmAveCharWidth 不精確。使用此程式碼:
   void CAboutDlg::OnPaint()
   {
       CPaintDC dc(this); // device context for painting

       CFont* pFont = GetFont();
       CFont* oldFont = dc.SelectObject(pFont);
       TEXTMETRIC tm;
       dc.GetTextMetrics( &tm );
       int baseUnitY = tm.tmHeight;
       CSize size;
       size = dc.GetTextExtent(
           "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52);
       int baseUnitX = (size.cx / 26 + 1) / 2;
       TRACE("baseUnitX = %d\n", baseUnitX);
       TRACE("baseUnitY = %d\n", baseUnitY);
       dc.SelectObject(oldFont);

   }
				

方法二

替代方案是更簡單。使用的 x 座標由 MapDialogRect() = 4,Y = 8 會傳回對話方塊] 方塊中的基本單位不論對話方塊的字型。不過,在大部分情況下程式設計人員不必知道對話方塊] 方塊中的基本單位。MapDialogRect() 可用來直接將任何對話方塊方塊單位轉換直接為裝置座標。下列範例程式碼示範如何使用它來尋找對話方塊] 方塊中選取的基本單位:
   void CAboutDlg::OnPaint()
   {
       CPaintDC dc(this); // device context for painting

       CRect rc( 0, 0, 4, 8 );

       MapDialogRect( &rc );
       int baseUnitY = rc.bottom;
       int baseUnitX = rc.right;
       TRACE("baseUnitX = %d\n", baseUnitX);
       TRACE("baseUnitY = %d\n", baseUnitY);

   }
				

?考

如需詳細資訊請參閱 「 Microsoft 知識庫 」 中下列文:
125681? (http://support.microsoft.com/kb/125681/EN-US/ ) 如何計算與非架構系統字型對話方塊基底單位

這篇文章中的資訊適用於:
  • Microsoft Foundation Class Library 4.2?應用於:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 6.01 Professional Edition
    • Microsoft Visual C++ 4.0 Professional Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbmt kbinfo kbcode kbdlg kbfont kbhowto kbuidesign KB145994 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:145994? (http://support.microsoft.com/kb/145994/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。