2013-11-01 34 views
0

我有一個graphiccontrol並試圖在畫布上繪製文本。目前我正在做一個Canvas.Textout(),但因爲手動設置值,如果畫布面積增長的文本沒有。我想讓文字也成長。例如。如何自動繪製基於graphiccontrols大小的文本

{Sets the cards power and draws it on the tcard} 
//------------------------------------------------------------ 
procedure TCard.DrawLPower(value: string);//left number 
//------------------------------------------------------------ 
    begin 
    if fbigcard = false then 
    begin 
    canvas.Font.Size := 8; 
    canvas.font.color := TColor($FFFFFF); 
    Canvas.TextOut(1,1,value); 
    end 
    else 
    begin 
    canvas.font.color := TColor($FFFFFF); 
    canvas.Font.Size := 12; 
    Canvas.TextOut(1,7,value); 
    canvas.Font.Color := CLBlack; 
    end; 
    end; 

我檢查卡/帆布大,如果是的話,將文本,如果它不是大了1,7將文本出來1,1。我想如果我使用方法textheight或文本寬度它會自動修復,但不知道如何?並保留我在同一個地方畫的數字。目前我在大約3個地方做這個是另外兩個。

{sets cards def and draws it to the tcard} 
//------------------------------------------------------------ 
procedure TCard.DrawLDefence(value: string); //right number 
//------------------------------------------------------------- 
    begin 
    if fBigcard = false then 
    begin 
    canvas.font.color := TColor($FFFFFF); 
    canvas.Font.Size := 8; 
    canvas.TextOut(32,1,value); 
    canvas.Font.Color := CLBlack; 
    end 
    else 
    begin 
    canvas.font.color := TColor($FFFFFF); 
     canvas.Font.Size := 12; 
     canvas.TextOut(115,7,value); 
     canvas.Font.Color := CLBlack; 
    end; 
    end; 

{Sets and draws the cost to the TCard} 
//------------------------------------------------------------- 
procedure TCard.DrawLCost(value :string); //cost 
//------------------------------------------------------------- 
    begin 
    if fbigcard = false then 
    begin 
    canvas.font.size := 8; 
    canvas.font.color := TColor($FFFFFF); 
    Canvas.textout(19,1,inttostr(CCost)); 
    end 
    else 
    begin 
    canvas.font.size := 12; 
    canvas.font.color := TColor($FFFFFF); 
    Canvas.textout(65,7,inttostr(CCost)); 
    canvas.Font.Color := CLBlack; 
    end; 
    end; 

還,如果有幫助,我想我應該保持大小從而去除所有多餘的代碼變種..

+0

使用'MulDiv'根據畫布大小縮放字體大小 –

+0

我無法在delphi wiki info/help中找到該術語。它是如何工作的? –

+0

將MulDiv輸入Google:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383718.aspx –

回答

2

你想上的控件大小dependend文字大小?然後你需要知道或計算哪個文本應該放在哪個空間中,然後繪製它。看看你的代碼,所有三個字符串在Y=1處以不同的X座標彼此相鄰輸出。我想你爲了測試目的對這些座標進行了硬編碼,現在你想獲得任意控制尺寸的動態。

所以我假設你在這裏問的真正問題是:如何計算給定文本寬度的字體大小?(希望我是對的,我沒有白白寫出這個答案,但你真的應該在你的問題上更清楚)

答案要求知道如何在控件的寬度中分配字符串,在兩者之間的邊際。假設您希望所有三個字符串都在控件寬度的一半範圍內繪製,並且它們要用兩個空格的寬度分隔(如果不是,至少要確保與字體大小成比例的頁邊距)。據我所知,沒有常規的計算字體大小對於給定的文本大小,所以你必須解決:設置字體小,而且增加直到文本適合:

procedure TCard.DrawValues(const Power, Defence, Cost: String); 
var 
    FontRecall: TFontRecall; 
    S: String; 
    FontHeight: Integer; 
begin 
    FontRecall := TFontRecall.Create(Canvas.Font); 
    try 
    S := Format(' %s %s %s', [Power, Defence, Cost]); 
    FontHeight := -1; 
    repeat 
     Inc(FontHeight); 
     Canvas.Font.Height := FontHeight + 1; 
    until Canvas.TextWidth(S) > ClientWidth div 2; 
    Canvas.Font.Height := FontHeight; 
    Canvas.TextOut(0, 1, S); 
    finally 
    FontRecall.Free; 
    end; 
end; 

Idealy,你會重新計算此FontHeight只有當控件大小會發生變化(覆蓋Resize)或字符串更改。

+0

。很高興你知道我想要什麼,因爲我很難解釋我想做什麼。我將不得不編輯它以獲取值之間需要的空間,但除此之外,這是非常好的答案 –

相關問題