0

これをキャンバスのテキストアウトに入れようとしています

名前 空飛ぶ溶岩水

そうすることで..プレイヤーが飛行、溶岩、水などの名前の下に何かを持っている必要があるかどうかを確認します。したがって、ラベル テキストはプレイヤー名から始まります。すべてのラベルにこれがあります。そして、canwater のような「おまけ」のいずれかが true の場合、関連するテキストを含む新しい行が追加されます。以下を参照してください。

                canwater := (FTherePlayers.Player[strtoint(name2)].values['water'] = 'Yes');  //checks if unit can enter water
                canlava := (FTherePlayers.Player[strtoint(name2)].values['lava'] = 'Yes');  //checks if unit can enter lava
                canfly := (FTherePlayers.Player[strtoint(name2)].values['Flying'] = 'Yes');   //checks if unit can fly
                labeltext :=  FTherePlayers.Player[strtoint(name2)].values['name'];
               if canfly then
                  labeltext := labeltext+ #13#10+ 'Flying';
               if canlava then
                  labeltext := Labeltext+#13#10+'Lava';
               if canwater then
                  labeltext := labeltext+#13#10+'Water';
               hexmap1.AddLabelName(Labeltext,posL); //add name to placement label

これで、キャプションに正しい情報が提供されます。ただし、新しい行を追加することはありません。代わりに、次のようになります

name[][]flying[][]lava[][]water[][]

ここで、[] は小さな四角です テキストアウトに使用しているコードは次のようになります。

procedure THexmap.AddLabelName(text :string; Position :TPoint);
var
  hex_id :string;
  P0:tpoint;

begin
    with TempMap.canvas do
   begin
      hex_id := text;
           hex_id := text;
           {font := self.font;}
           p0 := convertcoords(point(Position.X,Position.Y),ptROWCOL);
           textout(p0.x - (trunc(textwidth(hex_id) / 2)) ,p0.y- (textheight(hex_id)) ,hex_id);
   end;
       Refresh;
end;

ほとんどの場合、新しい画像またはこの場合はテキストを一時マップにロードします。hex_ID は name/flying/lava です..ect PO は、マップ上の行 1 、列 3 に配置する場所です。テキストアウト、それがどのように機能するのかわかりません..しかし、「改行」コード#10#13がめちゃくちゃになっていることを理解してください。これを修正する方法についてのアイデアはありますか?

XY(tpoint) を取得する方法を追加しました

{******************************************************************************}
{  This function will return the Row / Col pair based on a given X/Y
   for a using application that calls it}
 function THexMap.ConvertCoords(point:Tpoint;pointtype:Tpointtype):Tpoint;
 var
   temp:TPoint;
 begin
   case PointType of
     ptXY: {Convert from x/y to Row/Col}
     Begin

       temp.x:= round( (point.x + (HexRadius/2) ) / (1.5 * Hexradius));



       if odd(temp.x) then
          temp.y := round( (point.y + rise) / (rise*2))
       else
          temp.y := round( point.y  / (2*rise));

       { This section insures row / col is good}
      if (temp.x < 1) or (temp.y < 1) then
         begin
           temp.x := 0;
           temp.y := 0;
          end
       else if (temp.y > HexRows) or (temp.x > HexColumns) then
         begin
           temp.y := 0;
           temp.x := 0;
         end;

       ConvertCoords := temp;
     end;

     ptRowCol:  { Converts Row/Col to X/Y }
     begin
       if point.x=1 then
        temp.x:= HexRadius
       else
        temp.x := HexRadius+(point.x-1) * (round(1.5 * hexradius));

       if odd(point.x) then
        if point.y=1 then
           temp.y:= rise
        else
           temp.y := rise+(point.y-1) * (2 * rise)
       else
         temp.y := (point.y * (2*rise));

       ConvertCoords := temp;
     end;
   end;
 end;
4

2 に答える 2

3
var
 s:String;
 r:TRect;
begin
   s := 'Just'#13#10'for'#13#10'demonstration';
   r.Left := 10;
   r.top := 10;
   r.Right := 100;
   r.Bottom := 100;

   // you can use this with newer Delphiversions
   // Canvas.TextRect(r,s, [tfCenter,tfWordBreak]);
   // with olderversions you can use this             =1              =16
   DrawTextEx(Canvas.Handle, PChar(s), Length(s), r, DT_CENTER or DT_WORDBREAK, nil);
end;

ポイントからrectを取得する方法の質問の答えとして

var
 s:String;
 r:TRect;
begin
   s := 'Just'#13#10'for'#13#10'demonstration';
   r.Left := p0.x;
   r.top := p0.y;
   r.Right := p0.x + 10000;    // we will calculate needed rect later
   r.Bottom := p0.y + 10000;   // via DT_CALCRECT

   // you can use this with newer Delphiversions
   // Canvas.TextRect(r,s, [tfCenter,tfWordBreak,tfCalcRect]);
   // with olderversions you can use this             =1              =16           1024
   DrawTextEx(Canvas.Handle, PChar(s), Length(s), r, DT_CENTER or DT_WORDBREAK or DT_CALCRECT, nil);

   // you can use this with newer Delphiversions
   // Canvas.TextRect(r,s, [tfCenter,tfWordBreak]);
   // with olderversions you can use this             =1              =16
   DrawTextEx(Canvas.Handle, PChar(s), Length(s), r, DT_CENTER or DT_WORDBREAK, nil);
end;
于 2012-11-19T07:37:45.197 に答える
3

TextOutは、単に#13#10を描画する2文字として扱います。そのため、正方形が表示されます。テキストを別の行に配置するつもりかどうかはわかりません。

たとえば、TextOutに4つの呼び出しを書き込むなどして、テキストを別の線に描画するように配置する必要があります。

Win32APIからDrawTextを使用することもできます。

于 2012-11-19T06:48:15.420 に答える