Fullscreen-Display-Mode während der Laufzeit ändern [Direct Draw]
-
Hallo
Ich habe eine einfache Frage zu Direct Draw, die mir Google aber nicht beantworten will ; (
Ich weiß zwar wie man Bilder lädt und Draw selber initialisiert, aber was mache ich, wenn ich die Auflösung im Fullscreenmodus ändern will, wenn ich schon die Auflösung eingerichtet habe?
Hier ist mein Code bisher :
// PROG9_1.CPP - Creates a DirectDraw object, changes display // and creates a primary surface, notice the change in // the window creation flags this time // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN #define INITGUID #include <windows.h> // include important windows stuff #include <windowsx.h> #include <mmsystem.h> #include <iostream.h> // include important C/C++ stuff #include <conio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <string.h> #include <stdarg.h> #include <stdio.h> #include <math.h> #include <io.h> #include <fcntl.h> #include <ddraw.h> // directX includes // DEFINES //////////////////////////////////////////////// // defines for windows #define WINDOW_CLASS_NAME "WINXCLASS" // class name #define WINDOW_WIDTH 800 // size of window #define WINDOW_HEIGHT 600 #define SCREEN_WIDTH 800 // size of screen #define SCREEN_HEIGHT 600 #define SCREEN_BPP 16 // bits per pixel // MACROS ///////////////////////////////////////////////// // these read the keyboard asynchronously #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) // TYPES ////////////////////////////////////////////////// typedef unsigned short USHORT; typedef unsigned short WORD; typedef unsigned char UCHAR; typedef unsigned char BYTE; // PROTOTYPES ///////////////////////////////////////////// int Game_Init(void *parms=NULL); int Game_Shutdown(void *parms=NULL); int Game_Main(void *parms=NULL); // GLOBALS //////////////////////////////////////////////// HWND main_window_handle = NULL; // save the window handle HINSTANCE main_instance = NULL; // save the instance char buffer[80]; // used to print text LPDIRECTDRAW7 lpdd = NULL; // dd object LPDIRECTDRAWSURFACE7 lpddsprimary = NULL; // dd primary surface LPDIRECTDRAWSURFACE7 lpddsback = NULL; // dd back surface LPDIRECTDRAWPALETTE lpddpal = NULL; // a pointer to the created dd palette DDSURFACEDESC2 ddsd; // a direct draw surface description struct DDSCAPS2 ddscaps; // a direct draw surface capabilities struct HRESULT ddrval; // result back from dd calls short index ; // this will say what displaymode will be next by pressing F7 // FUNCTIONS ////////////////////////////////////////////// LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // this is the main message handler of the system PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to a device context // what is the message switch(msg) { case WM_CREATE: { // do initialization stuff here return(0); } break; case WM_PAINT: { // start painting hdc = BeginPaint(hwnd,&ps); // end painting EndPaint(hwnd,&ps); return(0); } break; case WM_DESTROY: { // kill the application PostQuitMessage(0); return(0); } break; default:break; } // end switch // process any messages that we didn't take care of return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc // WINMAIN //////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASS winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message HDC hdc; // generic dc PAINTSTRUCT ps; // generic paintstruct // first fill in the window class stucture winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; // register the window class if (!RegisterClass(&winclass)) return(0); // create the window, note the use of WS_POPUP if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class "WinX Game Console", // title WS_POPUP | WS_VISIBLE, 0,0, // x,y WINDOW_WIDTH, // width WINDOW_HEIGHT, // height NULL, // handle to parent NULL, // handle to menu hinstance,// instance NULL))) // creation parms return(0); // save the window handle and instance in a global main_window_handle = hwnd; main_instance = hinstance; // perform all game console specific initialization Game_Init(); // enter main event loop while(1) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // test if this is a quit if (msg.message == WM_QUIT) break; // translate any accelerator keys TranslateMessage(&msg); // send the message to the window proc DispatchMessage(&msg); } // end if // main game processing goes here Game_Main(); } // end while // shutdown game and release all resources Game_Shutdown(); // return to Windows like this return(msg.wParam); } // end WinMain int Video_Mode (short &numIndex) { if (numIndex > 4) numIndex = 1; else if (numIndex == 0) numIndex = 1; //numIndex sets the video mode switch (numIndex) { case 1 : if (lpdd->SetDisplayMode(800,600,16,0,0)!=DD_OK) return(0); break; case 2 : if (lpdd->SetDisplayMode(800,600,32,0,0)!=DD_OK) return(0); break; case 3 : if (lpdd->SetDisplayMode(1200,720,16,0,0)!=DD_OK) return(0); break; case 4 : if (lpdd->SetDisplayMode(1200,720,32,0,0)!=DD_OK) return(0); break; default : numIndex = 1; } numIndex += 1; //Optionwahl eine Zahl weiter }// end Video_Mode // WINX GAME PROGRAMMING CONSOLE FUNCTIONS //////////////// int Game_Init(void *parms) { // this function is where you do all the initialization // for your game // create object and test for error if (DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)!=DD_OK) return(0); // set cooperation level to windowed mode normal if (lpdd->SetCooperativeLevel(main_window_handle, DDSCL_ALLOWMODEX | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)!=DD_OK) return(0); // set the display mode if (lpdd->SetDisplayMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,0,0)!=DD_OK) return(0); // Create the primary surface memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if (lpdd->CreateSurface(&ddsd,&lpddsprimary,NULL)!=DD_OK) return(0); // return success return(1); } // end Game_Init /////////////////////////////////////////////////////////// int Game_Shutdown(void *parms) { // this function is where you shutdown your game and // release all resources that you allocated // first release the primary surface if (lpddsprimary!=NULL) lpddsprimary->Release(); // release the directdraw object if (lpdd!=NULL) lpdd->Release(); // return success return(1); } // end Game_Shutdown /////////////////////////////////////////////////////////// int Game_Main(void *parms) { // this is the workhorse of your game it will be called // continuously in real-time this is like main() in C // all the calls for you game go here! // check of user is trying to exit if (KEY_DOWN(VK_ESCAPE) || KEY_DOWN(VK_SPACE)) PostMessage(main_window_handle, WM_DESTROY,0,0); if (KEY_DOWN(VK_F7)) Video_Mode(index); // return success return(1); } // end Game_Main ///////////////////////////////////////////////////////////
Dieser Code stammt aus dem Buch "Game Programming für Dummies"
Ich dachte mir ich erstelle mir eine eine Funktion, die den Befehl SetDisplayMode so ausführt das man zwischen mehreren Auflösungen wechseln kann.
Es funktioniert aber nicht.
Das einzige was es machen kann ist kurz aufzuflimmern ; (
Ich hoffe ihr wisst da mehr : D