私はC++ゲームプログラミングの学生です。ウィンドウのためにコンソール上にテキストアドベンチャーをプログラムする必要があります。 ビットマップの実装のポイントを取得します。 ビットマップを表示する次のコードがあります。それはうまく動作しますが、ウィンドウを最小化するとビットマップが消えます。 どこに問題がありますか?プログラムが最小化されたときにビットマップが消える
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;
}
あなたは本当にビットマップを表示するために独自のウィンドウを作成する必要があります。このようにコンソールウィンドウを使用することは、最も少ないと言える_rude_と考えることができます。そして、無数の問題が発生する可能性があります。 – rodrigo
ええ、私たちはこのようにしなければなりません。私たちの教授は、私たちのゲームでそれを使用するこの例を与えました。 –
Argh!教授を変えてください。あなたの問題は、タイマーからあなたのビットマップを再描画する以外の合理的な解決策がありません。または、ユーザーコマンド "再描画"を使用する。 – rodrigo