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

解決


タルタル  2007-10-26 13:59:07  No: 66659

MFCのVC++2005です

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

よろしくお願いします。


subaru  2007-10-26 20:25:25  No: 66660

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


タルタル  2007-10-28 10:51:48  No: 66661

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 13:15:57  No: 66662

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加