none
TextBoxで表示される描画書式と全く同じ書式でDrawStringでWindowsFormに描画したいのですが RRS feed

  • 質問

  • Painツールのようなアプリケーションを作っています。
    このツールで、任意の文字列を入力し、確定したら、入力した場所に入力したイメージのままで描画しようとしています。
    任意の位置で、任意の文字列を入力させるために、TextBoxコントロールを張り付けて、そこに文字列を入力させ、確定で、
    TextBoxから文字列を取得し、TextBoxにセットしているものと同じフォント使い、TextBoxと同じ位置に、DrawStringで文字列を描画してみました。

    すると、描画開始位置が少しずれます。これは、TextBoxコントロールの基準位置と、実際にコントロール内のEditフィールドの位置にずれがあるためなので、その補正を行うことで改善できます。
    しかし、文字列の各文字間隔などが、DrawStringとTextBoxでは異なるようで、実際にずれます。

    TextBoxの描画の文字間隔の取得方法を探していたのですが見当たらないのですが、教えていただけないでしょうか?

    また、ついでにDrawStringでの文字列描画の文字間隔の指定方法も教えていただけないでしょうか?


    Reiji Tanaka
    2009年6月17日 8:58

回答

すべての返信

  • Graphics.DrawStringメソッドを使用しているのでしょうか?
    調べていて今知ったのですが、TextRenderer.DrawTextメソッド を使用すると良さそうです。
    • 回答としてマーク Reiji 2009年6月18日 7:56
    2009年6月17日 10:02
  • いつも的確なコメントありがとうございます。
    TextRenderer.DrawTextメソッドだと同じ書式で表示できました。

    ただ一つ問題があります。
    フォームで特定の色を透過色として指定して、その色をフォームの背景色に指定し、ほかのアプリケーションが透けて見えるように見せています。

    g.DrawString()で描画した場合は、文字だけがGraphicデバイスに書かれるので文字だけが見えます。
    しかし、TextRenderer.DrawTextの場合は、背景色に、BackColorあるいはTransparentKeyを指定しても、その色が透過せずに見えてしまいます。

    背景色を透過できないのはやはり描画空間が異なるためで、改善は難しいでしょうか?

    Reiji Tanaka
    2009年6月18日 3:35
  • TransparentKeyってなんでしょうか? 紫とかあれかな、と想像しますが、ぐぐってもそれらしきメンバがヒットしませんでした。
    backColor引数のないオーバーロードを使用するか、Color.Transparentを指定すれば何やらやってくれそうです。
    # 試したわけではないのでわかりません。
    2009年6月18日 3:57
  • 自分一人だけ理解している記述で、すみません。
    Formで特定の色を透過色として定義して、その色の部分を透明にしてしまう手法があります。
    この透明色を指定するプロパティが、TransparencyKeyで色を指定します。
    すみません、先ほど、TransparentKeyと書きましたが、TransparencyKeyの誤りでした。


    引き続き調べていましたが、背景が透明にならないのは、リモートデスクトップで表示している場合だけのようでした。
    NateveのPC上では、背景色に、このTransparenctKeyと同じ色を指定すると、背景色が透明にできました。
    ということで、問題は解決できました。

    ありがとうございました。
    Reiji Tanaka
    2009年6月18日 7:55