DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Button.Textの色を一文字ずつ変えたい

環境/言語:[Windows XP C# VisualStudio2010]
分類:[.NET]

Button1のTextにL/Rと設定しています。
この「L/R」を【Lを赤】【/を黒】【Rを青】と
一文字ずつ色を変えたいです。
ひとつ考えていたのが
ユーザーコントロールを作成し、
ボタンの上に3つのラベルを配置し
それぞれの色を変える方法です。

ですが、上記の方法だと
ボタンがラベルの下にあるため
クリックする位置によって
クリックイベントが起きません。
(ラベルの上をクリックするとクリックイベントが起きない)

何か良い方法はありますでしょうか?
よろしくお願いいたします。
■No30249に返信(まおさんの記事)

Textは空文字列にしておく。
FlatStyleはSystem以外にしておく。
Font指定、Brush指定、座標指定は調整してください。

    Private Sub Button1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint
        Dim g = e.Graphics

        g.DrawString("L", Button1.Font, Brushes.Red, New Point(3, 5))
        g.DrawString("/", Button1.Font, Brushes.Black, New Point(13, 5))
        g.DrawString("R", Button1.Font, Brushes.Blue, New Point(23, 5))

    End Sub
■No30250に返信(shuさんの記事)
返信ありがとうございます。
> Textは空文字列にしておく。
> FlatStyleはSystem以外にしておく。
> Font指定、Brush指定、座標指定は調整してください。
> Private Sub Button1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint
> Dim g = e.Graphics
>
> g.DrawString("L", Button1.Font, Brushes.Red, New Point(3, 5))
> g.DrawString("/", Button1.Font, Brushes.Black, New Point(13, 5))
> g.DrawString("R", Button1.Font, Brushes.Blue, New Point(23, 5))
>
> End Sub
上記の方法で出来ました。
ありがとうございました。
解決済み!
■No30249に返信(まおさんの記事)
> 何か良い方法はありますでしょうか?

案1) ボタンの Image プロパティに、文字列を描いた画像を貼り付ける。

案2) 上に置いたラベルの WM_NCHITTEST を上書きして、
 マウス操作を透過するようにする。

public class MaoLabel : Label
{
    protected override void WndProc(ref Message m)
    {
        const int WM_NCHITTEST = 0x84;
        if (m.Msg == WM_NCHITTEST && !DesignMode)
        {
            m.Result = new IntPtr(-1);  //HTTRANSPARENT
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}
■No30252に返信(魔界の仮面弁士さんの記事)
返信ありがとうございます。
> 案1) ボタンの Image プロパティに、文字列を描いた画像を貼り付ける。
>
> 案2) 上に置いたラベルの WM_NCHITTEST を上書きして、
>  マウス操作を透過するようにする。
>
> public class MaoLabel : Label
> {
> protected override void WndProc(ref Message m)
> {
> const int WM_NCHITTEST = 0x84;
> if (m.Msg == WM_NCHITTEST && !DesignMode)
> {
> m.Result = new IntPtr(-1); //HTTRANSPARENT
> }
> else
> {
> base.WndProc(ref m);
> }
> }
> }
なるほど。
こういう方法もあったのですね。
勉強になりました。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板