■64654 / inTopicNo.6) |
Re[3]: 文字を決まった枠内に収めて描画するには? |
□投稿者/ 魔界の仮面弁士 (112回)-(2012/12/13(Thu) 20:56:43)
|
■No64652 (ゆま さん) に返信
> PictureBoxに対して、GDIで描画することはできますでしょうか?
可能ですよ。
先の回答の最後でも、URL を紹介しながら少し触れていますが、
たとえば「TextRenderer クラス」は、コントロールのためのテキストを
表現するために用意された物です。
また、アンマネージの GDI API (TextOutW API など)を使う手法もあります。
(ちなみに、コントロールそのものを描画したいのであれば、
TextBoxRenderer クラス/ControlPaint クラスというものがあります)
なお Label 等では、「UseComapatibleTextRendering プロパティ」にて
GDI+ (Graphics クラス等)によるテキスト描画を用いるか、
GDI (TextRenderer クラス等)によるテキスト描画を用いるかを
切り替えられるようになっています。また、上記設定の規定値を
「Application.SetCompatibleTextRenderingDefault メソッド」で
あらかじめ設定しておくこともできます。
> (GDIは初めて聞く言葉なので、今は理解が浅いです)
GDI : Graphics Device Interface は、16bit 版 Windows の頃から
使われてきた描画命令です。
Win16 API では GDI.DLL、Win32/Win64 では GDI32.DLL が主要ライブラリであり、
たとえば TextOutW API での テキスト描画なども GDI API の一種です。
一方、GDI+ (ジーディーアイプラス)の主要ライブラリは、
GdiPlus.DLL です。.NET においては、GDI+ API をカプセル化して、
System.Drawing.Graphics などから扱えるようになっています。
違いについては、先に紹介した URL を参照してみてください。
> 上記のご説明からGDIでアンチエイリアスをオフにして表示はできますでしょうか?
> テキストボックスにそれらしきプロパティは見つけられませんでした。
できないことも無いですが、そのためにはコントロールパネルにて、
画面のアンチエイリアス設定をオフにする必要があるでしょうから、
OS 全体に影響を与えることになってしまうかと思います。
http://support.microsoft.com/kb/306527/ja
http://windows.microsoft.com/ja-JP/windows7/make-text-easier-to-read-using-cleartype
手元の環境で実際に試してみました。口頭では説明しにくいので画像にしています。
http://www.vb-user.net/junk/replySamples/2012.12.13.20.25/11.png
http://www.vb-user.net/junk/replySamples/2012.12.13.20.25/12.png
http://www.vb-user.net/junk/replySamples/2012.12.13.20.25/21.png
http://www.vb-user.net/junk/replySamples/2012.12.13.20.25/22.png
4 枚画像がありますが、これはコントロールのレンダリング方法を変更したものです。
SetCompatibleTextRenderingDefault が false なら 1x.png、true なら 2x.png。
OS のアンチエイリアス設定を有効にしたままのものが x1.png、無効にしたものが x2.png です。
Graphics クラスのプロパティ設定は、SmoothingMode = None、
TextRenderingHint = ClearTypeGridFit にしています。
描画内容は、赤文字が Graphics.DrawString、黒文字が TextRenderer.DrawText です。
画面構成は、左列が Label、中列が TextBox、右列が PicureBox で、
使用フォントは、
上段:MS ゴシック(日本語) 12Pt … 下記 f1
中段:MingLiU (繁体字) 12Pt … 下記 f2
下段:SimHei (簡体字) 12Pt … 下記 f3
としています。
const byte ANSI_CHARSET = 0; const byte JOHAB_CHARSET = 130;
const byte DEFAULT_CHARSET = 1; const byte HEBREW_CHARSET = 177;
const byte SYMBOL_CHARSET = 2; const byte ARABIC_CHARSET = 178;
const byte SHIFTJIS_CHARSET = 128; const byte GREEK_CHARSET = 161;
const byte HANGEUL_CHARSET = 129; const byte TURKISH_CHARSET = 162;
const byte HANGUL_CHARSET = 129; const byte VIETNAMESE_CHARSET = 163;
const byte GB2312_CHARSET = 134; const byte THAI_CHARSET = 222;
const byte CHINESEBIG5_CHARSET = 136; const byte EASTEUROPE_CHARSET = 238;
const byte OEM_CHARSET = 255; const byte RUSSIAN_CHARSET = 204;
const byte MAC_CHARSET = 77; const byte BALTIC_CHARSET = 186;
Font f1 = new Font("MS ゴシック", 12.0, FontStyle.Regular, GraphicsUnit.Point, SHIFTJIS_CHARSET);
Font f2 = new Font("MingLiU", 12.0, FontStyle.Regular, GraphicsUnit.Point, CHINESEBIG5_CHARSET);
Font f3 = new Font("SimHei", 12.0, FontStyle.Regular, GraphicsUnit.Point, GB2312_CHARSET);
Font f4 = new Font("Consolas", 12.0, FontStyle.Regular, GraphicsUnit.Point, ANSI_CHARSET);
Font f5 = new Font("Marlett", 12.0, FontStyle.Regular, GraphicsUnit.Point, SYMBOL_CHARSET);
Font f6 = new Font("Arial Unicode MS", 12.0, FontStyle.Regular, GraphicsUnit.Point, SHIFTJIS_CHARSET);
Font f6 = new Font("Arial Unicode MS", 12.0, FontStyle.Regular, GraphicsUnit.Point, GB2312_CHARSET);
|
|