Formの透過で?

解決


マグ  2005-07-30 20:47:01  No: 123852

開発環境: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のみで、文字は透過させたくないのですが、
どのように記述すればいいのでしょうか?
初心者でどうすればいいか分かりません。

それとも、このような操作は不可能でしょうか?


魔界の仮面弁士  2005-07-31 01:31:44  No: 123853

代わりに、TransparencyKeyにフォームの背景色を指定してみる、とか。

なお、TransparencyKey や Opacity は、Windows 2000以降の
レイヤード ウィンドウ機能を利用しているはずなので、
Layerd Windowの制限を越える表現はできないかと思います。

# 全体を半透明にしつつ、不透明な部分を残したいという事になると、
# 不透明ウィンドウと半透明ウィンドウを重ね合わせて表現する、とか。


マグ  2005-07-31 23:29:48  No: 123854

魔界の仮面弁士さん、ありがとうございます。

>なお、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


ゴミレス  2005-08-01 18:34:28  No: 123855

> > Layerd Windowの制限を越える表現はできないかと思います。
Layered Window、ね。

> 半透明を利用したアルファーブレンドは
アルファブレンドな描画を行いたいなら、DirectDrawをドゾ。

> Windows 2000以降でしかサポートされていないのは把握しています。
どの機能の事だろ? Layered Window? アルファブレンドカーソル?

> でも、完全に透過なら、Wijndows 98以降からサポートされていたような
> 記憶が・・・・・
Region Windowなら 98でも使えるけど・・・あれは透過機能ではなく、
ウィンドウを指定した形状に切り抜く機能。結果は似てるけど、別物だよ。


マグ  2005-08-01 20:37:04  No: 123856

>アルファブレンドな描画を行いたいなら、DirectDrawをドゾ。
そう言われても、DirectX関連は苦手です(TT)・・・・・・
DirectDrawにフォームのみの透明度を調整するような方法って
どうやるのでしょうか?

結果的にここでは、文字を描画させていますが、
実際、使う時はコントロールなども入ってきますので、それにも対応させて
おかないと、後で苦戦しますし・・・・・・・・

>Region Windowなら 98でも使えるけど・・・あれは透過機能ではなく、
>ウィンドウを指定した形状に切り抜く機能。結果は似てるけど、別物だよ。

Widows 98って透過ではなく、切り抜いて表示していたのですか・・・・・
知りませんでした。そして、疑いもしませんでした。

>どの機能の事だろ? Layered Window? アルファブレンドカーソル?

半透明のアルファーブレンド自体です。
Windows 2000、XPでしかサポートされていない機能です。
実際、透過と半透明になるような、仕掛け自体を自分でコーティングすれば、
分かりますが、透過と半透明の仕掛けは桁外れに違い難しさも桁はずれに
難しいです。


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




  


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