お世話になっております
Visual Studio 2005 XP/Vista MFC環境で開発しています。
CStaticを継承した自前のクラスのOnPaintで自前の背景画像(24Bit BMP)を表示しています。このBMPの上に透過値を持つ小さいPNGを描画したいです。
CImage::AlphaBlendを使えばひゃらっと出来たりしないかしら、と淡い期待を寄せて使ってみたのですが、画像は表示される物の、透過部分が透過になってたりならなかったりという状態です。
ご指南頂けないでしょうか。
MyStatic::OnPaint()
{
// 背景BMPをdcで描画..
//
CDC* pDC = GetDC();
CDC cDC;
CImage Img;
CBitmap Bmp;
CBitmap* oldBmp;
SIZE Size;
Img.Load( _T( "mark.png" ) );
Size.cx = Img.GetWidth();
Size.cy = Img.GetHeight();
cDC.CreateCompatibleDC( pDC );
Bmp.CreateCompatibleBitmap( pDC, Size.cx, Size.cy );
oldBmp = cDC.SelectObject( &Bmp );
Img.AlphaBlend( pDC->GetSafeHdc(), 0, 0, Size.cx, Size.cy, 0, 0, Size.cx, Size.cy );
Img.Destroy();
cDC.SelectObject( oldBmp );
Bmp.DeleteObject();
cDC.DeleteDC();
}
あ、便宜上OnPaintでファイルのロードを書いてますが、追い出します。
AlphaBlendって半透明っぽい効果をだすものでは?
透過色はまた別の話な気がしますよ。
http://f1.aaa.livedoor.jp/~zahyou/cgame/auto_sprite.htm
透過色による透過ではなく、
ピクセルごとのα値設定による透過だからAlphaBlendで問題ないかと
>透過部分が透過になってたりならなかったりという状態です。
ここんところ、どういう条件変更したのかかかれてないし
もしかすると、条件変更なしで、起動もしくはOnPaintが呼ばれるたびに
結果がかわる・・・なんてことなのかもしれないけど
とりあえず私の経験上ですが
だいたい4×4以下の画像は透過しなかったです
そださん、Rinさん有難うございます。
結局、AlphaBlend関数を用いずにBYTEバッファに読んでPixel単位で透過処理してしまいました。
結果的に望んでいたピクセル単位での透過処理が出来ました。
有難うございます。
***
ちなみに、ですが、イメージは CImage を用いて読み込みしているのですが、CImage を用いたプロジェクトで「共有DLLでMFCを使う」プロジェクトにしていた場合というのは、追加DLL不要で単体で動く物なのでしょうか?
今ひとつ、ATL、GDIという存在自体が良く分かっておりません・・・。
共有DLLだとWindow内にあるDLLを
複数のアプリケーションで共有して使う。
必然的にダイナミックリンクになるし、
dllのバージョンがインストール先の環境で異なる。
スタティックリンクはビルト時に
実行ファイル内にMFC側のコードを
収めちゃう。共有DLLは使わない。
# 本題は解決したので解決チェックしますです。
そださん、回答有難うございます。
はい。スタティックはMFCのDLLを内包するのですが、ATLやGDI+といった物がMFCの範囲の一部なのか、外部なのかが良く分かって無いという意味で書きました。
プロジェクトの構成プロパティ、全般内にもMFCとは別に「ATLの使用
」という欄が有りますが、これのはい・いいえに関わらず、スタティックリンクでは追加DLLが必要無しになるのだろうか、という疑問です。
例えばATLを使用するにすると明示的に #include <atlimage.h> 等をしなくても使えますよという様なだけの物なのでしょうか?
# ATLはCOM Interfaceのラッパー(?)
これみるかぎり
http://msdn.microsoft.com/ja-jp/library/8x480de8(VS.80).aspx
スタティックリンクとダイナミックリンクの切り替えっぽいですけどねん。
ツイート | ![]() |