gpt4 book ai didi

c++ - 程序最小化时位图消失

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:38 24 4
gpt4 key购买 nike

我是一名学习 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;
}

最佳答案

位图消失是因为控制台窗口在恢复时重新绘制,而重新绘制过程对您的位图一无所知。

Windows 经常重绘:每次打开窗口、调整窗口大小或从图标状态恢复时,窗口都会重绘(好吧,可能不是每次都重绘,因为系统可以进行一些缓存……但仍然如此)。当窗口应该重新绘制时,Windows 向窗口发送 WM_PAINT 消息。应用程序处理此消息并在窗口 DC 中重绘窗口内容。这就是 GUI 应用程序的工作方式。但是,如果您使用控制台,则无法处理窗口消息——系统会为您处理,您无法更改重绘过程。

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

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

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

关于c++ - 程序最小化时位图消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8700251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com