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 消息。Tha 应用程序处理此消息并在窗口 DC 中重绘窗口内容。这就是 GUI 应用程序的工作方式。但是如果你使用控制台,你不能处理窗口消息——系统会帮你处理,你不能改变重绘过程。

如果您希望您的位图始终存在,您应该创建自己的窗口并处理 WM_PAINT 消息(或者,您可以使用一些用于显示位图的预定义控件)。为此,您必须创建一个 GUI 应用程序。您不能使用控制台应用程序执行此操作。

您提供的代码只是一个 hack,不支持按您的预期工作。执行代码时,将绘制位图。但是一旦窗口的一部分被隐藏在另一个窗口之外,图像就会丢失,没有人会恢复它。

顺便说一句,如果你的教授给你这个例子,他可能会对它产生的结果感到满意。但在现实生活中永远不要这样做:)

于 2012-01-02T12:32:31.883 回答