程序最小化时位图消失 我是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; } bool显示位图(char*szBitmap,int-PosX=-1,int-PosY=-1,bool-AutoZoom=false) { HWND HWND=FindWindow(“ConsoleWindowClass”,NULL);//Konsolen-Fenster-identifizieren 如果(!hWnd)返回false; HDC HDC=GetDC(hWnd);//设备上下文 如果(!hDC)返回false; HDC hBitmapDC=CreateCompatibleDC(HDC);//设备上下文für位图bereittellen 如果(!hBitmapDC)返回false; HBITMAP HBITMAP=(HBITMAP)LoadImage(空,szBitmap,//Bild aus Datei LOADED 图像(位图,0,0,LR_LOADFROMFILE); 如果(!hBitmap)返回false; 位图bmp; GetObject(hBitmap,sizeof(bmp),&bmp);//Zeiger auf位图对象 RECT客户端; GetClientRect(hWnd和Client);//Fenstergröe bestinmen 如果(PosX==-1)PosX=((Client.right Client.left)-bmp.bmWidth)/2; 如果(PosY==-1)PosY=250-bmp.bmHeight;//ggfs.automaticsch-zentrieren 如果(PosY

程序最小化时位图消失 我是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; } bool显示位图(char*szBitmap,int-PosX=-1,int-PosY=-1,bool-AutoZoom=false) { HWND HWND=FindWindow(“ConsoleWindowClass”,NULL);//Konsolen-Fenster-identifizieren 如果(!hWnd)返回false; HDC HDC=GetDC(hWnd);//设备上下文 如果(!hDC)返回false; HDC hBitmapDC=CreateCompatibleDC(HDC);//设备上下文für位图bereittellen 如果(!hBitmapDC)返回false; HBITMAP HBITMAP=(HBITMAP)LoadImage(空,szBitmap,//Bild aus Datei LOADED 图像(位图,0,0,LR_LOADFROMFILE); 如果(!hBitmap)返回false; 位图bmp; GetObject(hBitmap,sizeof(bmp),&bmp);//Zeiger auf位图对象 RECT客户端; GetClientRect(hWnd和Client);//Fenstergröe bestinmen 如果(PosX==-1)PosX=((Client.right Client.left)-bmp.bmWidth)/2; 如果(PosY==-1)PosY=250-bmp.bmHeight;//ggfs.automaticsch-zentrieren 如果(PosY,c++,bitmap,minimize,adventure,C++,Bitmap,Minimize,Adventure,位图会消失,因为控制台窗口在还原时会重新绘制,而重新绘制过程对位图一无所知 窗口经常被重新绘制:每次打开或调整窗口的大小或从图标状态恢复窗口时,窗口都会被重新绘制(当然,可能不是每次,因为系统可以进行一些缓存…但仍然如此)。当窗口需要重新绘制时,Windows会向窗口发送WM_PAINT消息。Tha应用程序处理此消息并在窗口DC中重新绘制窗口内容。这就是GUI应用程序的工作方式。但如果您使用console,则无法处理窗口消息——系统会为您处理,并且您无法更改重新绘制过程 如果希望位图始终存在,则

位图会消失,因为控制台窗口在还原时会重新绘制,而重新绘制过程对位图一无所知

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

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

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


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

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

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

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

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


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

你真的应该创建自己的窗口来显示位图。至少可以说,以这种方式使用控制台窗口可能被认为是粗鲁的。可能会出现无数的问题。是的,但我们必须这样做。我们的教授给出了这个例子来在我们的游戏中使用它。啊!那么你应该换个教授(.您的问题没有合理的解决方案,只能从计时器重新绘制位图。或者使用用户命令“重新绘制”。你真的应该创建自己的窗口来显示位图。至少可以说,以这种方式使用控制台窗口可能会被认为是不礼貌的。而且可能会出现无数问题。是的,但我们必须这样做。我们的教授给出了这个示例,以便在我们的游戏中使用它。啊!那么你应该更换教授:(你的问题没有一个合理的解决方案,除了从一个定时器重绘位图,或者使用一个用户命令“重绘”。BTW我不得不说我们使用的是AFXWE.H,它似乎是MFC应用程序的一部分。我们刚刚学习了C++,所以我对此一无所知。也许这里有可能做些什么?控制台应用程序是ST。