梅林日記

雑用系プログラマの趣味とお仕事

目次

Blog 利用状況

ニュース

資格

MCAD OCP

書庫

日記カテゴリ

WM_PAINTを使ったTextBoxのカスタム描画

数日前のえムナウさんのエントリ「TextBoxを自分で描画する」を読みました。

 

TextBoxに入力もしくはデータバインドしたデータを、数値や日付データとして

フォーマットして表示するという機能は以前から必要としておりまして、これまでは

Textプロパティをoverrideするという無理やりな方式を採用していました。

 

できればTextプロパティはそのままで、表示するデータだけを変えるようにしたいと思っていたので

これはいい、と早速試してみたのですが、書いてあるとおりSetStyleやRecreateHandleを記述しても

どうしてもフォーカスがあるときと無いときでフォントの大きさが変わってしまいます。

 

色々調べた結果、WM_PAINTメッセージを捕まえてCreateGraphicsで作成したGraphicsオブジェクトに

文字列の描画を行う方式に落ち着きそうです。


namespace Umebayashi.Framework.Windows.Forms
{
    public partial class UmeTextBox : TextBox
    {
        public UmeTextBox()
        {
            InitializeComponent();
        }

        private const int WM_PAINT = 0x000F;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_PAINT:
                    //フォーカスがある状態ではフォーマットしない
                    if (!Focused)
                    {
                        DrawText();
                    }
                    break;
                default:
                    break;
            }
        }

        private void DrawText()
        {
            TextFormatFlags tff = TextFormatFlags.VerticalCenter;
            switch (this.TextAlign)
            {
                case HorizontalAlignment.Center:
                    tff |= TextFormatFlags.HorizontalCenter;
                    break;
                case HorizontalAlignment.Left:
                    tff |= TextFormatFlags.Left;
                    break;
                case HorizontalAlignment.Right:
                    tff |= TextFormatFlags.Right;
                    break;
            }
            if (this.Multiline)
            {
                tff |= TextFormatFlags.WordBreak;
            }

            using (Graphics g = CreateGraphics())
            using (Brush backBrush = new SolidBrush(this.BackColor))
            {
                //BackColorで背景を塗りつぶす。
                //これをしないとフォーマット前後の文字列がダブって表示される。
                g.FillRectangle(backBrush, this.ClientRectangle);

                DateTime dtVal;
                decimal dcVal;
                if (DateTime.TryParse(this.Text, out dtVal))
                {
                    TextRenderer.DrawText(g, dtVal.ToString("yyyy/MM/dd"),
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
                else if (decimal.TryParse(this.Text, out dcVal))
                {
                    TextRenderer.DrawText(g, dcVal.ToString("#,##0"),
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
                else
                {
                    TextRenderer.DrawText(g, this.Text,
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
            }
        }
    }
}

投稿日時 : 2007年2月15日 0:03

コメントを追加

# TextBoxを自分で描画する2 2007/02/15 10:03 えムナウ Blog

TextBoxを自分で描画する2

# re: WM_PAINTを使ったTextBoxのカスタム描画 2007/06/01 16:42 通りすがりのプログラマ

ありがとうございます。
参考にさせていただきました。

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/05/06 18:32 Teddy

With millions of players playing this game on iPhone, you are sure to have unlimited amounts of fun with Diamond Space - Jewel Dash. http://fun-torrent.ru Create and share your own menus and actions - both for proximity and when the phone rings - using Applescript, key and mouse emulation.

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/07/06 21:55 オースティン


1枚のカードを勉強するときにクラッシュする問題を修正し、オプションをもっと勉強し始めました。 http://getfreegamesplease.usエンターテイメントカンパニーは、世界でも有??数のライセンシングおよびリテールマーチャンダイジング機関の1つです。

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/08/25 6:50 Harry

Integration with Monster Puzzles Export your creations to Monster Puzzles and make them into puzzles.http://finansovye-sistemy.ru/photography/cours-mikroc-pdf.php It is customized only for any apple device like, iPhone iPod and iPad touch.

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/09/22 2:44 Matthew

Import options (file name, size, type, Created date, dimensions, and a custom field).http://nevere.ru/communication/sangeetha-jathi-mullai-song.php It could replace standard Explorer and other file manager.

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/10/18 15:15 Matthew

Simply a must for anyone wanting to improve go further in life:http://downloadtorrentfromsadie.online This will keep earning you revenuedisclaimer - GE Project Solutions and supaf.

# 名前をブラウザに記憶する 2017/10/30 16:54 Harvey

SSuite Fandango Desktop can either be downloaded and used offline.http://downloadsoftwarefromstella.club The story is very cute and easy to follow and the interactive features are diverse and fun.

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/11/10 5:48 Charlie

Set the drumming timer for up to infinity and listen in meditation or while performing everyday tasks.http://downloadtorrentfromnora.online Would you like to control your Pan/Tilt/Zoom device while at work, away on vacation or on business trips.

# re: WM_PAINTを使ったTextBoxのカスタム描画 2017/11/22 6:39 Matthew

Listen to recordings in the background while you use your device.http://getwhatyouneed.gdn It mimics the old desktop-style weather displays and can turn your iPad into a desktop weatherstation or a bedside clock.

# re: Internet Explorer 11 で、右クリックしたときに表示されるメニューで、Bingではなく、Google をデフォルトの検索エンジンとして設定するには? 2017/12/08 18:14 meadc

http://www.nfl-shop.co nfl store
http://www.nike-chaussures.fr/ Air Max TN Homme
http://www.culinar-hannover.de/ Nike Air Force
http://www.pradahandbags.co prada handbags
http://www.burberry-outletsale.us/ burberry outlet sale store
me adc12.8

タイトル  
名前  
URL
コメント