BitBlt関数について教えてください
よろしくお願いします。
画像を読み込むための、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;
}