1

私は C++ ゲーム プログラミングの学生です。Windows のコンソールで textadventure をプログラムする必要があります。ビットマップの実装のポイントを取得します。ビットマップを表示する次のコードがあります。うまくいきますが、ウィンドウを最小化するとビットマップが消えます。問題はどこですか?

bool DisplayBitmap(char *szBitmap, int PosX = -1, int PosY = -1, bool AutoZoom = false)
{  

    HWND hWnd = FindWindow("ConsoleWindowClass",NULL);      // Konsolen-Fenster identifizieren
    if (!hWnd) return false;

    HDC hDC = GetDC(hWnd);                                  // Device Context des Fensters ermitteln
    if (!hDC) return false; 

    HDC hBitmapDC = CreateCompatibleDC(hDC);                // Device Context für Bitmap bereitstellen
    if (!hBitmapDC) return false; 

    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap,     // Bild aus Datei laden
                      IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    if (!hBitmap) return false; 

    BITMAP bmp; 
    GetObject(hBitmap,sizeof(bmp),&bmp);                    // Zeiger auf Bitmap-Objekt anfordern 

    RECT Client;
    GetClientRect(hWnd, &Client);                           // Fenstergröße bestimmen
    if (PosX == -1) PosX = ((Client.right-Client.left)-bmp.bmWidth) / 2;
    if (PosY == -1) PosY = 250-bmp.bmHeight;                // ggfs. automatisch zentrieren
    if (PosY <   0) PosY = 0;                               // und Zoomfaktor berechnen
    double ZoomFactor = (Client.right-Client.left-2*PosX) / double(bmp.bmWidth); 

    SelectObject(hBitmapDC,hBitmap);                        // Bitmap kopieren (evtl. mit Zoom)
    if (!AutoZoom)     BitBlt(hDC,PosX,PosY,bmp.bmWidth,bmp.bmHeight,hBitmapDC,0,0,SRCCOPY);  
    else StretchBlt(hDC,PosX,PosY,int(bmp.bmWidth*ZoomFactor),int(bmp.bmHeight*ZoomFactor),hBitmapDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); 

    DeleteObject(hBitmap);                                  // Objekte und Device Contexts wieder freigeben
    ReleaseDC(hWnd,hBitmapDC); 
    ReleaseDC(hWnd,hDC);

    return true;
}
4

1 に答える 1

1

復元時にコンソール ウィンドウが再描画され、再描画手順はビットマップについて何も認識しないため、ビットマップは消えます。

ウィンドウは非常に頻繁に再描画されます。ウィンドウが表示されたり、サイズ変更されたり、アイコン状態から復元されたりするたびに、ウィンドウは再描画されます (システムがキャッシュを作成できるため、毎回ではないかもしれませんが、それでも)。ウィンドウを再描画する必要がある場合、Windows は WM_PAINT メッセージをウィンドウに送信します。アプリケーションはこのメッセージを処理し、ウィンドウ DC でウィンドウの内容を再描画します。これが GUI アプリケーションの仕組みです。しかし、コンソールを使用している場合、ウィンドウ メッセージを処理することはできません。システムが処理を行い、再描画手順を変更することはできません。

ビットマップを常にそこに表示したい場合は、独自のウィンドウを作成して WM_PAINT メッセージを処理する必要があります (または、ビットマップを表示するための事前定義されたコントロールを使用できます)。これを行うには、GUI アプリケーションを作成する必要があります。これは、コンソール アプリケーションでは実行できません。

あなたが提供したコードは単なるハックであり、期待どおりに動作することはサポートされていません。コードが実行されると、ビットマップが描画されます。しかし、ウィンドウの一部が別のウィンドウの向こう側に隠れると、画像は失われ、誰もそれを元に戻すことはできません.

ところで、もしあなたの教授があなたにこの例を与えたなら、おそらく彼はそれが生み出す結果に満足するでしょう. しかし、実生活では決してこのようにしないでください:)

于 2012-01-02T12:32:31.883 に答える