Archived

This topic is now archived and is closed to further replies.

Creating Windows, newbie question

This topic is 5820 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi ppl,my first time posting in thsi forum! well, I just started to learn to program (bought Tricks for windows game....) for windows and i have a question. how would i change this program so that if I close only one window, the whole program won't quit and it will only quit if i close both windows. Hope this comes out right... *crosses fingers* // INCLUDES //////////////////////////////////// #define WIN32_LEAN_AND_MEAN //no MFC #include #include #include #include // DEFINES ///////////////////////////////////// // define for windows #define WINDOW_CLASS_NAME "WINCLASS1" #define WINDOW_CLASS_NAME2 "WINCLASS2" // GLOBALS ///////////////////////////////////// // 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 success return(0); } break; case WM_PAINT: { // simply validate the window hdc = BeginPaint(hwnd,&ps); // you would do all your painting here EndPaint(hwnd,&ps); // return success return (0); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message PostQuitMessage(0); // return success 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) { WNDCLASSEX winclass, winclass2; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message // first fill in the window class structure winclass.cbSize = sizeof(WNDCLASSEX); 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; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // fill in the window class 2 structure winclass2.cbSize = sizeof(WNDCLASSEX); winclass2.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass2.lpfnWndProc = WindowProc; winclass2.cbClsExtra = 0; winclass2.cbWndExtra = 0; winclass2.hInstance = hinstance; winclass2.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass2.hCursor = LoadCursor(NULL, IDC_ARROW); winclass2.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winclass2.lpszMenuName = NULL; winclass2.lpszClassName = WINDOW_CLASS_NAME2; winclass2.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // register the window class if (!RegisterClassEx(&winclass)) return(0); if (!RegisterClassEx(&winclass2)) return(0); // create the window if (!(hwnd = CreateWindowEx(NULL, // extended style WINDOW_CLASS_NAME, // class "Window 1 based on WINCLASS1", // title WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // initial x,y 400,400, // initial width, height NULL, // handle to parent NULL, // handle to menu hinstance, //instance of this application NULL))) // extra creation parms return(0); // create the second window if (!(hwnd = CreateWindowEx(NULL, WINDOW_CLASS_NAME2, "Window 2 based on WINCLASS2", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100,100, 400,400, NULL, NULL, hinstance, NULL))) return(0); // enter main event loop while(TRUE) { 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 } // end while return(msg.wParam); } // end WinMain Edit: errrr....dang, what happened to my paragraphing!?!?! Hope it's not that hard to read. -_-; Edited by - Taralieth on January 1, 2002 12:50:26 PM Edited by - Taralieth on January 1, 2002 12:51:28 PM

Share this post


Link to post
Share on other sites
Well there are two things that come to mind you could do.

The first is assign one window to be the "main" window. This would be nice if you want one to close and the other to remain open, but if the "main" window is closed, the app shuts down. This is done by checking the handle of the window passed to the callback function to determine which window is asking to be closed. You can then decide whether to close the window and continue or close down the app.

The second solution would be able to close either window without consequence. To do this you could simply check on the state of the other window when one is asked to close. If the other window is closed as well, then the whole app terminates.

I wish i could show you some code, but I haven''t touched win32 in almost a year I''ve been writing so much and doing other stuff. Hell I''m just starting to get back into C++!! Hopefully others can help there.

_________________________________________________________________

Drew Sikora
A.K.A. Gaiiden

ICQ #: 70449988
AOLIM: DarkPylat

Blade Edge Software
Staff Member, GDNet
Public Relations, Game Institute

3-time Contributing author, Game Design Methods , Charles River Media (coming GDC 2002)
Online column - Design Corner at Pixelate

NJ IGDA Chapter - NJ developers unite!! [Chapter Home | Chapter Forum]

Share this post


Link to post
Share on other sites
OK, I'll try:

-In your globals variables add:

int createdWindows = 0;

- Every time you create a window:

createdWindows++;

-Inside WindowProc:

case WM_DESTROY:
createdWindows--;
if(createdWindows == 0)
PostQuitMessage(0);


Let me know if I undestood the question and if I helped!

Anyway, shouldn't you have another HWND for the second windows?



SKeTch

Edited by - sketchturner on January 1, 2002 3:22:17 PM

Edited by - sketchturner on January 1, 2002 3:22:43 PM

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
quote:
Original post by silent_whisper
a little bump because i am having a similar problem.

Um, it was answered. Rather than bumping, why don''t you read?

Share this post


Link to post
Share on other sites