tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルAcceptButtonについて
記事No8681
投稿日: 2009/02/02(Mon) 13:29
投稿者Kujisat
VB2005 WindowsXP

何時も何かある度、こちらにお世話になっております。
さて、当方現在Forms.Buttonを継承したカスタムコントロールを作成しています。
(OnPaintをオーバーライドした、ビジュアルを変更したコントロールです)

ある程度まで完成系で実装でき、フォームに貼り付けて問題なく動作していました。
で、フォームのプロパティ設定でAcceptButtonを設定したところ、
デフォルトボタンとして外枠(恐らく1ピクセル分)がForeColor設定で
表示されてしまいます。

ShowFocusCuesをオーバーライドし、通常の選択枠は非表示としていますが、
デフォルトボタン設定の外枠は解除できないものでしょうか?

WndProcで解除も考えましたが、何せメッセージの種類が判別できないと
フックすることもままなりません。

ご存知の方がおられましたら、ご教授願います。

[ツリー表示へ]
タイトルRe: AcceptButtonについて
記事No8695
投稿日: 2009/02/03(Tue) 16:37
投稿者Abyss
>(OnPaintをオーバーライドした、ビジュアルを変更したコントロールです)

カスタムボタンを作ることなら、
ボタンの外見まで自作すればよいかと思います。
(Focusの時のフラグを無視)

ButtonRenderer ClassのDrawButtonメソッドを利用すれば
いいんじゃないかな。

[ツリー表示へ]
タイトルRe^2: AcceptButtonについて
記事No8696
投稿日: 2009/02/03(Tue) 18:00
投稿者Kujisat
ご回答ありがとうございます。

当方のカスタムコントロールは、完全に外見までを自作しており、
ほとんどの描画をSystem.Drawing.Graphicsに対してあの手この手で行っています。

しかし、その描画は基本的に「角丸系のボタン(実施には楕円)」としており
余白となる部分については、背景を描画せずに透かしております。
この透かしている部分に四角いAcceptButtonの強調表示がされる次第です。


実質の動作上は一切問題ないのですが、「角丸系のボタン」に四角い枠・・・という
ちょっと不格好な見た目になってしまったが故に、解決策を模索しておりました。

そろそろ、「仕様」っとして諦めようかとも考えておりますが、外見にこだわったが
ために、なかなか諦め切れないのが本心です。

以上、よろしくお願いします。

PS:自分自身諦めましたら、こちらに報告させてもらいます。

[ツリー表示へ]
タイトルRe^3: AcceptButtonについて
記事No8700
投稿日: 2009/02/04(Wed) 15:20
投稿者Abyss
> 「仕様」として諦め。。。

ベースのOnPaintイベントを継承する限り、仕様としての動作では?
なので

  MyBase.OnPaint(pevent)

部分はコメントアウトするべきだと思います。その代わり
ご自分で外枠を書くことです。

[ツリー表示へ]
タイトルRe^4: AcceptButtonについて
記事No8706
投稿日: 2009/02/04(Wed) 20:19
投稿者Kujisat
早速試してみましたが、やはり「仕様」のようですね。

OnPaintイベント上の、MyBase.OnPaintをコメントアウトすると、
見事に強調表示の枠線は消えました。

ただ、残念ながら角丸の背景に当たる部分の透かしについても
MyBase.OnPaintで描画する仕様のようで、
 「枠線を消す」 と 「透かしの部分を捨てる」
を天秤にかけると、「仕様」として諦めざるを得ないと判断しました。

Abyss様、コメントありがとうございました。


PS:Regionなどで描画エリアをクリップすることも考えましたが、
  今後の検討課題とさせてもらいます。

[ツリー表示へ]
タイトルRe^5: AcceptButtonについて
記事No8708
投稿日: 2009/02/04(Wed) 21:54
投稿者Abyss
簡単ではないですが、一応自分で
テスト用で作ってみた部品をUpします。
一部だけですが。

Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Drawing.Drawing2D

Public Class MyButton
    Inherits Button

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim LineWeight As Integer
        Dim grfx As Graphics = e.Graphics
        Dim rect As Rectangle = ClientRectangle
        Dim Br As Brush
        Dim PgBr As PathGradientBrush
        Dim Pn As Pen
        Dim path As New GraphicsPath()

        'MyBase.OnPaint(e)

        grfx.SmoothingMode = SmoothingMode.AntiAlias
        '    :
        path.AddEllipse(rect)
        '    :
        PgBr = New PathGradientBrush(path)
        '    :
        '    :
        ' ボタンの表面 ...
        PgBr.SurroundColors = New Color() {SystemColors.ControlDark}
        grfx.FillRectangle(PgBr, rect)

        ' ボタンの外枠 ...
        Br = New SolidBrush(SystemColors.ControlDarkDark)

        If IsDefault Then
            LineWeight = 4
        Else
            LineWeight = 2
        End If

        Pn = New Pen(Br, grfx.DpiX / 72 * LineWeight)
        grfx.DrawEllipse(Pn, rect)

        ' 念のため ...
        Region = New Region(path)

    End Sub
End Class

[ツリー表示へ]
タイトルRe^6: AcceptButtonについて
記事No8709
投稿日: 2009/02/04(Wed) 23:36
投稿者Kujisat
Abyss様、サンプルソースコード、ありがとうございます。


実はちょっと自分自身関心してしまったのですが、概ね自分も同じような
ソースコードを書いています。
やはりポイントはRegionのようです。

Abyss様のソースコードの
> Region = New Region(path)

をコメントアウトするだけで、コントロールを複数フォームに配置した場合、
透かしているエリアが想定外の動作をしており、Regionの必要性を強く感じました。



先ほどの投稿で「検討課題」と書かせてもらいましたが、自分が作成している
カスタムコントロールでは、外枠にボカシおよび透かしの効果を出すために
アルファブレンドで半透明色を利用しています。
このため、Regionでサイズを固定できない事情があります。


ソースコードまでご提供いただきまして、感謝しております。
ですが、今回については今後の検討課題とさせていただきますね。

それでは、失礼いたします。

[ツリー表示へ]