ピクチャボックスに画面キャプチャしたビットマップをセットし、同ピクチャボックスの背景を変更すると、ビットマップの一部の色も変更されてしまう – プログラミング – Home

ピクチャボックスに画面キャプチャしたビ...
 
通知
すべてクリア

[解決済] ピクチャボックスに画面キャプチャしたビットマップをセットし、同ピクチャボックスの背景を変更すると、ビットマップの一部の色も変更されてしまう


ナトゥ
 ナトゥ
(@ナトゥ)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

VisualStudio 2005 MFCです。

ダイアログを親ウィンドウとし、ピクチャボックスを貼り付けます。
そこに、画面キャプチャした画像(メモリDCとBitBltを使用し作成)を
HBITMAPとして格納し、SetBitmapでピクチャボックスに設定します。

その後、親ウィンドウのOnCtlColor()でピクチャボックスの背景を変更すると、
ビットマップの一部(ウィンドウのグレーの部分<::GetSysColor(COLOR_MENU)と同色>)が
変更した背景色と同じ色に変更されてしまいます。

どうも、ビットマップのグレーの部分<::GetSysColor(COLOR_MENU)と同色>が
マスクされて背景として塗りつぶされてしまっているようなのですが、
このようにビットマップの一部を塗りつぶさずに、
同ピクチャボックスの背景色を変更する方法はないでしょうか?


引用未解決
トピックタグ
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

描画前に背景色で塗りつぶしてしまうというのはどうでしょう?
ピクチャボックスの背景なら別に無理にCTLCOLORで処理する必要はないと思いますが


返信引用
ナトゥ
 ナトゥ
(@ナトゥ)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

CStaticを派生させたピクチャコントロールクラスを作成し、
SetBitmap()前に、同クラスのOnPaint()内でFillRect()しましたが、
ピクチャコントロールの背景色が変更されませんでした。
何かやり方が間違っているのでしょうか?

しかも、派生ピクチャコントロールクラスのOnPaint()を
オーバーライドすると、SetBitmap()したビットマップが
全く表示されなくなってしまいました。
#特にOnPaint内に処理は記述していません。。。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

一応、元の Static Ctrl のプロパティの「Transparent」属性がFalseに
なっていることを確認してみましょう。
上記がFalseなのに透過してしまうのなら、OnPaintをオーバーライドして
自前で描画するしかありません。
しかし、ここまでやるのなら、
自前のコントロールにしてしまった方が後々楽かもしれません。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

SetBitmap()で関連付けられたビットマップってどういう扱い受けるんでしょうね…
根本的な解決にはならないかもしれませんが、
BitBlt()もしくはStretchBlt()を使うのもありだと思います。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

全ての疑問の前に、1つの謎が、

ピクチャーボックスにSetBitmap()するということは、
ピクチャーボックス全体がビットマップで塗りつぶされると言うことですよね?

背景なんて、全部塗りつぶされてしまって見えないから、
ピクチャボックスの背景色を議論する意味が不明。

なんか私の勘違いでしょうか?


返信引用
gak
 gak
(@gak)
ゲスト
結合: 21年前
投稿: 132
 

> なんか私の勘違いでしょうか?
今回の件と関係あるかは不明だけど、XPのVisualスタイル相当のものが有効な環境だとピ
クチャボックスに SetBitmap された画像のα値は適用される。この場合背景が絡んでくる。

α適用に関する直接的な資料は見つけられなかったのだけど、「α付きの場合はちょっと動
作が変わるよ」程度の情報ならあった。
http://msdn.microsoft.com/en-us/library/bb760782%28VS.85%29.aspx

> マスクされて背景として塗りつぶされてしまっているようなのですが
もしかしたら、ナトゥさんが SetBitmap した HBITMAP にはα値が存在していたのかもし
れないね。BitBlt の SRC**** 系処理はα値もコピーする動作だった筈なので、キャプ
チャ元にα情報が存在していた場合はα値もコピーされていたのかもしれない。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

http://msdn.microsoft.com/ja-jp/library/b7w5x74z(VS.80).aspx
MSDN読んだ?
解説に、

-------- ココカラ ----------
>SS_CENTERIMAGE
> 静的コントロールの中央に揃えるのに使います。
> イメージが静的コントロールより大きいときは、クリッピングされます。
> 静的コントロールより小さいときは、イメージの周囲の空の領域は
> ビットマップの左上隅のピクセルの色で塗りつぶされます。
-------- ココマデ ----------
とあり、
> ビットマップの左上隅のピクセルの色で塗りつぶされます。
ですよね。


返信引用
ナトゥ
 ナトゥ
(@ナトゥ)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

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

> bunさん
> 背景なんて、全部塗りつぶされてしまって見えないから、
> ピクチャボックスの背景色を議論する意味が不明。
CStaticの派生クラスを動的にSS_BITMAPの属性を付加した上で
サイズを指定してCreate()すると、SetBitmapを行っても、
作成したコントロールはBitmapのサイズにリサイズされずに、
背景が現われてきます。そこで、この背景を何とかしようと
考えていました。

>ITOさん
本件で問題としているのは、同Staticコントロールの背景色を変更すると、
ビットマップ内部の一部の色も変更されてしまうという内容です。
指摘の通り、余白が塗りつぶされることは確認できています。

>gak
α値の件はまだ理解不足なのですが、gakさんがおっしゃるような
何らかの現象がおきているような気が私もしています。

とりあえず、今回は作成するStaticコントロールをSS_BITMAPとせず、
直接このコントロールのDCにビットマップを描画して対応する予定です。


返信引用
ナトゥ
 ナトゥ
(@ナトゥ)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

解決チェックを忘れてしまいました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました