MFCのVC++2005です
デスクトップイメージをBMPファイルとしてセーブしたいのです。
CImage::Saveが便利そうなので使いたいのですが、デスクトップイメージをCImageに入れるにはどうやればよいのでしょうか?
CImage::BitBltの逆がやりたいのですが、そういうのは無いのでしょうか?
よろしくお願いします。
>CImage::BitBltの逆がやりたいのですが、そういうのは無いのでしょうか?
CImage::GetDCで得られるデバイスコンテキストに対してBitBltするだけ。
CImage::ReleaseDCを忘れずに。
subaruさん回答ありがとうございます。
とりあえず出来ました。
良く理解しないままやっているので、変な事してませんかね?
CImage img;
img.Create(300,300,32,0);
CDC* myDC = CDC::FromHandle(img.GetDC());
CWnd* pwndDeskTop=GetDesktopWindow();
CDC* pDeskTopDC = pwndDeskTop->GetDC();
myDC->BitBlt(0, 0, 300, 300, pDeskTopDC, 0, 0, SRCCOPY);
img.Save("c:\\test.bmp");
pwndDeskTop->ReleaseDC(pDeskTopDC);
img.ReleaseDC();
俺も超初心者なんであってるかどうか分かりませんが、同じようなことをつい最近cでやりましたので、いつもここでお世話さんになっているので
//ウィンドウのクライアント領域を、ビットマップファイルとして保存する
BOOL SaveClientImage(HWND hwnd, LPCTSTR szPath)
{
HDC hdc, hdc_mem;
HBITMAP hBmp, hBmpOld;
RECT rc;
int cxClient, cyClient;
GetClientRect(hwnd, &rc);
cxClient = rc.right - rc.left;
cyClient = rc.bottom - rc.top;
hdc = GetDC(hwnd);
hBmp = CreateCompatibleBitmap(hdc, cxClient, cyClient);
hdc_mem = CreateCompatibleDC(hdc);
hBmpOld = SelectObject(hdc_mem, hBmp);
BitBlt(hdc_mem, 0, 0, cxClient, cyClient, hdc, 0, 0, SRCCOPY); //クライアント領域をメモリデバイスコンテキストにコピー
//これでhBMPにクライアント領域全体がコピーされる
SelectObject(hdc_mem, hBmpOld);
DdbSaveImage(hdc, hBmp, szPath);
ReleaseDC(hwnd, hdc);
return TRUE;
}
こんな感じでいけました。
ただ余所のサイトでGDI+っていうものを使えといわれて、試したところそれでも大丈夫でした。(ていうかずっと簡単でした。)
ツイート | ![]() |