ページ 11

C++ 図形透明

Posted: 2008年9月08日(月) 09:21
by abc
C++6.0での質問です。
タイトルのとおりなんですが、たとえば数字の六を書きその上に円を書いてアクティブになっているように見せたい時円を透明にして下の六を透かしたいのですが、どのような方法があるのでしょう?
ちなみに円はEllipse関数を使っています。
よろしくお願いします。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 10:02
by バグ
開発環境はVC++6.0みたいですが、MFCですか?

Re:C++ 図形透明

Posted: 2008年9月08日(月) 10:24
by abc
> 開発環境はVC++6.0みたいですが、MFCですか?

そうです。MFC AppWizard(exe) のダイアログベースです。
よろしくお願いします。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 10:42
by バグ
例えば…ですが。

1:画面を一旦クリアする。(今回の場合は数字の6を描画する)
2:1の画像の上に描画したい画像(今回の場合は円)のマスク画像を用意する(背景…黒、円…RGB(0x88, 0x88, 0x88)くらい?)
3:Bitblt関数で1と2の論理和(SRCPAINT)で転送する
4:Bitblt関数で3の画像と描画したい画像(背景…白)を論理積(SRCAND)で転送する

これで透過できるはずです。
透過率の調整は2のマスク画像の円の部分の色を調整してやればできると思います。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 10:53
by abc
ありがとうございます。
バグさんのを参考にやってみます。
ちょっと難しそうですが(ーー)がんばってみます。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 12:12
by バグ
私の方が勘違いしていたらいけないので、確認です。
テスト的な簡単なものを組んでみたのですが、こういう事でよかったんでしょうか?(画像参照)

青い丸がマウスカーソルの位置に、RGB(0x00, 0x00, 0xFF)の色で描画されています。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 12:50
by ま~く
たぶんやりたいことは、ブラシを透明ブラシにすれば出来ると思いますよ。

・CreateBrushIndirectでlbStyleをBS_NULLにするとか。
・GetStockObjectでHOLLOW_BRUSHを取得するとか。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 13:03
by バグ
あら?ひょっとして、かなり的外れな回答してしまったのでしょうか…?(^_^;)

Re:C++ 図形透明

Posted: 2008年9月08日(月) 13:08
by ま~く
>バグさん
どうでしょう?^^;
ぼくも勘違いしちゃったかな??

Re:C++ 図形透明

Posted: 2008年9月08日(月) 13:34
by バグ
>>タイトルのとおりなんですが、たとえば数字の六を書きその上に円を書いてアクティブになっているように見せたい時円を透明にして下の六を透かしたいのですが、どのような方法があるのでしょう?

よくよく質問を見返してみると…私が勘違いしているっぽいですね(^_^;)

ひょっとして、質問者さんは丸いボタンコントロールのようなものを作成したいのでしょうか?

Re:C++ 図形透明

Posted: 2008年9月08日(月) 14:02
by abc
いやバグさんのやり方であっています。
あのですね失礼かも知れないのですが、作られていたソースをいただけないでしょうか?
こちらのソースを公開することができないので、理不尽なんですが、できたらお願いします。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 14:09
by abc
簡単な例として、時計の短い針の指す先が12時だとすると、12に円をのせアクティブになっているように見せるような感じにしたいです。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 14:36
by バグ
ソースを渡すのは構いませんが、その前に分からない部分を明らかにしておいた方がよくないですか?
私が書き込みした1~4の手順は試してみました?
もし、分からないのであれば、どの段階でつまづいていますか?

Re:C++ 図形透明

Posted: 2008年9月08日(月) 14:59
by abc
少し気になったんですが、画像でなくてもできますよね?
図でも?

Re:C++ 図形透明

Posted: 2008年9月08日(月) 15:04
by abc
円とかは、ビットマップでもっていなくて、Ellipseや文字の6とかを使っています。
Bitblt関数について少し調べたら画像処理に使うようなことが書いてあったんで、

Re:C++ 図形透明

Posted: 2008年9月08日(月) 15:41
by バグ
はい、最初にEllipse関数を使用していると書かれていましたので、おそらくCDCクラスのEllipse関数だろうと思い、毎回デバイスコンテキストを取得して描画しなおしています。

私の方法では、メモリ上にビットマップを何枚か用意して、それらを重ね合わせる事で描画しています。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 16:12
by abc
なるほど画面をメモリにおいて、Bitblt関数で重ねるんですね。
わかりました!だいたいわかったのでやってみます。

とりあえず解決にさせていただきます。
もしつまずいたらもう一度たずねるかもしれません。
バグさんどうもありがとうございました。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 16:16
by バグ
解決したようで何よりです(^-^)
おそらくダブルバッファリングが必要になると思いますので、そちらもググってみるとよいかもしれません。

Re:C++ 図形透明

Posted: 2008年9月08日(月) 16:48
by abc
ありがとうございます(^^)
リングバッファはやった事がありますが、ダブルバッファリング調べてみます><
ありがとうございました。