1

大きなショートカットで、別のアプリケーションからNamedPipeビットマップを介して受信したビットマップを描画するプログラムを作成しようとしています。

GetBitmapBits関数から取得したBITMAPINFO構造体とビットマップビットを別々に送信しています。受信側には、HeapAllocを使用して2つのグローバルポインターpbmi_paint(BITMAPINFOを指す)とlpBitmapBits_paint(ビットマップビット用)を上書きするスレッドがあります。pbmi_paintのデータは常に正当なようです。次に、WndProcのこのコードでこれを描画しようとします。

case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    if(pbmi_paint != NULL && lpBitmapBits_paint != NULL) {
        hBitmap = CreateDIBitmap( hdc,&(pbmi_paint->bmiHeader), CBM_INIT,(LPVOID) lpBitmapBits_paint,pbmi_paint,DIB_RGB_COLORS);
        GetObject(hBitmap, sizeof(bitmap), &bitmap);

        hdcMem = CreateCompatibleDC(hdc);
        oldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, oldBitmap);
        DeleteDC(hdcMem);
        DeleteObject(hBitmap);
    }       
    EndPaint(hWnd, &ps);

それから私は何も得られません(黒い長方形)。私はbitmap.bmBitsをチェックしましたが、それは0x00000000に等しくなります(NULL、ビットマップ構造体の別のメンバーが正しく設定されています)。また、次のようにbitmap.bmBitsを手動で設定しようとしました。

case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
    if(pbmi_paint != NULL && lpBitmapBits_paint != NULL) {
        hBitmap = CreateDIBitmap( hdc,&(pbmi_paint->bmiHeader), CBM_INIT,(LPVOID) lpBitmapBits_paint,pbmi_paint,DIB_RGB_COLORS);
        GetObject(hBitmap, sizeof(bitmap), &bitmap);
        bitmap.bmBits = lpBitmapBits_paint;
        hBitmap1 =  CreateBitmapIndirect(&bitmap);
        hdcMem = CreateCompatibleDC(hdc);
        oldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap1);
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, oldBitmap);
        DeleteDC(hdcMem);
        DeleteObject(hBitmap);
        DeleteObject(hBitmap1);
    }

そしてこの後、hBitmap1はNULLになります。だから私の質問は、CreateDIBitmapまたはCreateBitmapIndirectのデータへのポインタを使用できないのはなぜですか?これらの関数は、データが有効かどうかをチェックしますか?

4

1 に答える 1

3

Windowsのビットマップ、特にDDB(Device Dependent Bitmap)は混乱しています。可能であれば、私は常にDIB(デバイスに依存しないビットマップ)を使用することを好みます。それらははるかに使いやすく、最新のハードウェアでは目立ったパフォーマンスの違いはありません。

DIBは関数CreateDIBSection()で作成され、ピクセルデータは独立して実行されます。このようなもの:

void *pixels;
HBITMAP hBmp = CreateDIBSection(NULL, pbmi_paint, DIB_RGB_COLORS, &pixels, NULL, 0);
memcpy(pixels, lpBitmapBits_paint, NumBytesInBitmapBits_paint);
于 2013-01-27T19:45:58.207 に答える