2017-05-31 33 views
-5

私はC++を初めて使い、スクリーンショットを撮る必要があります。私は印刷方法そのもの以外にもすべてを設定していると思います。それが私が苦労しているところです。C++スクリーンショットを撮る

どのようにスクリーンショットを撮るかについて説明した投稿が見つかりましたが、何とか私のためには機能しません。 (How to capture part of the screen and save it to a BMP?

私の方法は、次のようになります。

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr) 
{ 
    HDC hdcSource = GetDC(NULL); 
    HDC hdcMemory = CreateCompatibleDC(hdcSource); 

    int capX = GetDeviceCaps(hdcSource, HORZRES); 
    int capY = GetDeviceCaps(hdcSource, VERTRES); 

    HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource, pCr->Width(), pCr->Height()); 
    HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hBitmap); 

    BitBlt(hdcMemory, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, SRCCOPY); 

    DeleteDC(hdcSource); 
    DeleteDC(hdcMemory); 

    return S_OK; 
} 

問題は、スクリーンショットが空のビットマップのようですです。 がすでにパラメータとして取得されているときに新しいHDCを作成することが理にかなっているかどうかはわかりません。どんな助けもありがとうございます。

+0

は「それを印刷」の定義 - これは多くのもののいずれかを意味するかもしれません –

+0

@BoundaryImposition印刷部は、私には多少の魔法です。私はこれがもうどこかで起こったと思う。問題は、印刷プレビューで私のWpfビューがあるはずの場所は、そこに空のスペースがあるフレームだけです。だから私はタイトルがちょっとミスリーディングだと思う、もしこの名前が印刷であっても、この方法は正しく理解すれば印刷に関するものではない。 – user3292642

+0

ええと...たとえその魔法であっても、何とかそれとやりとりする必要があります。 **スクリーンショットの使用方法を**定義してください –

答えて

1

私はそのメソッドを呼び出すフレームワークがわからないのでテストすることはできませんが、書き込みたいHDCを受け取ると、単純にメモリDCと直接BitBltを使用すべきではありません。しかし、あなたはまた、WinAPIのの戻り値は、呼び出し元にエラー条件を返すように呼び出してテストする必要があります:

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr) 
{ 
    HDC hdcSource = GetDC(NULL); 
    if (NULL == hdcSource) return E_FAIL; 

    HRESUL cr = S_OK; 

    if (!BitBlt(hdc, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, 
     SRCCOPY)) cr = E_FAIL; 

    DeleteDC(hdcSource); 

    return cr; 
} 
+0

あなたの答えをありがとう... WinAPIは、あなたは 'GetDC'を意味する? – user3292642

+0

ありがとうございました。プレビューはもう空ではありません;)左、上、幅、高さはまだ正しくないようですが、それは問題ではありません。もう一度ありがとう! – user3292642

+0

@ user3292642:少なくともBitBltの戻り値をテストする必要があります。 –

関連する問題