デスクトップイメージをセーブするには?

解決


タルタル  2007-10-26 04:59:07  No: 66659  IP: 192.*.*.*

MFCのVC++2005です

デスクトップイメージをBMPファイルとしてセーブしたいのです。
CImage::Saveが便利そうなので使いたいのですが、デスクトップイメージをCImageに入れるにはどうやればよいのでしょうか?
CImage::BitBltの逆がやりたいのですが、そういうのは無いのでしょうか?

よろしくお願いします。

編集 削除
subaru  2007-10-26 11:25:25  No: 66660  IP: 192.*.*.*

>CImage::BitBltの逆がやりたいのですが、そういうのは無いのでしょうか?
CImage::GetDCで得られるデバイスコンテキストに対してBitBltするだけ。
CImage::ReleaseDCを忘れずに。

編集 削除
タルタル  2007-10-28 01:51:48  No: 66661  IP: 192.*.*.*

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ダイナマン  2007-11-02 04:15:57  No: 66662  IP: 192.*.*.*

俺も超初心者なんであってるかどうか分かりませんが、同じようなことをつい最近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+っていうものを使えといわれて、試したところそれでも大丈夫でした。(ていうかずっと簡単でした。)

編集 削除