透明化処理について


のびたとか言うな  2004-04-23 17:25:13  No: 83116

フォームの透明化や半透明化についてはやり方はわかるのですが、
フォームは半透明だけど、その他の部品(例えばテキストボックスやボタン)などは通常に表示したい(半透明化したくない)のですが、そういうことは可能ですか?


kara  2004-04-27 01:48:09  No: 83117

透明化や半透明化というのはSetLayeredWindowAttributesやUpdateLayeredWindowのことですよね?

そうなりますと
これらは子ウインドウも同時に透明、半透明にしてしまうようですので
難しいかと思われます

AlphaBlendなどを使用してやってみる・・・
う〜む、無理かなぁ


ぴろあき  2004-05-07 01:41:22  No: 83118

Win2K以降ですが、可能です。

SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。
これを利用して、
フォームのBackColorと、
ボタン等のコントロールのBackColorを異なる色に設定すれば。。。


レイヤード  2004-05-07 02:05:30  No: 83119

横から済みません。自分も知りたかった事なので。

> SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。
カラーキー指定の場合「指定色の透明化」はできても、「指定色の半透明化」はできないと思っていました。

LWA_COLORKEY と LWA_ALPHA を両方同時に指定しても、「指定色が透明化され、残りは半透明化」されるだけみたいなので、最初の質問のように「全体は半透明、一部だけ不透明」は出来ないように思っていたのですが、何か設定があるのでしょうか?

> フォームのBackColorと、
> ボタン等のコントロールのBackColorを異なる色に設定すれば。。。
できれば、具体的な設定方法を教えてもらえると嬉しいです。


のびたとか言うな  2004-05-07 07:20:24  No: 83120

>SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。

自分も具体的な方法(サンプルソース)が見たいです。
よろしくお願いします。


ぴろあき  2004-05-07 22:10:49  No: 83121

あ、半透明化ですか。。。
失礼しました、「指定色の半透明化」の方法はわかりません。


ポテチ  2004-05-07 22:53:42  No: 83122

このページあたり参考になりますでしょうか?

http://www.alato.ne.jp/kazu-/vb/tip22.htm


ぴろあき  2004-05-08 00:07:38  No: 83123

できました。

コントロール以外透明なフォームと、半透明なフォームが作れるんだから、
半透明なフォームの上にコントロール以外透明なフォームを重ねればOKです。


ぴろあき  2004-05-08 00:53:26  No: 83124

普段はソース載せないんだけど。。。

'*****Form1*****
Private Sub Form_Load()
    Dim nIndex As Long
    Me.BackColor = vbRed
    '赤色のみ透明
    nIndex = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
    dmy = SetWindowLong(Me.hwnd, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)
    dmy = SetLayeredWindowAttributes(Me.hwnd, ByVal vbRed, ByVal 0&, LWA_COLORKEY)
    'フォームの移動イベントを取得
    oad = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    Form2.Show
    Form2.Caption = Me.Caption
End Sub
'サブクラス化解除
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    dmy = SetWindowLong(Me.hwnd, GWL_WNDPROC, oad)
End Sub
'リサイズ対応
Private Sub Form_Resize()
    Form2.Move Left, Top, Width, Height
End Sub
'アンロード対応
Private Sub Form_Unload(Cancel As Integer)
    Unload Form2
End Sub
'*****Form2*****
Private Sub Form_Load()
    Dim nIndex As Long
    '半透明
    nIndex = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
    dmy = SetWindowLong(Me.hwnd, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)
    dmy = SetLayeredWindowAttributes(Me.hwnd, ByVal 0&, ByVal 150&, LWA_ALPHA)
End Sub
'アンロード対応
Private Sub Form_Unload(Cancel As Integer)
    Unload Form1
End Sub
'*****Module*****
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd&, ByVal nIndex&, ByVal dwNewLong&) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd&, ByVal nIndex&) As Long
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd&, ByVal crKey&, ByVal bAlpha&, ByVal dwFlags&) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal PWF&, ByVal hwnd&, ByVal Msg&, ByVal wParam&, ByVal lParam As Long) As Long
Public Const WS_EX_LAYERED = &H80000
Public Const LWA_COLORKEY = &H1
Public Const LWA_ALPHA = &H2
Public Const GWL_EXSTYLE = (-20)
Public Const GWL_WNDPROC = (-4)
Public dmy&
Public oad&
Public Const WM_MOVE = &H3 
'フォーム移動対応
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_MOVE Then
        With Form1
            Form2.Move .Left, .Top, .Width, .Height
        End With
    End If
    WindowProc = CallWindowProc(oad, hwnd, uMsg, wParam, lParam)
End Function


ぴろあき  2004-05-08 00:59:37  No: 83125

連投スマソ。
Form2のShowInTaskbarをFalseにしとく事も忘れないように。。。


ぴろあき  2004-05-08 01:22:54  No: 83126

またまた、連投。。。
#っていうか、例外処理にばかり力が入ってる。。。

'*****Form2*****
'クリック対応
Private Sub Form_Click()
    Form1.ZOrder
End Sub
'ダブルクリック対応
Private Sub Form_DblClick()
    Form1.ZOrder
End Sub


のびたとか言うな  2004-05-08 04:58:06  No: 83127

>ぴろあきさん

なるほど〜。
Formを2つ使うことで実現させることが出来るんですね。
そういう発想が浮かばなかった。さすがです。
これを参考にしてちょっと頑張ってみようと思います。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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