開発環境:VB.NET 2003 + Windows XP Pro
動作環境:VB.NET 2003 + Windows XP Pro
題名の通りなのですが、
Formを透過して、文字を透過させたくはないのですが、
どうしても出来ません(TT)
試した内容ですが、
FormのOpacityを50%に設定し、Labelに文字を記述したのですが、
文字まで透過されてしまいます。
次にDrawStringで描画させても、透過されてしまい、
Brushを
Dim burasi As Brush = Nothing
burasi = New SolidBrush(Color.FromArgb(255, 0, 0, 0))
のようにアルファーブレンドを設定しても、透過されてしまいます。
透過させるのは、Formのみで、文字は透過させたくないのですが、
どのように記述すればいいのでしょうか?
初心者でどうすればいいか分かりません。
それとも、このような操作は不可能でしょうか?
代わりに、TransparencyKeyにフォームの背景色を指定してみる、とか。
なお、TransparencyKey や Opacity は、Windows 2000以降の
レイヤード ウィンドウ機能を利用しているはずなので、
Layerd Windowの制限を越える表現はできないかと思います。
# 全体を半透明にしつつ、不透明な部分を残したいという事になると、
# 不透明ウィンドウと半透明ウィンドウを重ね合わせて表現する、とか。
魔界の仮面弁士さん、ありがとうございます。
>なお、TransparencyKey や Opacity は、Windows 2000以降の
>レイヤード ウィンドウ機能を利用しているはずなので、
>Layerd Windowの制限を越える表現はできないかと思います。
それは知っています。
半透明を利用したアルファーブレンドはWindows 2000以降でしか
サポートされていないのは把握しています。
でも、完全に透過なら、Wijndows 98以降からサポートされていたような
記憶が・・・・・
ソフトをフリーで配布するときに推奨環境にWindows2000以降と
書いておけば、問題ないですし・・・・・
># 全体を半透明にしつつ、不透明な部分を残したいという事になると、
># 不透明ウィンドウと半透明ウィンドウを重ね合わせて表現する、とか。
やっぱり、不可能なんですね。
なかなか、このようなアイデアが思いつかなかったです。
ソースは下に記載します。
でも、ContextMenuを使う場合、コーティングが、大変なことになりますが・・・・・・・
'Form2を1つ追加してください。
'---------------------------モジュール-----------------------------
Module ReForm
'ウィンドウの大きさ
Public FW As Integer
Public FH As Integer
'枠の大きさ
Public TW As Integer
'タスクバーの高さ
Public TH As Integer
'フォームの背景色
Public FormColor As Color
End Module
'--------------------------Form1のClass-----------------------------
Dim frm2 As Form2 = Nothing
Dim kiroku As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
kiroku = Me.FormBorderStyle
Me.FormBorderStyle = FormBorderStyle.None
FW = Me.Width
FH = Me.Height
Me.FormBorderStyle = kiroku
TW = (Me.Width - FW) / 2
TH = Me.Height - (FH + TW)
FormColor = Me.BackColor
frm2 = New Form2
frm2.Owner = Me
frm2.Show()
frm2.Top = Me.Top + TH
frm2.Left = Me.Left + TW
Call Draw(frm2)
End Sub
Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move
If Not frm2 Is Nothing Then
frm2.Top = Me.Top + TH
frm2.Left = Me.Left + TW
End If
End Sub
Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
If Not frm2 Is Nothing Then
With frm2
.Close()
.Dispose()
End With
frm2 = Nothing
End If
End Sub
'------------------------------------モジュール-----------------------------------------
Module byouga
Public Sub Draw(ByVal Form As Form)
'文字を描画する
Dim g As Graphics = Nothing
Dim burasi As Brush = Nothing
g = Form.CreateGraphics
burasi = New SolidBrush(Color.FromArgb(0, 0, 0))
g.DrawString("Test", Form.Font, burasi, 50, 50)
If Not burasi Is Nothing Then
burasi.Dispose()
burasi = Nothing
End If
If Not g Is Nothing Then
g.Dispose()
g = Nothing
End If
End Sub
End Module
'-------------------------------Form2のClass---------------------------------------------
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.FormBorderStyle = FormBorderStyle.None
Me.Size = New Size(FW, FH)
Me.BackColor = FormColor
Me.ShowInTaskbar = False
'透明を指定する
Me.TransparencyKey = Me.BackColor
End Sub
> > Layerd Windowの制限を越える表現はできないかと思います。
Layered Window、ね。
> 半透明を利用したアルファーブレンドは
アルファブレンドな描画を行いたいなら、DirectDrawをドゾ。
> Windows 2000以降でしかサポートされていないのは把握しています。
どの機能の事だろ? Layered Window? アルファブレンドカーソル?
> でも、完全に透過なら、Wijndows 98以降からサポートされていたような
> 記憶が・・・・・
Region Windowなら 98でも使えるけど・・・あれは透過機能ではなく、
ウィンドウを指定した形状に切り抜く機能。結果は似てるけど、別物だよ。
>アルファブレンドな描画を行いたいなら、DirectDrawをドゾ。
そう言われても、DirectX関連は苦手です(TT)・・・・・・
DirectDrawにフォームのみの透明度を調整するような方法って
どうやるのでしょうか?
結果的にここでは、文字を描画させていますが、
実際、使う時はコントロールなども入ってきますので、それにも対応させて
おかないと、後で苦戦しますし・・・・・・・・
>Region Windowなら 98でも使えるけど・・・あれは透過機能ではなく、
>ウィンドウを指定した形状に切り抜く機能。結果は似てるけど、別物だよ。
Widows 98って透過ではなく、切り抜いて表示していたのですか・・・・・
知りませんでした。そして、疑いもしませんでした。
>どの機能の事だろ? Layered Window? アルファブレンドカーソル?
半透明のアルファーブレンド自体です。
Windows 2000、XPでしかサポートされていない機能です。
実際、透過と半透明になるような、仕掛け自体を自分でコーティングすれば、
分かりますが、透過と半透明の仕掛けは桁外れに違い難しさも桁はずれに
難しいです。
ツイート | ![]() |