
よろしくお願いします。
画像を読み込むための、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハードコピーをプログラムから...
-
コンテキスト依存とは?
-
SetWindowRgn()関数について。
-
ダブルバッファの作り方
-
デスクトップイメージをメモリ...
-
領域を塗りつぶしたい
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
3次元空間上の2つの座標から...
-
コンボボックス内の文字サイズ変更
-
コントロールの書式設定で、“コ...
-
ワード上Shapeの位置情報を統一...
-
フォントの大きさ
-
[VB.net] DataGridViewの列ヘッ...
-
エクセルのコントロールツール...
-
グラフの交点の求め方(Excel)
-
フォームでPDFを表示させた...
-
VB.NET2005 TextBox 高さ(Heig...
-
【C#】別フォームも同時に閉じ...
-
ActiveXコントロールを.NETにイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面がチカチカする
-
BitBlt関数について教えてください
-
コンテキスト依存とは?
-
GetDC()とCreateCompatibleDC()
-
メモリデバイスコンテキストを...
-
C 多角形を半透明に塗る方法
-
VBでFD、USBの有効・無効...
-
画像処理 ビットマップ ダブ...
-
ダイアログにビットマップを貼...
-
Windowsプログラミング 画面描...
-
コントロール内の文字の背景色
-
領域を塗りつぶしたい
-
OpenGLでウィンドウハンドルの取得
-
Rectangleで、リソースが解放さ...
-
Win32APIにて、アイコンの情報...
-
ビットマップファイルの印刷方...
-
ビットマップ(表示速度とサイズ)
-
ハードコピーをプログラムから...
-
VBでデスクトップアクセサリを...
-
VC++でBitmapとText文字を表示...
おすすめ情報