最近プログラミングを始めた初心者です。
環境はXP SP2 及びVC++6.0 です。
Win32APIのみを用いてプログラミングしております(MFCは使えません)。
宜しくお願い致します。
やりたいことは、あるビットマップを背景にして(bmpback.bmp)、その上に、bmpback.bmpよりサイズが小さいbmp1.bmpとbmp2.bmpを、WM_TIMERを使って交互に表示させる、です。
その際、WM_TIMER内でbmpback.bmpとbmp1.bmp(又はbmp2.bmp)を重ね合わせたbitmapを作成し、そのbitmapをWM_PAINT内でBitBltなどを用いてメモリDCからクライアント領域用のDCに転送して、ディスプレイに表示させたいと考えています。
検索したところ、以下のリンクに正に同じ質問があったのですが、難しくて理解出来ませんでした。
http://oshiete1.goo.ne.jp/qa1474735.html
回答者様が、良回答20ptで書かれている内容の、
>最終的に表示したい大きさのビットマップをメモリDCに割り当てて、
>そのメモリDCに対して10回のBitBltを行います。
の部分です。
最終的に表示したい大きさのビットマップ、というのが私の場合bmpback.bmpになると思いますが、例えばbmpback.bmpがSelectObject()でメモリDCに関連付けされているとして、そのメモリDCにbmp1.bmpをBitBltで転送する場合、bmp1.bmpに関連付けられるべきDC(デバイスコンテキスト)は何になるのでしょうか?
(メモリDC→メモリDCかなあとも思ったのですが、それだとbmp1.bmpを紐付けした時点でbmpback.bmpが消えてしまうような気がして、ちょっと違うかなあと)
分かり辛い説明で申し訳ありませんが、知りたいことは、あるBitmapに別のBitmapをBitBltで転送して重ね合わせたい場合、コピー元のビットマップに関連付けるDCは何にすべきか、ということです。
本当は透過処理もしたいところですが、それは後で調べることにしてまずはBitBltで動作を見たいと思っています。
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
★アドバイス
>関連付けるDCは何にすべきか、ということです。
↑
画面のDCでもメモリDCでもどちらでも良い。
ちらつきをなくしたいならメモリDCを使う。
手順
(1)背景画像用のメモリDC1を用意
(2)前景画像用のメモリDC2を用意
(3)重ね合わせのメモリDC3を用意
(4)メモリDC1→メモリDC3にBitBlt転送
(5)メモリDC2→メモリDC3にTransparentBlt転送
(6)メモリDC3→画面のDCにBitBlt転送
>本当は透過処理もしたいところですが、
>それは後で調べることにしてまずはBitBltで動作を見たいと思っています。
↑
調べるならTransparentBlt()関数か、BitBlt()関数を使っての重ね合わせ処理です。
http://www3.pf-x.net/~chopper/home2/WinAPI/WinGD …→『マスク画像による画像の透明化』
http://www3.pf-x.net/~chopper/home2/WinAPI/WinGD …→『指定色を透明化する』
この回答への補足
いつも有難う御座います。
教えて頂いた通りやったところ、解決致しました。
更にTransparentBltを使ってみたところ、透過処理についても解決致しました。
助かりました。
もしよければ、メモリDCの作成について、もう少し教えて下さい。
ウインドウハンドルをhWndとして、
hdc=GetDC(hWnd);//画面のDC入手
hMemDC1 = CreateCompatibleDC(hdc);//キャラクタ1用のメモリDC
hMemDC2 = CreateCompatibleDC(hdc);//キャラクタ2用のメモリDC
hBmpBackDC=CreateCompatibleDC(hdc);//背景用のメモリDC
hBmpScreenDC=CreateCompatibleDC(hdc);//重ね合わせ用のメモリDC
とメモリDCを生成したのですが、これで正しいでしょうか?
というのは、私は、別々のメモリDCに各々のBitnmao(キャラクタ1、キャラクタ2など)を関連付け、BitBltで重ね合わせ用メモリDCに転送、という風に考えていたからです。
上記のプログラムだと、関数、引数ともに同じである為、hMemDC1、hMemDC2、hBmpBackDC、hBmpScreenDC
は全て同じハンドル値になってしまうので、最初は違和感がありました(コピー元デバイスハンドルとコピー先デバイスハンドルが実質同じになってしまうから)。
動作自体は問題ないので正しいとは思うのですが、もし宜しければご教授下さい。
有難う御座いました。
No.2
- 回答日時:
>関数、引数ともに同じである為、hMemDC1、hMemDC2、hBmpBackDC、hBmpScreenDCは全て同じハンドル値になってしまうので、
Debugでブレークポイント置いて値を見るとわかると思いますがそれぞれ別の値が帰ってきます。
Create~関数でやっていることは結局mallocでメモリを割り当てているだけでしょうから関数実行のたびに新しいメモリが割り当てられるはずです。
malloc( )で常に同じ値が帰ってきたら困りますよね。
回答有難う御座います。
私は全然分かっていないので、GetDC()とCreateCompatibleDC()が同じ様な関数だと思っていたのですが、実は違う様ですね。
色々調べたところ、あるサイトに、
”GetDC関数やBeginPaint関数では 「ディスプレイ上のデバイスコンテキストを取得」しますが、この関数(CreateCompatibleDC)は「メモリ上のデバイスコンテキストを作成」します。
おなじデバイスコンテキストでもちょっと違うということだけ覚えてください。(深く考えたら負けです。たぶん)”
とありましたので、多分クライアント領域に出力するDCとメモリDCは同じ感覚でとらえてはいけないのだということが分かりました。
つまり、クライアント領域のDCを求めるGetDC()は引数(例えばhWnd)が同じであれば戻り値(例えばhdc)は同じだが、CreateCompatobleDC()は、引数(例えばhdc)が同じでも戻り値は異なるということですね。
理解できました。
どうもありがとう御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
-
4
MFCでOnPaintのタイミング
C言語・C++・C#
-
5
ビットマップを表示させる(MFC)
C言語・C++・C#
-
6
BitBltについて。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
EXCEL-VBAにてADOのレコードセ...
-
VB2005 Datagridview の仮想モ...
-
【C言語】再帰が時間がかかる...
-
別のPCにファイルを移してコン...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
H8 マイコン セクションの設...
-
メモリのセグメント違反の解決...
-
変数をあなたの身近なものに例...
-
オブジェクトの開放
-
JAVAの各フレームワークの比較
-
VB.netでUSBメモリの固有I...
-
大容量のメモリ確保をスワップ...
-
Macターミナルで実行中のプログ...
-
家電製品の電力周波数を変える機械
-
プロセスIDの取得方法について
-
バックグラウンドのプロセスの...
-
スレッドの監視方法について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
ファイルマッピング関数で失敗
-
メモリのセグメント違反の解決...
-
「ヒープサイズの設定」て何?
-
メモリが不足しています(VBA)
-
エクセルのメモリ使用状況/Appl...
-
メモリ不足
-
大容量のメモリ確保をスワップ...
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
「memcpy」と「strcpy」について
-
バッチファイルでの実行EXEのメ...
-
C言語初心者です。debug assert...
-
エクセルVBA 大容量CSVファイル...
-
これて逆じゃないですか?
-
[ちょっと息抜き]メモリを解放 ...
-
メモリを解放しないとどうなる?
-
動的メモリとexit(C言語)
-
メモリの消費量について
おすすめ情報