0

GetDIBitsまたはBitBltについて何か読んだことがありますが、理解できません。

これは、Windowsが実際にWindows上のグラフィックスをどのように処理するかを理解していないことが原因である可能性があります。誰かが私がこれらのことについて学ぶことができるページを私に紹介してくれるなら、それは完璧でしょう!:)

4

3 に答える 3

3

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);
于 2013-01-18T20:43:24.407 に答える
0

あなたがしたいことは:

  1. ピクセルが必要なウィンドウへの HWND を取得します。
  2. 正しいサイズのメモリ DC を作成します (これを確認してください)。
  3. メモリ DC を提供しながら、WM_PRINTCLIENT または WM_PAINT をウィンドウに送信します (ただし、すべてのコントロール/ウィンドウがこれを実装しているわけではありません)。
  4. メモリ DC の内容を画面にコピーします

ステップ 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();
}
于 2013-01-18T06:28:11.683 に答える
0

ウィンドウにWM_PRINTCLIENTメッセージを送信すると、うまくいくかもしれません。これは、DirectX または OpenGL を使用するウィンドウではうまく機能しない場合があります。

Aero が有効になっているシステム (つまり、DWM がアクティブな場合) で WM_PRINTCLIENT を使用すると、問題が発生する場合があります。システムで DWM がアクティブになっている場合は、ウィンドウ バッキング ストアにアクセスする方法が提供される可能性がありますが、これまで詳しく調べたことはありません。

于 2013-01-17T20:00:43.560 に答える