0

フォームがあります。formshow で、フィールドの値を stringgrid セルに初期化しますが、セルのテキストの下に影が表示されます。フィールドの値にペルシア文字を使用しました。
私は英語の値で同じことをしましたが、うまくいきます。
提案をいただければ幸いです。

出力例:

ここに画像の説明を入力

4

1 に答える 1

2

有効DefaultDrawingにして を入力すると、テキストはすでにレンダリングされますOnDrawCell

を使用してペイントに必要な行の高さを計算しているため、で塗りつぶし/クリアするものを計算する必要がDT_CALCRECTあります。 を使用して、塗りつぶす必要がある最終的な Rect を取得できます (例では)。DrawTextRectFillRect
UnionRectFillRect

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[1,1] := 'Hallo'#13'World';
  StringGrid1.Cells[2,2] := 'اهای' +13# + 'جهان';
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S:String;
  drawrect,Fillrect : TRect;
begin
  s := (Sender as TStringGrid).Cells[ACol, ARow];
  drawrect := Rect;
  DrawText((Sender as TStringGrid).Canvas.handle, Pchar(s), Length(s),
      drawrect, DT_CALCRECT or DT_WORDBREAK or DT_LEFT);
  if (drawrect.bottom - drawrect.Top) > (Sender as TStringGrid)
      .RowHeights[ARow] then (Sender as TStringGrid)
      .RowHeights[ARow] := (drawrect.bottom - drawrect.Top);
  UnionRect(FillRect,Rect,DrawRect);
  (Sender as TStringGrid).Canvas.FillRect(FillRect);
  DrawText((Sender as TStringGrid).Canvas.handle, Pchar(s), Length(s),
        drawrect, DT_WORDBREAK or DT_LEFT);
end;
于 2013-07-21T12:25:24.630 に答える