最近プログラミングを始めた初心者です。
環境は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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 英語 Thus, PTH may be used to promote bone regeneration 1 2022/07/26 08:15
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- デスクトップパソコン キャプチャーボードDRECAP DC-HC4のドライバー 1 2022/05/30 15:40
- 数学 『Cの微分.2』 3 2023/02/15 19:47
- バッテリー・充電器・電池 小型シール鉛蓄電池の放電後の電池電圧について教えてください。 5 2022/09/08 10:10
- PDF AutoCAD図面をPDF fileに変換した際、画像情報やブロック名はわかるのでしょうか。 1 2022/06/03 09:42
- その他(自然科学) LEDの接続について 2 2022/09/16 22:18
- その他(年金) 企業型確定拠出年金(DC年金)について教えてください。 昨年からDC年金を初めて2年目になります。 4 2023/08/21 09:55
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
あなたは何にトキメキますか?
「きゅんとした〜♪」 と思う瞬間ってありますよね。 それは恋愛だったり、推し活だったり、映画のワンシーンだったり……。
-
タイムマシーンがあったら、過去と未来どちらに行く?
20XX年、ついにタイムマシーンが開発されました。 あなたは過去に行く? それとも未来? タイムマシーンにのって、どこに行って、何をしたいか教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
MFCでOnPaintのタイミング
C言語・C++・C#
-
-
4
ビットマップを表示させる(MFC)
C言語・C++・C#
-
5
BitBltについて。
C言語・C++・C#
-
6
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
メモリのセグメント違反の解決...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
VB.netでUSBメモリの固有I...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
「memcpy」と「strcpy」について
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
closeとメモリの開放について
-
32Bit WindowsXP用アプリでメモ...
-
メモリの解放の仕方
-
H8 マイコン セクションの設...
-
C#のOutOfMemoryException発生...
-
エラーについて
-
C言語:関数のメモリ上でのサイ...
-
Macターミナルで実行中のプログ...
-
家電製品の電力周波数を変える機械
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
ファイルマッピング関数で失敗
-
メモリのセグメント違反の解決...
-
「ヒープサイズの設定」て何?
-
メモリが不足しています(VBA)
-
エクセルのメモリ使用状況/Appl...
-
メモリ不足
-
大容量のメモリ確保をスワップ...
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
「memcpy」と「strcpy」について
-
バッチファイルでの実行EXEのメ...
-
C言語初心者です。debug assert...
-
エクセルVBA 大容量CSVファイル...
-
これて逆じゃないですか?
-
メモリを解放しないとどうなる?
-
[ちょっと息抜き]メモリを解放 ...
-
動的メモリとexit(C言語)
-
メモリの消費量について
おすすめ情報