Растровое изображение исчезает, когда программа свернута - PullRequest
1 голос
/ 02 января 2012

Я студент по программированию игр на c ++.Мы должны запрограммировать текстовое приключение на консоли для Windows.Мы получаем очки за реализацию растровых изображений.У меня есть следующий код для отображения растрового изображения.Это работает хорошо, но когда я сворачиваю свое окно, мое растровое изображение исчезает.В чем проблема?

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;
}

1 Ответ

1 голос
/ 02 января 2012

Растровое изображение исчезает, потому что окно консоли перерисовывается при восстановлении, а процедура перерисовки ничего не знает о вашем растровом изображении.

Окна перекрашиваются довольно часто: каждый раз, когда ваше окно вызывается или изменяется или восстанавливается из иконического состоянияокно перекрашивается (ну может быть не каждый раз, потому что система может сделать некоторое кеширование ... но все же).Когда окно должно быть перекрашено, Windows отправляет в окно сообщение WM_PAINT.Приложение обрабатывает это сообщение и перерисовывает содержимое окна в окне DC.Так работают GUI-приложения.Но если вы используете консоль, вы не можете обрабатывать оконные сообщения - система делает это за вас, и вы не можете изменить процедуру перекраски.

Если вы хотите, чтобы ваше растровое изображение всегда было там, вы должны создать свойсобственное окно и обработайте сообщение WM_PAINT (или вы можете использовать некоторый предопределенный элемент управления, предназначенный для отображения растровых изображений).Для этого необходимо создать GUI-приложение.Вы не можете сделать это с консольным приложением.

Код, который вы предоставили, является просто взломом, и он не поддерживается так, как вы ожидаете.Когда код выполняется, растровое изображение рисуется.Но как только часть окна будет скрыта за другим окном, изображение будет потеряно, и никто не восстановит его.

Кстати, если ваш профессор дал вам этот пример, вероятно, он будет удовлетворен результатом этогопроизводит.Но никогда не делай так в реальной жизни :) 1009 *

...