DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームの透明化について

環境/言語:[VB2008、VB6、Windows 2000,xp,vista,7]
分類:[.NET]

こんばんは。

フォームの透明化について質問があります。

TransparencyKeyやAPIのsetlayeredwindowattributesを使って、
フォームの一部分を透明化すると、透明というよりかは、
実際には穴が空いてしまっているようになり、消えている感じになると思います。

穴は開けずに、透明にするだけの方法はあるのでしょうか?
分かりにくかったら、すいません。
■No26446に返信(ラルクさんの記事)
> 穴は開けずに、透明にするだけの方法はあるのでしょうか?

全体を透明化するだけであれば、Opacity プロパティを使えば OK です。

一方、一部分だけを透過させたり、グラデーションがかった透明度を設けるなら
UpdateLayeredWindow API を利用する事になります。
http://msdn.microsoft.com/ja-jp/library/cc364847.aspx
■No26447に返信(魔界の仮面弁士さんの記事)
> 一方、一部分だけを透過させたり、グラデーションがかった透明度を設けるなら
> UpdateLayeredWindow API を利用する事になります。
> http://msdn.microsoft.com/ja-jp/library/cc364847.aspx

回答ありがとうございます。

UpdateLayeredWindowを調べてみましたが、まだ初心者なもので、
使い方が分かりません…

どこか他に分かりやすく説明しているページがあればよいのですが。。
特にポインタとサーフェスの意味が分かりません。

また、dwFlagsに指定する定数の値が何なのかも、MSDNライブラリを見ても、
載っていませんが、皆さんはどうやって調べているのでしょうか?
■No26448に返信(ラルクさんの記事)
> UpdateLayeredWindowを調べてみましたが、まだ初心者なもので、
> 使い方が分かりません…
『UpdateLayeredWindow』で Google 検索してみたところ、VB.NET や C# の
サンプルが、国内外で幾つか出回ってはいるようです。
http://www.google.co.jp/codesearch/advanced_code_search?hl=ja

それとも、関数の使い方そのものに不明点があるということでしょうか?

> どこか他に分かりやすく説明しているページがあればよいのですが。。
分かりやすいかどうかは主観によるところが大きいですし、
どこと比較しての「他」なのか分からないので回答しにくいのですが、
たとえば、このあたりに情報がありました。

[レイヤードウィンドウで半透明フォームを実現する] … Visual Basic 2005
http://blogs.wankuma.com/youryella/archive/2007/10/15/102151.aspx

[半通過ウィンドウの作り方講座] … C++
http://www.yoshibaworks.com/Ayacy/INASOFT/wpt/ulw.html

[ピクセル単位で透過設定を持つForm] … C# 1.0 (2002/2003)
http://yellow.ribbon.to/~azumaya/doc_dotnet_uplayeredwnd.php

少し毛色の違う情報として:

[レイヤード ウィンドウ] … Microsoft 技術文書
http://msdn.microsoft.com/ja-jp/library/ms997507.aspx

>> http://msdn.microsoft.com/ja-jp/library/cc364847.aspx
> 特にポインタとサーフェスの意味が分かりません。
たとえば『構造体へのポインタを指定』という部分は、VB.NET では
「Strucutre(構造体) を ByRef で渡す(参照渡し)」と読み替えてください。

『サーフェス』の方は、画像を保持しておく領域の事を指します。
この場合には、画面に表示させる透過画像の事だと思えば良いかと。


> また、dwFlagsに指定する定数の値が何なのかも、MSDNライブラリを見ても、
> 載っていませんが、皆さんはどうやって調べているのでしょうか?
定数の値は、SDK 付属のヘッダーファイルから探します。

たとえば LW_ALPHA の場合には、"WinUser.h" というファイルにて、
        #define ULW_ALPHA               0x00000002
と定義されていますので、VB.NET 的にはこの値が「&H2」であると分かります。


http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html
》 Win32 APIやDLL関数を利用する際に、関数のパラメータとして
》 何らかの定数を指定する場合がある。特にWin32 APIに関しては、
》 それらの定数がプラットフォームSDKに含まれるヘッダ・ファイル
》 (windows.hなど)で定義されているが、C#ではこれらの
》 ヘッダ・ファイルを扱うことができないため、必要に応じて
》 定数を自分で定義しなければならない。
(中略)
》 なお、定数の実際の値を知るには、プラットフォームSDKに含まれる
》 ヘッダ・ファイルを参照する必要がある。
■No26454に返信(魔界の仮面弁士さんの記事)

お忙しいところ、回答ありがとうございます。
丁寧な回答で非常に分かりやすく、助かりました。

一回できるかやってみます。ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板