C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 丸いボタンの背景色


(過去ログ 64 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■36896 / inTopicNo.1)  丸いボタンの背景色
  
□投稿者/ アイスロボ (2回)-(2009/06/09(Tue) 13:52:50)

分類:[.NET 全般] 

現在、Buttonを継承したクラスを作成しています。
(俗に言う、BitmapButtonのようなものです)


BMP画像を読み込み、MakeTransparen()で四隅を透過させて、
ボタンのBackGroundImageに設定しています。
これで問題無く動作しています。

しかし、MouseOver時やMouseDown時に、
OSが勝手に、透過した部分をグレーの色で塗りつぶしてしまします。
きっと、標準の挙動なのでしょうが、これを回避したいと思っています。

MouseOver時は、OnEnter等のイベントを無視するようにしたらなんとかなりましたが、
MouseDownの時だけ回避できず困っております。

どなたかご存じの方いらっしゃいませんか?
引用返信 編集キー/
■36897 / inTopicNo.2)  Re[1]: 丸いボタンの背景色
□投稿者/ オショウ (219回)-(2009/06/09(Tue) 14:35:05)
> しかし、MouseOver時やMouseDown時に、
> OSが勝手に、透過した部分をグレーの色で塗りつぶしてしまします。
> きっと、標準の挙動なのでしょうが、これを回避したいと思っています。

  http://dobon.net/vb/dotnet/form/formregion.html#section6
  これでできませんか?

以上。
引用返信 編集キー/
■36901 / inTopicNo.3)  Re[2]: 丸いボタンの背景色
□投稿者/ アイスロボ (3回)-(2009/06/09(Tue) 18:34:23)
ありがとうございます。

GPATHは矩形を知っていなければならないと思いまして、使っていません。
動的に設定されたBitmapを透過させて、その形にしたいので・・・。


BitmapからGPATHが取れればいいのですが・・・
引用返信 編集キー/
■36902 / inTopicNo.4)  Re[1]: 丸いボタンの背景色
□投稿者/ .SHO (864回)-(2009/06/09(Tue) 18:54:07)
No36896 (アイスロボ さん) に返信

> しかし、MouseOver時やMouseDown時に、
> OSが勝手に、透過した部分をグレーの色で塗りつぶしてしまします。

透過した部分をグレーの色で塗りつぶしてるんじゃなくて
ボタンをグレーにしてるのが透過してるとか。
引用返信 編集キー/
■36903 / inTopicNo.5)  Re[3]: 丸いボタンの背景色
□投稿者/ オショウ (220回)-(2009/06/09(Tue) 19:09:22)
> BitmapからGPATHが取れればいいのですが・・・

  こんなサンプル見つけました。C#ですが・・・
  http://www.codeproject.com/KB/graphics/bmprgnform.aspx

  よいできですネ!〜

参考まで。

以上。

引用返信 編集キー/
■36904 / inTopicNo.6)  Re[4]: 丸いボタンの背景色
□投稿者/ .SHO (865回)-(2009/06/09(Tue) 20:24:26)
No36903 (オショウ さん) に返信

>   こんなサンプル見つけました。C#ですが・・・
>   http://www.codeproject.com/KB/graphics/bmprgnform.aspx
>
>   よいできですネ!〜

いいですネ、これ! 早速使ぉ!

なんで、スマイルの時チラチラするのかと思ったら、スマイルとスマイルの間の隙間が
リージョンで抜けちゃってるんですね。
引用返信 編集キー/
■36905 / inTopicNo.7)  Re[4]: 丸いボタンの背景色
□投稿者/ アイスロボ (4回)-(2009/06/09(Tue) 20:48:05)
No36903 (オショウ さん) に返信
>>BitmapからGPATHが取れればいいのですが・・・
>
>   こんなサンプル見つけました。C#ですが・・・
>   http://www.codeproject.com/KB/graphics/bmprgnform.aspx
>
>   よいできですネ!〜
>
> 参考まで。
>
> 以上。
>

やはり、自前でなんとかするしかなさそうですね。
ありがとうございました。
解決済み
引用返信 編集キー/
■36909 / inTopicNo.8)  Re[5]: 丸いボタンの背景色
□投稿者/ オショウ (221回)-(2009/06/09(Tue) 21:37:35)
> やはり、自前でなんとかするしかなさそうですね。

  あれ?・・・

  BitmapRegion.cs で、渡されたBitmapのGraphicsPathを算出してRegionに
  代入してくれているんで・・・(そのもの)

  自前も何も、そのまま使えますが・・・

※ C# をVBにできない?・・・と言うことですか?
  私は別クラスモジュールに定義してDLLにしたのですが・・・
  下記のコード参考・・・

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

#Region "Public Functions"

    Public Sub CreateControlRegion(ByVal ctrl As Control, ByVal bitmap As Bitmap)

        If ctrl Is Nothing Or bitmap Is Nothing Then
            Exit Sub
        End If

        ctrl.Width = bitmap.Width
        ctrl.Height = bitmap.Height

        If TypeOf (ctrl) Is Form Then
            Dim objForm As System.Windows.Forms.Form = CType(ctrl, System.Windows.Forms.Form)

            With objForm
                .Width += 15
                .Height += 35
                .FormBorderStyle = FormBorderStyle.None
                .BackgroundImage = bitmap
            End With

            Dim gp As GraphicsPath = CalculateControlGraphicsPath(bitmap)

            objForm.Region = New Region(gp)

        ElseIf TypeOf (ctrl) Is Button Then
            Dim btn As Button = CType(ctrl, Button)

            With btn
                .Text = ""
                .Cursor = Cursors.Hand
                .BackgroundImage = bitmap
            End With

            Dim gp As GraphicsPath = CalculateControlGraphicsPath(bitmap)

            btn.Region = New Region(gp)
        End If

    End Sub

#End Region

#Region "Private Functions"

    Private Function CalculateControlGraphicsPath(ByVal bitmap As Bitmap) As GraphicsPath

        Dim gp As GraphicsPath = New GraphicsPath()
        Dim colorTransparent As Color = bitmap.GetPixel(0, 0)
        Dim colOpaquePixel As Integer = 0

        For row As Integer = 0 To bitmap.Height - 1
            colOpaquePixel = 0
            For col As Integer = 0 To bitmap.Width - 1
                If bitmap.GetPixel(col, row) <> colorTransparent Then
                    Dim colNext As Integer = col

                    colOpaquePixel = col

                    For colNext = colOpaquePixel To bitmap.Width - 1
                        If bitmap.GetPixel(colNext, row) = colorTransparent Then
                            Exit For
                        End If
                    Next

                    gp.AddRectangle(New Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1))
                    col = colNext
                End If
            Next
        Next

        Return gp

    End Function

#End Region

で、Bitmapは、リソースファイルに埋め込んで使用するようにしたので・・・

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim asm As System.Reflection.Assembly
        Dim rm As System.Resources.ResourceManager

        asm = System.Reflection.Assembly.GetExecutingAssembly()

        rm = New System.Resources.ResourceManager(asm.GetName().Name + ".Resource1", asm)

        bmpFrmBack = CType(rm.GetObject("back"), Bitmap)
        bmpBob = CType(rm.GetObject("bob"), Bitmap)
        bmpSmiles = CType(rm.GetObject("smiles"), Bitmap)
        bmpGreenBtnUp = CType(rm.GetObject("greenbtnup"), Bitmap)
        bmpX = CType(rm.GetObject("x"), Bitmap)

        bmpBobSay = CType(rm.GetObject("bobsay"), Bitmap)
        bmpSmilesAngry = CType(rm.GetObject("smilesangry"), Bitmap)
        bmpGreenBtnDown = CType(rm.GetObject("greenbtndown"), Bitmap)
        bmpXSmile = CType(rm.GetObject("xsmile"), Bitmap)

        Me.Width = bmpFrmBack.Width
        Me.Height = bmpFrmBack.Height

        Button1.Left = (Me.Width \ 4)
        Button2.Left = (Me.Width \ 4) * 3
        Button3.Left = (Me.Width \ 4) * 2
        Button4.Left = (Me.Width \ 4) * 3

        Button1.Top = (Me.Height \ 4)
        Button2.Top = (Me.Height \ 4)
        Button3.Top = (Me.Height \ 4) * 2
        Button4.Top = (Me.Height \ 4) * 3

        Using br As BitmapRegion.BitmapRegion = New BitmapRegion.BitmapRegion
            With br
                .CreateControlRegion(Me, bmpFrmBack)
                .CreateControlRegion(Button1, bmpBob)
                .CreateControlRegion(Button2, bmpSmiles)
                .CreateControlRegion(Button3, bmpGreenBtnUp)
                .CreateControlRegion(Button4, bmpX)
            End With
        End Using

    End Sub

マウスの操作(MouseEnter/MouseLeave)や、フォームの移動(MouseMove)の部分くらいは
解読してインプリしてネ!

以上。

引用返信 編集キー/
■36918 / inTopicNo.9)  Re[6]: 丸いボタンの背景色
□投稿者/ Azulean (401回)-(2009/06/09(Tue) 23:03:20)
No36909 (オショウ さん) に返信
> > やはり、自前でなんとかするしかなさそうですね。
>   自前も何も、そのまま使えますが・・・
「自前」が指している範囲次第かと。

「自前」とならない範囲が、「標準で用意されているメソッドをいくつか(少数)組み合わせるだけでできること」という場合、
今回提示されたサンプルを流用するとしても、「自前で実現するしかない」という表現になるかもしれません。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -