Win32 question - MDI

Started by
1 comment, last by Russell 22 years, 6 months ago
I''m writing a program using MDI (Multiple Document Interface) and I''m getting some rather odd behavior. It works fine, until I do the following: Create 2 (or more) MDI child windows Maximize 1 of the MDI child windows Close the maximized MDI child window Then it proceeds to close ALL MDI child windows. Any ideas why this might be happening?
Advertisement
Kind of short on time, but see if you are doing all of the following.

Use DefFrameProc instead of DefWindowProc in your frame window.
In your child window, use DefMDIChildProc.

Just return 0 in your WM_DESTROY message in your child window proc.

Also, make sure you are allocating memory for each of your child windows.

Finally, remember to use MDICREATESTRUCT and pass messages such as WM_MDICREATE rather than WM_CREATE.
I have no idea what the problem is. Maybe someone can find out what the problem is.

  #include <windows.h>#include <string>#include "resource.h"using namespace std;#define	ID_MDI_FIRSTCHILD	50000HWND		mainWindow;HWND		mdiClient;HINSTANCE	appInstance;char		children = ''1'';LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam){	switch(msg)	{			case WM_CREATE:		{			CLIENTCREATESTRUCT ccs;						ccs.hWindowMenu		= GetSubMenu(GetMenu(hwnd), 1);			ccs.idFirstChild	= ID_MDI_FIRSTCHILD;			mdiClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,				CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, appInstance, (LPVOID)&ccs);			ShowWindow(mdiClient, SW_SHOW);		} break;		case WM_PAINT: 		{			PAINTSTRUCT		ps;			HDC				hdc;			hdc = BeginPaint(hwnd, &ps);	 		    EndPaint(hwnd, &ps);		} break;		case WM_DESTROY: 		{			PostQuitMessage(0);		} break;		case WM_COMMAND:		{			switch(LOWORD(wparam))			{				case FILE_EXIT:				{					PostMessage(hwnd, WM_CLOSE, 0, 0);				} break;				case FILE_NEW:				{					MDICREATESTRUCT	mcs;					HWND			hchild;					string			title;					title = "Untitled";					title += children;					mcs.szTitle		= title.c_str();					mcs.szClass		= "mdiChild";					mcs.hOwner		= appInstance;					mcs.x			= CW_USEDEFAULT;					mcs.y			= CW_USEDEFAULT;					mcs.cx			= CW_USEDEFAULT;					mcs.cy			= CW_USEDEFAULT;					mcs.style		= MDIS_ALLCHILDSTYLES;					hchild = (HWND)SendMessage(mdiClient, WM_MDICREATE, 0, (LONG)&mcs);					if(!hchild)					{						MessageBox(hwnd, "Could not create MDI Child", "Error", MB_ICONEXCLAMATION | MB_OK);					}									} break;				case WINDOW_CASCADE:				{					PostMessage(mdiClient, WM_MDICASCADE, 0, 0);				} break;				case WINDOW_TILEH:				{					PostMessage(mdiClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);				} break;				case WINDOW_TILEV:				{					PostMessage(mdiClient, WM_MDITILE, MDITILE_VERTICAL, 0);				} break;							default:				{					if(LOWORD(wparam) >= ID_MDI_FIRSTCHILD)					{						DefFrameProc(hwnd, mdiClient, msg, wparam, lparam);					}					else					{						HWND hChild;						hChild = (HWND)SendMessage(mdiClient, WM_MDIGETACTIVE,0,0);						if(hChild)						{							SendMessage(hChild, WM_COMMAND, wparam, lparam);						}					}				}			}		} break;		default:break;    }	return DefFrameProc(hwnd, mdiClient, msg, wparam, lparam);}LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam){	switch(msg)	{		case WM_CREATE:		{			children++;		} break;		case WM_SIZE:		{					} break;		case WM_MDIACTIVATE:		{		} break;		case WM_SETFOCUS:		{		} break;		case WM_COMMAND:		{		} break;		case WM_CLOSE:		{			int result;						result = MessageBox(hwnd, "Are you sure you want to close this window?", "Confirmation", MB_YESNO);			if(result == IDNO)				return 0;			else				children--;		} break;		default: break;	}	return DefMDIChildProc(hwnd, msg, wparam, lparam);}int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow){	WNDCLASSEX winclass;	MSG		   msg;	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)(COLOR_3DSHADOW+1);	winclass.lpszMenuName	= MAKEINTRESOURCE(IDR_MENU1);	winclass.lpszClassName	= "winclass1";	winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);	if(!RegisterClassEx(&winclass))	{		MessageBox(NULL, "Could not register main window class", "Error", MB_ICONEXCLAMATION | MB_OK);		return 0;	}	winclass.lpfnWndProc	= MDIChildWndProc;	winclass.lpszMenuName	= NULL;	winclass.lpszClassName	= "mdiChild";	winclass.hbrBackground	= (HBRUSH)(COLOR_3DFACE+1);	if(!RegisterClassEx(&winclass))	{		MessageBox(NULL, "Could not register MDI child window class", "Error", MB_ICONEXCLAMATION | MB_OK);		return 0;	}	mainWindow = CreateWindowEx(NULL, "winclass1", "Winserv", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_MAXIMIZE, 		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL);	ShowWindow(mainWindow, SW_MAXIMIZE);	if (!mainWindow)	{		MessageBox(NULL, "Could not create main window", "Error", MB_ICONEXCLAMATION | MB_OK);		return 0;	}	appInstance = hinstance;	while(GetMessage(&msg, NULL, 0, 0))	{		if(!TranslateMDISysAccel(mdiClient, &msg))		{			TranslateMessage(&msg);			DispatchMessage(&msg);		}	}	return(msg.wParam);}  

This topic is closed to new replies.

Advertisement