こんにちは良です。いつもお世話になっております。
今フォームにグラデーションを設定しているんですが
問題が二点あります。
・フォームのグラデーションが起動時イベントで拾えない
(もちろんデザイナーに直接コードを入れても拾えなかったです)
(ボタンクリックイベントでは拾えます)
・フォームのバックカラーにグラデーションが設定されない
(他にも背景を透明にしたラベルなどをつけているのですが
ラベルの背景(バックカラー)にはフォームのデフォルトの
バックカラーが設定されてしまう。
最初からフォームのバックカラーにグラデーションが設定されれば
いいのですが・・・
何か解決方法はないでしょうか?
なにとぞアドバイスのほうよろしくお願いいたします。
環境はVB2005
データベースOracle10g
OSWindows XP Pro
です。
> ・フォームのグラデーションが起動時イベントで拾えない
グラデーションをイベントで拾う、とはどういう意味でしょうか。
また、起動時イベントとは何ですか? 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
おはようございます。良です
魔界の仮面弁士様お返事ありがとうございます。
データベースはまったく関係しておりません。
グラデーションは
Dim g as Graphics= Me.Graphics()と宣言して
Drawing2DLinearGradientBrush(フォームのサイズ)と
Grawing2D.Blendを使ってグラデーションを
作成、FillRectAngleで設置しております。
起動時イベントとはFrom_Loadです。
あとはDesiners.vbに直接書き込んだりもしてみました。
設定されないと言うのは
イメージとして
Me.BackColor= 作成したグラデーション
みたいにしたいのです。
私の書いたコードはこんな感じです。
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
すみません。コードが間違っていたので書きなおしました。
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
すみません、ひとつ質問に答え忘れていました。
>デフォルトのバックカラーとは、デザイン時に指定した色という意味
>でしょうか。
>それとも、SystemColors.Control の事でしょうか。
両方です。つまりはデザイン時に指定した
me.Backcolor=systemcolors.Controlが設定されてしまっている
と言うことです。
あとコントロールはフォームに
紐ついておりますのでコントロールが透明になると
その後ろのフォームの色が適用されてしまう。
多分、フォームの背景の色の上にグラデーションをかけているので
そのグラデーションまで透明になってすり抜けてしまい
一番ベースにあるme.Backcolor=systemcolors.Controlが設定されてしまっていると思います。
だからベースのカラー(me.BackColor)がグラデーションになっていれば
大丈夫ではないのかと思ったのですよ。
> だからベースのカラー(me.BackColor)がグラデーションになっていれば
BackColor にグラデーションは無理だと思いますよ。Color は単色情報ですから。
ですので、BackgroundImage を使う方法を提示した次第です。
色データと画像データは別
HTMLのBACKCOLORとBACKGROUNDが別なのと同じことでしょう
そもそも「グラデーション」って「何色」って定義になるとお思いですか?
こんばんは良です。
>魔界の仮面弁士様
お返事ありがとうございます。
すみません。今までMe.BackColor=背景色
と勝手に思い込んでいました。
バックカラーは単色のときしか設定されないんですね。
>通って見た様
グラデーションは画像データとして処理しないといけないんですね。
色データはあくまで単色のみの設定だったんですね。
魔界の仮面弁士様のコードを少し変えたら自分が思っていたとおりの
動きができました。横方向で2色のグラデーションをかけたかったので
魔界の仮面弁士様にLinearGradientBrushを使って処理したらできました。
本当にありがとうございましたm(__)m
ツイート | ![]() |