WIN32

2009-07-14 11 views
16

में स्ट्रिंग (पिक्सेल में) की चौड़ाई को कैसे ढूंढें, क्या आप GetTextMetrics फ़ंक्शन का उपयोग करने और tmAveCharWidth * strSize का उपयोग करने से WIN32 में एक स्ट्रिंग की चौड़ाई को माप सकते हैं?WIN32

+2

आपको ध्यान रखना चाहिए कि "tmAveCharWidth * strSize" निश्चित चौड़ाई फ़ॉन्ट के लिए केवल सायन है। –

उत्तर

20

GetTextExtentPoint32 का उपयोग करें। यह तार्किक इकाइयों में प्रस्तुत स्ट्रिंग की चौड़ाई और ऊंचाई को मापने के लिए दिए गए डिवाइस संदर्भ के लिए वर्तमान फ़ॉन्ट का उपयोग करता है। डिफ़ॉल्ट मैपिंग मोड के लिए, MM_TEXT, 1 लॉजिकल यूनिट 1 पिक्सेल है।

हालांकि, अगर आपने वर्तमान डिवाइस संदर्भ के लिए मैपिंग मोड बदल दिया है, तो एक लॉजिकल यूनिट पिक्सेल के समान नहीं हो सकता है। आप विभिन्न mapping modes on MSDN के बारे में पढ़ सकते हैं। मैपिंग मोड के साथ, आप GetTextExtentPoint32 द्वारा पिक्सेल में आपके द्वारा लौटाए गए आयामों को परिवर्तित कर सकते हैं।

+0

धन्यवाद, यही वह है जो मैं चाहता था। :) – Razvi

+1

GetTextExtentPoint32 "तार्किक इकाइयों" का उपयोग करता है; पिक्सेल नहीं: http://msdn.microsoft.com/en-us/library/dd144938%28VS.85%29.aspx – user20493

+1

@user अच्छी पकड़। जब मैपिंग मोड MM_TEXT (डिफ़ॉल्ट) है, 1 लॉजिकल यूनिट = 1 पिक्सेल है, लेकिन यह जरूरी नहीं है कि यह सच होना चाहिए। मैं अपना जवाब संशोधित करूंगा। –

3

Graphics::MeasureString?

VOID Example_MeasureString(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    // Set up the string. 
    WCHAR string[] = L"Measure Text"; 
    Font font(L"Arial", 16); 
    RectF layoutRect(0, 0, 100, 50); 
    RectF boundRect; 
    // Measure the string. 
    graphics.MeasureString(string, 12, &font, layoutRect, &boundRect); 
    // Draw a rectangle that represents the size of the string. 
    graphics.DrawRectangle(&Pen(Color(255, 0, 0, 0)), boundRect); 
}
+0

आपकी विधि निश्चित रूप से GetTextExtentPoint32() का उपयोग करने से बेहतर है। –

+0

मुझे एक उलझन में बात है। layoutRect क्या है? मुझे यह समझ में नहीं आता – Kross

1

इस पर निर्भर करते हुए कि आप इसका उपयोग कैसे कर रहे हैं, आप DT_CALCRECT के साथ DrawText का उपयोग कर सकते हैं और यह (यह हमेशा मेरे लिए काफी सटीक रूप से किया जाएगा) पाठ/फ़ॉन्ट/आदि के आधार पर आवश्यक आयताकार के आकार की गणना करेगा।

13

मैं कुछ के लिए पता नहीं है, लेकिन ऐसा लगता है कि:

HDC hDC = GetDC(NULL); 
RECT r = { 0, 0, 0, 0 }; 
char str[] = "Whatever"; 
DrawText(hDC, str, strlen(str), &r, DT_CALCRECT); 

काम हो सकता है।

+0

धन्यवाद, इसे आजमाया और GetTextExtentPoint32 के समान चौड़ाई दिखाता है :)। – Razvi

+2

यह 'GetTextExtentPoint32' से बहुत बेहतर समाधान है क्योंकि यह समीकरण के बाहर मैपिंग मोड लेता है। लेखक को बदलने की जरूरत है एक चीज़ 'DrawText' के लिए झंडे है। इसे 'DT_CALCRECT | पर सेट करें DT_NOPREFIX | DT_SINGLELINE'। परिणामी चौड़ाई को तब 'abs (r.right - r.left) के रूप में गणना की जा सकती है; ' – c00000fd

0

बिल्डर सी ++ के लिए पहले नया TLabel गतिशील रूप से बनाएं और फिर फ़ॉन्ट विशेषताएँ बदलें। अपने TLabel को ऑटोसाइज के रूप में सेट करें। फिर आप आपको TLabel चौड़ाई चुड़ैल पिक्सल में अपनी स्ट्रिंग चौड़ाई का प्रतिनिधित्व कर सकते हैं।

int WidthPixels (String font, int size, String text) 
{ 
    TLabel* label = new TLabel(Form1); // dynamic TLabel 
    label->AutoSize = true; 
    label->Font->Name = font; // your font 
    label->Font->Size = size; // your font size 
    label->Caption = text; // your string 
    return label->Width; 
} 

int width = WidthPixels("Times New Roman", 19 , "Hey"); 

 संबंधित मुद्दे