フォームのグラデーションをバックカラーに設定するには?

解決


  2006-09-26 08:23:09  No: 133392

こんにちは良です。いつもお世話になっております。
今フォームにグラデーションを設定しているんですが
問題が二点あります。

・フォームのグラデーションが起動時イベントで拾えない
(もちろんデザイナーに直接コードを入れても拾えなかったです)
(ボタンクリックイベントでは拾えます)

・フォームのバックカラーにグラデーションが設定されない
(他にも背景を透明にしたラベルなどをつけているのですが
ラベルの背景(バックカラー)にはフォームのデフォルトの
バックカラーが設定されてしまう。

最初からフォームのバックカラーにグラデーションが設定されれば
いいのですが・・・

何か解決方法はないでしょうか?
なにとぞアドバイスのほうよろしくお願いいたします。


  2006-09-26 08:24:11  No: 133393

環境はVB2005
データベースOracle10g
OSWindows  XP  Pro
です。


魔界の仮面弁士  2006-09-26 12:23:27  No: 133394

> ・フォームのグラデーションが起動時イベントで拾えない
グラデーションをイベントで拾う、とはどういう意味でしょうか。
また、起動時イベントとは何ですか? Shown? Load?

>・フォームのバックカラーにグラデーションが設定されない
状況がよくわからないので、もう少し具体的に説明してもらえると助かります。

「設定されない」とは、『Me.BackgroundImage = グラデーション画像』のように
指定しても、グラデーションがかからないという事でしょうか?
また、そもそも現時点では、どのようにしてグラデーションを実現しているのでしょうか?

> ラベルの背景(バックカラー)にはフォームのデフォルトの
> バックカラーが設定されてしまう。

デフォルトのバックカラーとは、デザイン時に指定した色という意味でしょうか。
それとも、SystemColors.Control の事でしょうか。

とりあえず、Label の BackColor を
    Label1.BackColor = Color.FromArgb(&H88FFAA33) '半透明
    Label2.BackColor = Color.Transparent '完全透過
などとして試してみましたが、バックカラーが勝手に書き換わるような状況は
発生しませんでした。現状の具体的なコードを見せてください。

> 環境はVB2005
> データベースOracle10g
> OSWindows  XP  Pro
> です。
データベースが、グラデーションに何か関わっている、ということでしょうか。
関わっているのであれば、その部分のコードに何か問題があったりはしませんか?

------------------------------
Option Strict On
Imports System
Imports System.Windows.Forms
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        DrawGradation()
    End Sub

    Private Sub Form1_ResizeBegin(ByVal sender As Object, ByVal e As EventArgs) Handles Me.ResizeBegin
        ChangeBackgroundImage(Nothing)
    End Sub

    Private Sub Form1_ResizeEnd(ByVal sender As Object, ByVal e As EventArgs) Handles Me.ResizeEnd
        DrawGradation()
    End Sub

    Private Sub ChangeBackgroundImage(ByVal newBmp As Bitmap)
        Dim oldBmp As Image = Me.BackgroundImage
        Me.BackgroundImage = newBmp
        If oldBmp IsNot Nothing Then
            oldBmp.Dispose()
        End If
    End Sub

    Private Sub DrawGradation()
        Dim newBmp As New Bitmap(Me.Width, Me.Height)
        Using g As Graphics = Graphics.FromImage(newBmp), _
             gPath As New GraphicsPath()

            gPath.AddRectangle(New Rectangle(Nothing, newBmp.Size))
            Using gradationBrush As New PathGradientBrush(gPath)
                gradationBrush.CenterColor = Color.White
                gradationBrush.SurroundColors = New Color() { _
                    Color.Red, Color.Green, Color.Yellow, Color.Blue}
                g.FillRectangle(gradationBrush, g.VisibleClipBounds)
            End Using
        End Using
        ChangeBackgroundImage(newBmp)
    End Sub
End Class


  2006-09-26 16:17:38  No: 133395

おはようございます。良です

魔界の仮面弁士様お返事ありがとうございます。
データベースはまったく関係しておりません。

グラデーションは
Dim g as Graphics= Me.Graphics()と宣言して

Drawing2DLinearGradientBrush(フォームのサイズ)と
Grawing2D.Blendを使ってグラデーションを
作成、FillRectAngleで設置しております。

起動時イベントとはFrom_Loadです。

あとはDesiners.vbに直接書き込んだりもしてみました。

設定されないと言うのは
イメージとして

Me.BackColor= 作成したグラデーション

みたいにしたいのです。


  2006-09-26 16:54:41  No: 133396

私の書いたコードはこんな感じです。

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call Graphic() 'ここではイベントが拾えない
    End Sub
    Private Sub Graphic()
        Dim g As Graphics = Me.CreateGraphics

        ''グラデーションを作成
        Dim br As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, Me.Height), _
        Color.CornflowerBlue, Color.White)

        Dim relativeIntensities As Single() = {0, 0.3, 0.5, 0.7, 0.9, 1.0}
        Dim relativePositions As Single() = {0, 0.2, 0.3, 0.5, 0.8, 1.0}
        ''色を塗る比率を調整
        Dim blend As New Drawing2D.Blend
        blend.Factors = relativeIntensities
        blend.Positions = relativePositions

        ''グラデーションで塗りつぶし作業をする
        g.FillRectangle(br, 0, 0, Me.Width, Me.Height)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call Graphic() 'ここでイベントが拾える
    End Sub

デザイナーコード

    'Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使用して変更できます。  
    'コード エディタを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
              '
        'Form1
        '
        Call Graphic() 'ここでも拾えない
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub


  2006-09-26 16:58:20  No: 133397

すみません。コードが間違っていたので書きなおしました。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call Graphic() 'ここではイベントが拾えない
    End Sub
    Private Sub Graphic()
        Dim g As Graphics = Me.CreateGraphics

        ''グラデーションを作成
        Dim br As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, Me.Height), _
        Color.CornflowerBlue, Color.White)

        Dim relativeIntensities As Single() = {0, 0.3, 0.5, 0.7, 0.9, 1.0}
        Dim relativePositions As Single() = {0, 0.2, 0.3, 0.5, 0.8, 1.0}
        ''色を塗る比率を調整
        Dim blend As New Drawing2D.Blend
        blend.Factors = relativeIntensities
        blend.Positions = relativePositions
        br.blend=blend

        ''グラデーションで塗りつぶし作業をする
        g.FillRectangle(br, 0, 0, Me.Width, Me.Height)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call Graphic() 'ここでイベントが拾える
    End Sub

デザイナーコード

    'Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使用して変更できます。  
    'コード エディタを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
              '
        'Form1
        '
        Call Graphic() 'ここでも拾えない
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub


  2006-09-26 17:10:52  No: 133398

すみません、ひとつ質問に答え忘れていました。

>デフォルトのバックカラーとは、デザイン時に指定した色という意味
>でしょうか。
>それとも、SystemColors.Control の事でしょうか。

両方です。つまりはデザイン時に指定した
me.Backcolor=systemcolors.Controlが設定されてしまっている
と言うことです。
あとコントロールはフォームに
紐ついておりますのでコントロールが透明になると
その後ろのフォームの色が適用されてしまう。
多分、フォームの背景の色の上にグラデーションをかけているので
そのグラデーションまで透明になってすり抜けてしまい
一番ベースにあるme.Backcolor=systemcolors.Controlが設定されてしまっていると思います。

だからベースのカラー(me.BackColor)がグラデーションになっていれば
大丈夫ではないのかと思ったのですよ。


魔界の仮面弁士  2006-09-26 19:48:18  No: 133399

> だからベースのカラー(me.BackColor)がグラデーションになっていれば

BackColor にグラデーションは無理だと思いますよ。Color は単色情報ですから。
ですので、BackgroundImage を使う方法を提示した次第です。


通ってみた  2006-09-27 00:40:09  No: 133400

色データと画像データは別
HTMLのBACKCOLORとBACKGROUNDが別なのと同じことでしょう

そもそも「グラデーション」って「何色」って定義になるとお思いですか?


  2006-09-27 09:52:46  No: 133401

こんばんは良です。

>魔界の仮面弁士様

お返事ありがとうございます。
すみません。今までMe.BackColor=背景色
と勝手に思い込んでいました。
バックカラーは単色のときしか設定されないんですね。

>通って見た様

グラデーションは画像データとして処理しないといけないんですね。
色データはあくまで単色のみの設定だったんですね。

魔界の仮面弁士様のコードを少し変えたら自分が思っていたとおりの
動きができました。横方向で2色のグラデーションをかけたかったので
魔界の仮面弁士様にLinearGradientBrushを使って処理したらできました。
本当にありがとうございましたm(__)m


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加