// WinMain and object init #include #pragma hdrstop #include // Window::CreationWindow should be set LRESULT CALLBACK InitialisationProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { Window *CW=Window::CreationWindow; if ( iMessage == WM_CREATE ) { // Store a pointer to this object in the window's extra bytes; // this will enable us to access this object (and its member // functions) in WndProc where we are // given only a handle to identify the window. Window::CreationWindow=NULL; SetPointer( hWnd, CW ); // make sure hWnd is set of correct handling of WM_CREATE CW->hWnd=hWnd; // Now let the object perform whatever // initialization it needs for WM_CREATE in its own // WndProc. SetWindowLong(hWnd,GWL_WNDPROC,(long) MainWndProc); TMSG Msg={iMessage,wParam,lParam,0}; if (CW->WndProc(Msg)) return Msg.RetVal; } // The messages that // precede WM_CREATE must be processed without using pWindow so we // pass them to DefProc. return CW->DefProc( hWnd, iMessage, wParam, lParam ); } LRESULT CALLBACK MainWndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { // Pointer to the (C++ object that is the) window. Window *pWindow = GetPointer( hWnd ); TMSG Msg={iMessage,wParam,lParam,0}; if (pWindow->WndProc(Msg)) return Msg.RetVal; return pWindow->DefProc( hWnd, iMessage, wParam, lParam ); } // this may call the wrong proc (MDI frame or child, but so what??) LRESULT CALLBACK NullProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { return DefWindowProc( hWnd, iMessage, wParam, lParam ); } // WinMain ************************************* int Main(); int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ) { App::hInstance = hInstance; App::hPrevInstance = hPrevInstance; App::CmdLine = lpszCmdLine; App::nCmdShow = nCmdShow; int ret=Main(); // TextWindow open if (App::TextWindow && (App::TextWindow->StayOpen)) { App::TextWindow->Parent=NULL; App::MainWindow=(Object *) App::TextWindow; String S(GetWindowTextLength(App::MainWindow->hWnd)+1); GetWindowText(App::MainWindow->hWnd,S,S.Size()); S.Update(); S << " (finished)"; SetWindowText(App::MainWindow->hWnd,S); ShowWindow(App::MainWindow->hWnd, SW_SHOW ); // wait until closed return App::MessageLoop(); // delete App::TextWindow; ?? } return ret; }