
最近プログラミングを始めた初心者です。
環境は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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
COMについて
-
Visual Basic Net2003
-
メモリの使用量
-
論理アドレスの割り当て方法
-
大容量のメモリ確保をスワップ...
-
h8300-linux-elf-gccで指定可能...
-
APIを多用した場合のメモリー消...
-
[ちょっと息抜き]メモリを解放 ...
-
gccで割当可能メモリ領域を取得...
-
プログラマのためのPC選び(パ...
-
2GBでの開発について(使えな...
-
C/C++言語のメモリについて
-
新規購入PCのスペックについて...
-
H8について教えて下さい。
-
free()について
-
値のコピーについて
-
C#のガベージコレクタについて
-
C言語 昇順・降順 ソート
-
ハードウェアアーキテクチャ?
-
ReadEventLogについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報