2009-07-14 30 views

Trả lời

20

Hãy thử sử dụng GetTextExtentPoint32. Điều đó sử dụng phông chữ hiện tại cho bối cảnh thiết bị đã cho để đo chiều rộng và chiều cao của chuỗi được hiển thị trong các đơn vị lôgíc. Đối với chế độ ánh xạ mặc định, MM_TEXT, 1 đơn vị logic là 1 pixel.

Tuy nhiên, nếu bạn đã thay đổi chế độ ánh xạ cho bối cảnh thiết bị hiện tại, đơn vị lôgic có thể không giống như pixel. Bạn có thể đọc về số khác nhau mapping modes on MSDN. Với chế độ ánh xạ, bạn có thể chuyển đổi kích thước được trả về cho bạn bằng GetTextExtentPoint32 thành pixel.

+0

Cảm ơn, đây là những gì tôi đã lokking cho. :) – Razvi

+1

GetTextExtentPoint32 sử dụng "đơn vị logic"; không phải pixel: http://msdn.microsoft.com/en-us/library/dd144938%28VS.85%29.aspx – user20493

+1

@user bắt tốt. Khi chế độ ánh xạ là MM_TEXT (mặc định), 1 đơn vị logic = 1 pixel, nhưng điều đó không nhất thiết phải đúng. Tôi sẽ sửa đổi câu trả lời của tôi. –

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

Phương pháp của bạn chắc chắn tốt hơn sử dụng GetTextExtentPoint32(). –

+0

Tôi có một điều khó hiểu. layoutRect là gì? Tôi không hiểu nó – Kross

1

Tùy thuộc vào cách bạn đang sử dụng điều này, bạn có thể sử dụng DrawText với DT_CALCRECT được chỉ định và nó sẽ luôn luôn tính toán kích thước của hình chữ nhật bắt buộc dựa trên văn bản/phông chữ/v.v.

13

Tôi không biết chắc chắn, nhưng có vẻ như rằng:

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

có thể làm việc.

+0

Cảm ơn, đã thử và hiển thị cùng chiều rộng với GetTextExtentPoint32 :). – Razvi

+2

Đây là giải pháp tốt hơn nhiều so với 'GetTextExtentPoint32' vì nó mất chế độ ánh xạ ngoài phương trình. Một điều mà tác giả cần thay đổi là cờ cho 'DrawText'. Đặt nó thành 'DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE'. Chiều rộng kết quả có thể được tính như là 'abs (r.right - r.left);' – c00000fd

0

Đối với Builder C++ trước tiên hãy tạo TLabel động mới và sau đó thay đổi thuộc tính phông chữ.Set TLabel của bạn thành autosize. Sau đó, bạn có thể nhận được TLabel width witch đại diện cho chiều rộng chuỗi theo pixel.

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"); 
Các vấn đề liên quan