始めまして。
さっそくですが、フォームの透過処理の仕方がわかりません。
できれば98系・NT系のどちらでも動くようにしたいです。
よろしくお願いします。
いくつかの方法があります。
ひとつは、AlphaBlendというAPIを使うこと。
Windows98からあるAPIだそうで、これを使えば非クライアント領域以外は透明にできるそうです。
ただ、使いかたは分からないです。自分で探してくださいとしか…。
もうひとつは、ウィンドウメッセージで、WM_ERASEBKGNDというメッセージがあって、ここでフォームを書きなおしているようです。
たいして、WM_ICONERASEBKGNDというメッセージもあるんですけど、
これは壁紙を描画するものだそうです(通常はいつ送られるんでしょうね^^;)。
なので、サブクラス化して、WM_ERASEBKGNDのメッセージが送られてきたら、
WM_ICONERASEBKGNDにおきかえてしまうと、フォームの背景のかわりに、壁紙が描画されます。
ただ、これだと画面が動いても再描画されないので、WM_MOVEとかも調べる必要があるとか…。
あとひとつは、おなじくWM_ERASEBKGNDが送られてきたらそれを隠す方法。
(多分真後ろのフォームが見えると思います、多分ですけど…)
あとひとつは、SetWindowRgnなどを使ってリージョンを使い、フォームを見えなくする方法。
(フォーム自体のイベントは発生しなくなります)
あとあと、いったん自分のフォームを消して、真後ろの画像を自分のフォームにコピーするとか。いろいろ方法があります。
SetWindowRgnとかを使う方法が一般的みたいですね、
たしかここのAPIサンプルにもあったと思います。
たかみちえさん。
丁寧なご返答本当にありがとうございます。
フォームの透過の方法はなんとなくわかったのですが、
例えば、フォームに画像を貼り付けて、
その画像の一部分のみ表示をし、後は非表示。
というようなことはできるのでしょうか?
(画像は丸や四角形ではなく、キャラクターのような不規則な形のもの)
よろしくお願いします。
ええと…。その場合はBitBltかStreachBltのAPIで転送します。
またはそんなに早さを必要としないのなら、PaintPictureメソッドでもいいで、
とりあえずそれでフォームに転送して、透過します。
(画像の透過の方法はいろんなところで紹介されてます、
http://homepage1.nifty.com/rabikatsu/
原理まできちんと紹介されてるので、ここの小技集にある説明がおすすめです)
あと、どうやらBeginPath EndPath という、
BeginからEndまでの描画をそのままリージョンにかえてしまうという
面白いAPIがあると聞いたことがあります。
(チェッカーで調べてみると、Windows95からあったとか)
フォームの形を画像に合わせたいのなら、
BeginPathを使ってからEndPathを使うまでのあいだで、
BitBlt(PaintPictureメソッドではこの場合無理かも)とかで転送して、
それで得たリージョンにフォームを合わせてみてください。
BeginPathについてはここで取り上げられてました。
http://www8.plala.or.jp/myna/prog/winapiw.html
なんだかでも、知ってる人は知ってるAPIなんでしょうかねぇ…。
すみません。
質問の仕方が悪かったです。
うまく説明できないんですけど、
例えばこのサイトの下にイルカの絵がありますよね?
そのイルカの部分のみのフォームを作成したいんですが、
今回の方法ですと水の部分まで表示されてしまいます。
(画像を透過すれば見えないようにはなるんですが、四角部分が残ってしまいます)
なんとかなるのでしょうか?
何度もすみませんが、よろしくお願いします。
色々調べてみた結果、たかみちえさんが教えてくださった情報でこと足りていたことがやっとわかりました。
リージョンなどの画像の基本の部分すらわかっていなかったので・・・
でも今回のことですごくよくわかりました。
(結局1ピクセルずつ読み込む方法にしました)
返信が遅れてすみませんでした。
たかみちえさん、本当にありがとうございましたー。