TextWidthの値を

解決


Fusa  URL  2008-01-20 05:24:48  No: 29398

こんにちは

以前から、文字列の描画サイズを求めたくて
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で値を取得できる仕組みを
ご存じの方、教えてください。


Fusa  2008-01-20 05:37:15  No: 29399

すいません、慌てて書き込んだら
タイトル途中だし、

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;

ということで、解決で....

お騒がせしました。


KHE00221  2008-01-20 05:45:03  No: 29400

TBITMAP?


KHE00221  2008-01-20 05:46:56  No: 29401

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 しないと駄目だけど・・・・


Fusa  2008-01-20 11:01:22  No: 29402

こういうのをやりたかったのです。

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も
しているようですね。


Fusa  2008-01-20 20:02:51  No: 29403

えっと、

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は必要ないのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加