フォームの透明化や半透明化についてはやり方はわかるのですが、
フォームは半透明だけど、その他の部品(例えばテキストボックスやボタン)などは通常に表示したい(半透明化したくない)のですが、そういうことは可能ですか?
透明化や半透明化というのはSetLayeredWindowAttributesやUpdateLayeredWindowのことですよね?
そうなりますと
これらは子ウインドウも同時に透明、半透明にしてしまうようですので
難しいかと思われます
AlphaBlendなどを使用してやってみる・・・
う〜む、無理かなぁ
Win2K以降ですが、可能です。
SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。
これを利用して、
フォームのBackColorと、
ボタン等のコントロールのBackColorを異なる色に設定すれば。。。
横から済みません。自分も知りたかった事なので。
> SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。
カラーキー指定の場合「指定色の透明化」はできても、「指定色の半透明化」はできないと思っていました。
LWA_COLORKEY と LWA_ALPHA を両方同時に指定しても、「指定色が透明化され、残りは半透明化」されるだけみたいなので、最初の質問のように「全体は半透明、一部だけ不透明」は出来ないように思っていたのですが、何か設定があるのでしょうか?
> フォームのBackColorと、
> ボタン等のコントロールのBackColorを異なる色に設定すれば。。。
できれば、具体的な設定方法を教えてもらえると嬉しいです。
>SetLayeredWindowAttributesで、指定の色の部分のみ透明化できます。
自分も具体的な方法(サンプルソース)が見たいです。
よろしくお願いします。
あ、半透明化ですか。。。
失礼しました、「指定色の半透明化」の方法はわかりません。
このページあたり参考になりますでしょうか?
http://www.alato.ne.jp/kazu-/vb/tip22.htm
できました。
コントロール以外透明なフォームと、半透明なフォームが作れるんだから、
半透明なフォームの上にコントロール以外透明なフォームを重ねればOKです。
普段はソース載せないんだけど。。。
'*****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
連投スマソ。
Form2のShowInTaskbarをFalseにしとく事も忘れないように。。。
またまた、連投。。。
#っていうか、例外処理にばかり力が入ってる。。。
'*****Form2*****
'クリック対応
Private Sub Form_Click()
Form1.ZOrder
End Sub
'ダブルクリック対応
Private Sub Form_DblClick()
Form1.ZOrder
End Sub
>ぴろあきさん
なるほど〜。
Formを2つ使うことで実現させることが出来るんですね。
そういう発想が浮かばなかった。さすがです。
これを参考にしてちょっと頑張ってみようと思います。
ツイート | ![]() |