www.pudn.com > tilesrc.zip > WinMain.cpp
///////////////////////////////////////////////////////////////////// // WinMain.cpp - minimal Win32 program // // This particular minimal Win32 implementation is based on André // LaMothe's code in Tricks of the Windows Game Programming Gurus. ///////////////////////////////////////////////////////////////////// // Don't use MFC for this project #define WIN32_LEAN_AND_MEAN #include// Basic Win32 Stuff #include // Some useful macros reside in here #include #include #include "TileEngine.h" // Our Tile Engine // Defines used for Window Details ///////////////////////////////// // Defines for windows interface ///////////////////////////////// // Note that this demo won't work too well if you change these #define WINDOW_CLASS_NAME "WIN3DCLASS" // class name #define WINDOW_TITLE "bEngine Demo" #define WINDOW_WIDTH 640 // size of window #define WINDOW_HEIGHT 480 #define WINDOW_BPP 16 // bitdepth of window (8,16,24 etc.) #define WINDOWED_APP FALSE // 0 not windowed, 1 windowed ///////////////////////////////// // Global Variables - I try and keep them to a minimum ///////////////////////////////// // This is the class that actually does all our work for us // It is defined in TileEngine.cpp/TileEngine.h CEngine *Engine; // Vital Win32 Functions - again, pretty minimal stuff 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) { // this is the winmain function WNDCLASS winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message // 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(hinstance, MAKEINTRESOURCE(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 test to see if WINDOWED_APP is // true to select the appropriate window flags if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class WINDOW_TITLE, // title (WINDOWED_APP ? (WS_OVERLAPPEDWINDOW) : (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); // Pass Window Handle, Instance & Window Description to our engine Engine = new CEngine(hwnd,hinstance,WINDOW_WIDTH,WINDOW_HEIGHT,WINDOW_BPP,WINDOWED_APP); // resize the window so that client is really width x height if (Engine->Windowed) { // now resize the window, so the client area is the actual size requested // since there may be borders and controls if this is going to be a windowed app // if the app is not windowed then it won't matter RECT window_rect = {0,0,Engine->ScreenWidth,Engine->ScreenHeight}; // make the call to adjust window_rect AdjustWindowRectEx(&window_rect, GetWindowStyle(hwnd), GetMenu(hwnd) != NULL, GetWindowExStyle(hwnd)); // save the global client offsets, they are needed in DDraw_Flip() Engine->SetClientParams(-window_rect.left,-window_rect.top); // now resize the window with a call to MoveWindow() MoveWindow(hwnd, 5, // x position 5, // y position window_rect.right - window_rect.left, // width window_rect.bottom - window_rect.top, // height FALSE); // show the window, so there's no garbage on first render ShowWindow(hwnd, SW_SHOW); } // end if windowed // perform all game console specific initialization Engine->GameInit(); // disable CTRL-ALT_DEL, ALT_TAB, comment this line out // if it causes your system to crash SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, NULL, 0); // 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 Engine->GameMain(); } // end while // shutdown game and release all resources Engine->GameDone(); delete Engine; // enable CTRL-ALT_DEL, ALT_TAB, comment this line out // if it causes your system to crash SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, NULL, 0); // return to Windows like this return(msg.wParam); } // end WinMain