Я участвую в программировании на C++. Мы должны запрограммировать 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;
}
Вы действительно должны создать свое собственное окно, чтобы показать растровое изображение. Использование консольного окна таким образом можно было бы рассматривать как _rude_, мягко говоря. И могут возникнуть бесчисленные проблемы. – rodrigo
Да, но мы должны сделать это таким образом. Наш профессор дал этот пример, чтобы использовать его в нашей игре. –
Argh! Тогда вы должны изменить профессора. :(Ваша проблема не имеет разумного решения, кроме перерисовки вашего растрового изображения из таймера. Или использовать команду пользователя «перерисовать». – rodrigo