こんにちは
以前から、文字列の描画サイズを求めたくて
TCanvasに対してTextWidthやTextHeightをしているのですが
TCanvasを持っていないコントロールの
文字列の描画サイズを求めるときに
FormのCanvasを使ってTextWidthとかTextHeightしています。
例えばTMemoのFontを描画するために
Form1.Font := Memo1.Font
として、
Form1.Canvas.TextWidth(...
とするのはどうにも不自然な気がしてなりません。
Self.Fontの状態をMemo1.Fontによって変更されるのが嫌です。
Memo(やComboBox等その他)に対するCanvasの作り方か
Canvasを使わずに
(もしくは使っても一時的に生成して破棄できるような手法で)
TextHeight/TextWidthで値を取得できる仕組みを
ご存じの方、教えてください。
すいません、慌てて書き込んだら
タイトル途中だし、
RichEditで指定行を中央に表示するには
https://www.petitmonte.com/bbs/answers?question_id=5339
こちらをみたら、
KHE00221さんのコードでこういう事が出来ることを知りました。
function GetTextWidth(Font: TFont; s: String): Integer;
begin
with TBitmap.Create do try
Canvas.Font.Assign(Font);
Result := Canvas.TextWidth(s);
finally Free; end;
end;
function GetTextHeight(Font: TFont; s: String): Integer;
begin
with TBitmap.Create do try
Canvas.Font.Assign(Font);
Result := Canvas.TextHeight(s);
finally Free; end;
end;
ということで、解決で....
お騒がせしました。
TBITMAP?
var
TCanvas使いたいなら・・・
Canvas : TCanvas;
DC : HDC;
begin
DC := GetDC(Memo1.Handle);
Canvas := TCanvas.Create;
Canvas.Handle := DC;
Canvas.Font.Assign(Memo1.Font);
Canvas.TextOut(0,0,'11111');
Canvas.Free;
どっちにしろ Font は Assign しないと駄目だけど・・・・
こういうのをやりたかったのです。
TMemoの文字描画される位置
http://delfusa.main.jp/delfusafloor/technic/technic/040_MemoDrawSize.html
Fontと文字列に応じて
描画サイズを求める事はたびたびあるのですが
このあたり↓の実装をみると
サンプル: "TMemoのキャレット位置を表示"
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00481.html
TFrameMasiMemo.VisibleCountCharHeightWidth
http://www.geocities.co.jp/SiliconValley-Bay/1352/masimemo/FrameMasiMemoUnit.txt
MemoのフォントをForm.Canvas.Fontに設定してから
(しかもバッファまでしたりして)
Form.CanvasにTextHeightさせているので、
もう少しよいコードがないものかと模索してまして。
[Delphi-ML:49950] Re: ComboBoxへ水平スクロールバー
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=049950
こちら↑は、DCとして求めていますね。
GetDCとReleaseDCの概念や
SelectObject GetTextExtentPoint32 もわからなかったので
サイズを求めるためにTBitmapを使ってみました。
FormのFontを使うよりかは、まだよいかなと思ってます。
このあたり↓とか、はGetDCしてReleaseDCしてますが
N.E.SITE - Delphi 工房 - Tips - コンボボックスのリストの幅の調整
http://www.din.or.jp/~egawa-n/delphi/tips/combo_list_width.html
KHE00221さんのコードは
Canvas.Freeで、ReleaseDCと同じ事をしてるんですかしら?
デスクトップに描画 (C Magazine 98年8月号掲載)
http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-050.html
んん?ここ↑だと、Canvasを生成した後にReleaseDCもCanvas.Freeも
しているようですね。
えっと、
var
Canvas : TCanvas;
DC : HDC;
begin
DC := GetDC(Memo1.Handle);
Canvas := TCanvas.Create;
Canvas.Handle := DC;
Canvas.Font.Assign(Memo1.Font);
Canvas.TextOut(0,0,'11111');
Canvas.Free;
ReleaseDC(DC)
end;
このようにReleaseDCは必要ないのでしょうか?
ツイート | ![]() |