よろしくお願いします。
画像を読み込むための、BitBlt関数について、色々調べてみたのですが、どうしても分からない記述が2つあります。ご指導、アドバイスをお願いします。
1、サンプルのソースを参考にしているのですが、BitBlt関数の第2、第3の記述の意味として、
『PAINTSTRUCT構造体のポインタpsが、左隅上、を参照している』と解釈したのですが、第4、第5引数の、-(引く)の意味が理解できません。
2、画像を2種類表示するためメニューに、『オプション1とオプション2』を作り、オプション1はコピー元と同じ画像を表示、
オプション2は、ラスタオペレーションを選択可能にして、選択した画像を表示すると言うものですが、DWORD dwRop; を宣言し『第9引数をNOTSRCCOPY』として、二つ目の画像を表示する case文に dwRop = NOTSRCCOPY; を追加したのですがうまく行きません。多分 『dwRop』の使い方に問題があるのかと思うのですが、うまく表示されません。
因みに、 BitBlt関数の第9引数が『SRCCOPY』の時は、正常に2種類の画像が表示されます。
/*ウィンドウプロシージャ*/
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hdc;
DWORD dwRop; //追加した
PAINTSTRUCT ps;
HBITMAP hBmp;
HDC hdc_memx;
switch(msg){
case WM_CREATE:
hdc = GetDC(hWnd);
hBmp = LoadBitmap(hInst, "MYBMP1");
if(hBmp == NULL){
MessageBox(hWnd, "画像1のロードに失敗しました", "エラー",
MB_OK | MB_ICONWARNING);
return 0;
}
hdc_mem1 = CreateCompatibleDC(hdc);
SelectObject(hdc_mem1, hBmp);
DeleteObject(hBmp);
hBmp = LoadBitmap(hInst, "MYBMP2");
if(hBmp == NULL){
MessageBox(hWnd, "画像2のロードに失敗しました", "エラー",
MB_OK | MB_ICONWARNING);
return 0;
}
hdc_mem2 = CreateCompatibleDC(hdc);
SelectObject(hdc_mem2, hBmp);
DeleteObject(hBmp);
ReleaseDC(hWnd, hdc);
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
if(show_no == 1)
hdc_memx = hdc_mem1;
if(show_no == 2)
hdc_memx = hdc_mem2;
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
hdc_memx, ps.rcPaint.left, ps.rcPaint.top,
SRCCOPY);
// PATCOPYにして,IDM_ANIME2に、dwRop=NOTSRCCOPY
//を追加しても変更されないし、画像の表示が出来ない
EndPaint(hWnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wp)){
case IDM_ANIME1:
show_no = 1;
//dwRop = SRCCOPY //追加したが変化なし
InvalidateRect(hWnd, NULL, TRUE);
break;
case IDM_ANIME2:
show_no = 2;
//dwRop = NOTSRCCOPY; //追加したが変化なし
InvalidateRect(hWnd, NULL, TRUE);
break;
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:
DeleteDC(hdc_mem1);
DeleteDC(hdc_mem2);
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
No.2ベストアンサー
- 回答日時:
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
は 書き換えが必要な部分つまり 無効になっている部分を算出しています
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
hdc_memx, ps.rcPaint.left, ps.rcPaint.top,
SRCCOPY);
の SRCCOPYを dwRopに変更します
つまり
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
hdc_memx, ps.rcPaint.left, ps.rcPaint.top,
dwRop);
dwRopを設定する部分を実装します ... メニューイベントの対応とかです
dwRopが大域変数ならいいのですが WndProcのローカル変数ならstatic属性を指示しましょう
PATCOPYはデバイスコンテキストに指定されたブラシをコピーするのに用います
BitBltで指定する場合 第一引数のデバイスコンテキストで選択されているブラシが対象です
普通は PatBltで使います
この回答への補足
アドバイス、有難うございます。
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
については、VTClientさんのアドバイスで、少し意味が分かりかけていたのですが、『画像を算出しているのではなく、無効領域を算出していたのですね』 すっきりしました。
また、
BitBlt()の、第9引数の、『SRCCOPY』を 『変数のdwRop』に変えるのは 『もしかしたら』 と思ったのですが、これで確信が持てました。
変更すると、ソースの記述や、メニューリソースも変更ですね。
それと、PATCOPYの使い方が間違ってました。ご指摘有難うございます。
ラスタオペレーションの使い方も、もう少し調べてみます。
これから早速ソースを変更して試してみます。
結果は、お礼のほうに報告したいと思います。
アドバイス有難うございます。
早速 『BitBlt()の、第9引数』をdwRopに 変更し、メニューリソースも変更しました。
ファイルとオプションを作り、ファイルからは画像1、画像2の選択肢
オプションには、ラスタオペレーションの選択肢を作りました。
結果、ぶじにコンパイルできました。
ただ、一つ気になることがあるのですが、ファイルをクリックした時に、クライアント領域が真っ黒く表示されます。
その後に画像を選択すると、クライアント領域が白く変わり、そこに画像が表示されます。
この真っ黒になる原因が理解できません。これから白いクライアント領域に修正したいと思っっています。
何かお気づきでしたら、アドバイスをお願いします。
No.3
- 回答日時:
show_noの値が初期化されていない場合または 1or2以外の場合
hdc_memxが不定になってしまっていませんか
show_noが 1or2以外だったら BitBltを実行しないようにするとか
WM_CREATEで LoadBitmap(hInst,"MYBMP1")が成功したら show_noを1に初期化するとか
デバイスコンテキストに選択したグラフィックオブジェクトを選択をはずす前に DeleteObjectで削除するのはお勧めしません
MSDNなどで DeleteObjectなどを検索してみてください
再度のアドバイス、有難うございます。
ご指摘のとおり 『show_no1,show_no2 』以外のときの処理が出来ていませんでした。
WM_CREATEで、ウィンドウが作られたら画像を表示する様にしたら、改善されました。
後は、いろいろの記述を試して見ます。
貴重なアドバイスを有難うございました。
No.1
- 回答日時:
<1>
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
hdc_memx, ps.rcPaint.left, ps.rcPaint.top,
SRCCOPY);
の
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
は幅、高さを指定します。つまり座標が (10,10) - (100,80)
であるとき、幅は、100 - 10 = 90 / 高さは 80 - 10 = 70
ですから差分で算出するわけです。
でもクライアント座標は (0,0) - になるので引く必要はないの
ですがスクリーン座標を想定して引くべきですね。
<2>
DWORD dwRop; //追加した
を
static DWORD dwRop;
に変更してはだめですか?
この回答への補足
早いアドバイス有難うございます。
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
の記述を分かりやすく説明していただき、有難うございます。
rcPaintメンバ(無効領域)から、無効でない部分(画像)を算出しているのですね。
また、『DWORD dwRop』を、『static DWORD dwRop』 に変更して試してみたのですが、
画像2は、反転表示されませんでした(普通の画像)。
この時、BitBlt()の、第9引数は、『SRCCOPY』ですが、ここを『PATCOPY』に変更すると、画像1、画像2、どちらも表示されません。
第9引数の設定が悪いのでしょうか?
色々調べてみますが、何かお気づきの所がありましたら、アドバイスをお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンテキスト依存とは?
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
エディットボックスのフォント...
-
マインクラフト(pc版)で座標...
-
「アイテムは収集されました」...
-
ActiveXコントロールを.NETにイ...
-
TextBoxに文字を書いても表示さ...
-
Minecraft 統合版(PC)の描画距...
-
メッセージボックスを大きくす...
-
ラジオボタンの初期指定
-
WM_SIZEとWM_SIZINGの違い (Win...
-
検索の画面がでなくなってしま...
-
VBAのフォント変更(エクセルか...
-
C#で、ある条件でFormが自動で...
-
スピンボタンを右クリックして...
-
WindowsMediaPlayer全画面表示...
-
エクセルで回転する座標の出し方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画面がチカチカする
-
GetPixelに使うHDCの作り方
-
C 多角形を半透明に塗る方法
-
OpenGLでウィンドウハンドルの取得
-
BitBlt関数について教えてください
-
コントロール内の文字の背景色
-
丸いボタンの表示でCPU100%
-
SetWindowRgn()関数について。
-
Windowsプログラミング 画面描...
-
VBでFD、USBの有効・無効...
-
開発環境:visual c++ 2008 ...
-
PlgBltでの透過
-
Rectangleで、リソースが解放さ...
-
メモリデバイスコンテキストを...
-
ExtTextOut
-
WinAPIでスクリーン画像を映し...
-
MFC デバイスコンテキスト...
-
TextOutについて
-
スクリーンキャプチャをウイン...
おすすめ情報