GetDIBitsまたはBitBltについて何か読んだことがありますが、理解できません。
これは、Windowsが実際にWindows上のグラフィックスをどのように処理するかを理解していないことが原因である可能性があります。誰かが私がこれらのことについて学ぶことができるページを私に紹介してくれるなら、それは完璧でしょう!:)
Windows WM_PAINTでこのコードを使用して問題を解決しました。ターゲット ウィンドウとまったく同じ内容が表示されるようになりました。
PAINTSTRUCT ps;
HDC hdc = BeginPaint(MainWindow, &ps);
HDC TargetDC = GetDC(TargetWindow);
RECT rect;
GetWindowRect(TargetWindow, &rect);
BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
EndPaint(MainWindow, &ps);
あなたがしたいことは:
ステップ 3 の代わりに、DWM を使用するか、クリップボードを使用してハックすることができます。
void CopyWndToClipboard(CWnd *pWnd)
{
CBitmap bitmap;
CClientDC dc(pWnd);
CDC memDC;
CRect rect;
memDC.CreateCompatibleDC(&dc);
pWnd->GetWindowRect(rect);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
pWnd->OpenClipboard() ;
EmptyClipboard() ;
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
CloseClipboard() ;
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}
ウィンドウにWM_PRINTCLIENTメッセージを送信すると、うまくいくかもしれません。これは、DirectX または OpenGL を使用するウィンドウではうまく機能しない場合があります。
Aero が有効になっているシステム (つまり、DWM がアクティブな場合) で WM_PRINTCLIENT を使用すると、問題が発生する場合があります。システムで DWM がアクティブになっている場合は、ウィンドウ バッキング ストアにアクセスする方法が提供される可能性がありますが、これまで詳しく調べたことはありません。