■ ビットマップでスキン処理する方法は?

[Visual C++ Q & A 掲示板] [過去ログの一覧]


ぴょぴょ 2007/12/07(金) 12:33:34 <初心者>
またお世話になります。

いまボタン、スタティック、その他のコントロールをオーナードローして
見た目のデザインを外部のビットマップ(ファイル)より変更可能な仕組みを
試しています。一応の描画はできるようになりましたが、ボタンの形が円形の
場合は外周を背景色で塗りつぶしています。

ここで質問です。
ボタンの形が円形などの図形の場合、外周を背景色に合わせて塗りつぶした
ビットマップを用意するのではなく、透明色を設定して描画時に重ね合わせ
処理をしたいです。どのようにすれば良いでしょうか?

過去ログを検索して次の質問を参考にしました。
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200602/06020006.txt
その後に MSDN サイトより AlphaBlend、MaskBlt、TransparentBlt を見つけました。
でも Windows 95、98 で利用できないようです。開発環境は Windows XP Home SP2 ですが
Windows 9x 系でも正しくスキン処理できるようにしたいです。

BitBlt でラスタオペレーションを工夫すれば出来るのでしょうか?
どのようにすれば良いでしょうか?
よろしくお願い致します。

keichan 2007/12/07(金) 13:12:24
http://www.ksky.ne.jp/~seahorse/libgw/
こちらの方を参考にされては如何でしょうか。

ぴょぴょ 2007/12/07(金) 13:34:28 <初心者>
> こちらの方を参考にされては如何でしょうか。
読んでみました。

感想はウインドウ全体の透明/半透明の実現でした。
子ウインドウ(コントロール)の外周だけを透明にするためではないようです。
残念です。でもソースコードがダウンロードできるみたいです。

親ウインドウと子ウインドウの関係で透明処理する方法があればいいのですが…。
また何か見つけたら紹介して下さい。

シャノン 2007/12/10(月) 01:09:03 <常連>
ビットマップからリージョンを作るとか。

wclrp ( 'o') 2007/12/10(月) 07:34:57
元ビットマップから透明不透明を白黒にしたmaskビットマップと
元ビットマップの透明にしたい部分を黒にしたorビットマップ
をつくりラスタオペレーションを使えばできるよ。

maskビットマップをandで描画すれば不透明部分が黒で描画され
その後orビットマップをorで描画すれば
って
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200602/06020006.txt
にも説明されてるじゃん。

一旦黒で消すからちらつくね(推測)。
メモリ上で背景描画+maskビットマップ+orビットマップって思ったが
ボタンコントロールが形状の外側の背景描画するのは担当外だな。

俺も賛成。
ビットマップからリージョンを作りクリッピングするのがイイネ。

ぴょぴょ 2007/12/13(木) 09:39:57 <初心者>
[[解決]]

> ビットマップからリージョンを作るとか。
いろいろと調べてみました。
リージョンは初めてなのでまた次の機会に使ってみようと思います。

> 元ビットマップから透明不透明を白黒にしたmaskビットマップと
> 元ビットマップの透明にしたい部分を黒にしたorビットマップ
> をつくりラスタオペレーションを使えばできるよ。
http://www3.pf-x.net/~chopper/home2/WinAPI/WinGDI17.html
このリンクを参考に作ってみます。

> 俺も賛成。
> ビットマップからリージョンを作りクリッピングするのがイイネ。
リージョンの方が効率がいいのでしょうか?

お二人さんのアドバイスとても参考になりました。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library