◆ [Delphi] StringGridの文字を回転させる
どーもボキです。

StringGridって便利なんだけど、表示系がすこし弱い。
列タイトルを縦書きにしたくても、標準の機能じゃできない。

でもちょっと頑張れば結構簡単にできる。下のようにね。
a0021757_2035933.gif


方法は、StringGridのDrawCellイベントに以下を記述する。
(IEだと、ソースをコピペすると一行に表示されるみたい。その場合は、Excelに一回ペーストしてちょ)

あと、この方法Canvasの描画処理だから、利用先はStringGridに限定した話じゃないよ。

サンプルプログラム
procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
_SG : TStringGrid;
// ---------------------------------------------------------------------------
procedure __drawRollText(Angle : Integer);
var
s : String;
lf : TLogFont;
h,w : Integer;
rad : Single;
begin
s := _SG.Cells[ACol,ARow];

_SG.Canvas.FillRect(Rect); // デフォルトのフォント描画を消去
GetObject(_SG.Canvas.Font.Handle, SizeOf(lf), @lf);

lf.lfEscapement := Angle * 10; // 指定された角度×10 … (1)
_SG.Canvas.Font.Handle := CreateFontIndirect(lf);

// テキストの高さ・幅を取得
h := _SG.Canvas.TextHeight(s);
w := _SG.Canvas.TextWidth(s);


rad := DegToRad(Angle); // 角度→ラジアン

// 中心に表示するようにRectのLeft・Topを調整 … (2)
Rect.Left := Rect.Left + Round((Rect.Right - Rect.Left - w*Cos(rad) - h*Sin(rad)) / 2);
Rect.Top := Rect.Top + Round((Rect.Bottom - Rect.Top + w*Sin(rad) - h*Cos(rad)) / 2);

_SG.Canvas.TextOut(Rect.Left, Rect.Top, s);
end;
// ---------------------------------------------------------------------------
begin
_SG := TStringGrid(Sender);

if (ACol < _SG.FixedCols) and (ARow < _SG.FixedRows) then
__drawRollText(315)
else if (ARow < _SG.FixedRows) then
__drawRollText(90);
end;


a0021757_4441712.gif(1)について

TLongFontで指定する「lfEscapement」は、
左図のようなイメージになる。

つまり回転させる角度は、
反時計回りに、0.1度刻みに指定可能ってコト。



a0021757_444474.gif(2)について

この処理を書かずに、TextOutとすると、
文字はセルの左上に表示される。
つまり、左上の角を中心に文字は回転する。

角度をθとすると、回転後は、
 幅  = w×cosθ + h×sinθ
 高さ = w×sinθ + h×cosθ
となる。

高さの処理で、+ w*Sin(rad) としているのは、
Rectからはみ出る高さのため。

-(- w*Sin(rad)) → + w*Sin(rad) ね。


動作確認 : Delphi6 Personal

Delphiってカテゴリを用意しといて、大したことかいてないから、
SE♂的なことを書いてみた。


[PR]
by yozda | 2008-12-13 18:29 | プログラミング | Trackback | Comments(4)
トラックバックURL : http://yozda.exblog.jp/tb/7734193
トラックバックする(会員専用) [ヘルプ]
Commented by sokuzan at 2008-12-14 10:35 x
すごいね、yozdaさん!プロらしい、大したもんです。
ところで怪しいトラックバックが、、、こういう職業があれば(笑)信じる人もいるんじゃろうねー
Commented by yozda at 2008-12-14 12:33
ありがとうございます。
苦言ばっかりじゃダメかなっと思って、書いてみました。
Commented by T尾 at 2008-12-19 22:50 x
こんばんは^^ブログみました。
全部はとても見れなかったけど、面白かった~
イラストうまい!
あと、子供かわいい。yozda君の学生時代の髪型と一緒だ!

ではでは。
Commented by yozda at 2008-12-20 16:51
見てくれてありがと。時々見てね。
晄太郎ね、ボキと似てるところは髪質くらいなんよ。
<< [N82] やっとN82に機種... [N82] 何で色を間違えんのよ! >>