1

GDI+ を使用してウィンドウのスナップショットを取得しています。コードは次のとおりです。

CComBSTR bstrfname (fname); 

HDC hdc = CreateCompatibleDC (hDC); 
HBITMAP hbmp = CreateCompatibleBitmap (hDC, CFG_WIDTH, CFG_HEIGHT); 
HBITMAP hbmp0 = (HBITMAP)SelectObject (hdc, hbmp); 
BitBlt (hdc, 0, 0, CFG_WIDTH, CFG_HEIGHT, hDC, 0, 0, SRCCOPY); 

Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap (hbmp, NULL); 
CLSID encoderClsid; GetEncoderClsid (L"image/png", &encoderClsid); 
bmp->Save (bstrfname, &encoderClsid, NULL); 
delete bmp; 

SelectObject (hdc, hbmp0); 
DeleteObject (hbmp); 
DeleteDC (hdc); 

ここで、hDC は前に次のように設定されます。

hWnd=CreateWindowEx(...); hDC=GetDC(hWnd); 

これは小さなウィンドウでは完全に機能しますが、画面よりも大きなウィンドウを試してみました。

つまり、タスクバーも保存されています。何が与えますか?

4

1 に答える 1

3

これは正常なことです。このようなスクリーンショットは、モニターで見ているものを正確に示します。タスクバーを含みます。キャプチャする領域を、キャプチャするウィンドウの境界に制限する必要があります。GetWindowRect()を使用して、ビットマップのサイズとそれに応じてBitBlt()に渡す引数を調整します。

PrintWindowは、ターゲットウィンドウがWM_PRINTおよびWM_PRINTCLIENTメッセージを実装している場合にのみ機能します。実装は簡単ですが、見落とされがちです。

于 2010-07-11T13:41:26.627 に答える