Results 1 to 2 of 2

Thread: MDI Status Bar

  1. #1

    Thread Starter
    Frenzied Member
    Join Date
    Aug 2000
    Location
    Birmingham, AL
    Posts
    1,276

    Question MDI Status Bar

    If you Tile the MDI children from the menu or maximize one of
    them, they cover up the Status Bar.

    How can I prevent this?

    Code:
    
    
    #include <windows.h>
    #include <commctrl.h>
    
    
    #define WIN_CLASS_NAME			"Main Window"
    #define WIN_MDI_CHILD			"Child MDI Window"
    #define ID_CLIENT				10
    #define IDM_WINDOWCHILD			200     
    
    
    #define CM_MENU_FILE_EXIT		1001  
    #define CM_MENU_FILE_NEW		1004      
    #define CM_MENU_FILE_CLOSE		1005  
    #define CM_MENU_WINDOW_TILEH	1030
    #define CM_MENU_WINDOW_TILEV	1031  
    #define CM_MENU_WINDOW_CASCADE	1032
    #define CM_MENU_WINDOW_ARRANGE	1033  
    #define CM_MENU_HELP_ABOUT		1060     
    
    #define IDC_EDIT				5000
    #define IDC_STATUSBAR			5001
    
    
    HWND hWndMain;  
    HINSTANCE hInst;  
    HWND hWndClient;  
    HWND hWndStatusBar;             
    HWND hWndMDI;       
    HMENU hMenuMain;           
    HMENU hMenuFile;            
    HMENU hMenuWindow;            
    HMENU hMenuHelp;           
    
    MDICREATESTRUCT mcs;             //MDI Structure
    
    //Procedure Prototypes:
    LRESULT CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
    LRESULT CALLBACK MDIChildWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
    
    
    int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,
    				   LPSTR lpcmdline,int ncmdshow)
    {
    	HWND	   hwnd;
    	MSG		   msg;
    	
    	WNDCLASS winclass;
    	
    	/*---------Main Window--------------------------------------------------------*/
    	winclass.style		   	  = CS_DBLCLKS;
    	winclass.lpfnWndProc   	= MainWindowProc;
    	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(GRAY_BRUSH);
    	winclass.lpszMenuName	  = NULL;
    	winclass.lpszClassName	= WIN_CLASS_NAME;
    	
    	hInst = hinstance;
    	
    	if (!RegisterClass(&winclass))
    		return(0);
    	/*----------------------------------------------------------------------------*/
    	/******************************************************************************/
    	/*---------MDI Child Window---------------------------------------------------*/
    	winclass.lpfnWndProc   = (WNDPROC) MDIChildWndProc;
    	winclass.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
    	winclass.lpszMenuName  = (LPCTSTR) NULL;
    	winclass.lpszClassName = WIN_MDI_CHILD;
    	
    	if (!RegisterClass(&winclass))
    		return(0);
    	/*----------------------------------------------------------------------------*/
    	/******************************************************************************/
    	
    	if (!(hwnd = CreateWindowEx(NULL,WIN_CLASS_NAME,
    		"MDI Window",
    		WS_TILEDWINDOW | WS_MAXIMIZEBOX | WS_SIZEBOX ,
    		0 ,0 ,800,400,NULL,NULL,hinstance,NULL)))
    		return(0);
    	
    	hWndMain = hwnd;
    
    	INITCOMMONCONTROLSEX initControls;
    
    	initControls.dwICC = ICC_BAR_CLASSES;
    	initControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
    	InitCommonControlsEx(&initControls);
    	
    	
    	/*             MDI message loop        */
    	while (GetMessage(&msg, (HWND) NULL, 0, 0))
    	{
    		if (!TranslateMDISysAccel(hWndClient, &msg))
    		{
    			TranslateMessage(&msg); 
    			DispatchMessage(&msg); 
    		} 
    	}
    	/*             instead of              */
    	/*
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    	TranslateMessage(&msg);
    	DispatchMessage(&msg);
    	}
    	*/
    	
    	return(msg.wParam);
    }
    
    
    
    LRESULT CALLBACK MainWindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {
    
    	switch(msg)
    	{
    	case WM_CREATE:
    		{
    			int cx, cy;
    			RECT rct;
    			/*-------------MAIN MENU------------------------------------------------*/
    			//simple menu creation
    			hMenuMain = CreateMenu();
    			hMenuFile = CreatePopupMenu();
    			hMenuWindow = CreatePopupMenu();
    			hMenuHelp = CreatePopupMenu();
    			
    			AppendMenu(hMenuFile, MF_STRING, CM_MENU_FILE_NEW, "&New");
    			AppendMenu(hMenuFile, MF_STRING, CM_MENU_FILE_CLOSE, "&Close");
    			AppendMenu(hMenuFile, MF_SEPARATOR, NULL, NULL);
    			AppendMenu(hMenuFile, MF_STRING, CM_MENU_FILE_EXIT, "&Exit");
    			
    			AppendMenu(hMenuWindow, MF_STRING, CM_MENU_WINDOW_TILEH, "Tile &Horizontally");
    			AppendMenu(hMenuWindow, MF_STRING, CM_MENU_WINDOW_TILEV, "Tile &Vertically");
    			AppendMenu(hMenuWindow, MF_STRING, CM_MENU_WINDOW_CASCADE, "&Cascade");
    			AppendMenu(hMenuWindow, MF_STRING, CM_MENU_WINDOW_ARRANGE, "&Arrange");
    			
    			AppendMenu(hMenuHelp, MF_STRING, CM_MENU_HELP_ABOUT, "&About");
    			
    			AppendMenu(hMenuMain, MF_STRING | MF_POPUP, (UINT)hMenuFile, "&File");
    			AppendMenu(hMenuMain, MF_STRING | MF_POPUP, (UINT)hMenuWindow, "&Window");
    			AppendMenu(hMenuMain, MF_STRING | MF_POPUP, (UINT)hMenuHelp, "&Help");
    			
    			SetMenu(hwnd, hMenuMain);
    			/*----------------------------------------------------------------------*/
    			/************************************************************************/
    			/*-------------MDI hWndClient-----------------------------------------------*/
    			CLIENTCREATESTRUCT ccs;                     //hWndClient structure init
    			
    			ccs.hWindowMenu = hMenuWindow;             //menu to append window names
    			ccs.idFirstChild = IDM_WINDOWCHILD;         //mdi window id start uint
    			
    			hWndClient = CreateWindowEx(WS_EX_CLIENTEDGE, "MDIClient", (LPCTSTR) NULL,
    				WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
    				0, 0, 0, 0,
    				hwnd, (HMENU) ID_CLIENT, hInst, (LPSTR) &ccs);
    			
    			
    			hWndStatusBar = CreateWindow(STATUSCLASSNAME, "",
    				SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, 
    				hwnd, (HMENU)IDC_STATUSBAR, hInst, NULL);
    			
    			ShowWindow(hWndClient, SW_SHOW);                //show the hWndClient
    			/*----------------------------------------------------------------------*/
    			/************************************************************************/
    			
    			GetWindowRect(hwnd, &rct);
    			
    			cx = GetSystemMetrics(SM_CXSCREEN);
    			cy = GetSystemMetrics(SM_CYSCREEN);
    			cx = (int)(double)(cx / 2) - (double)((rct.right - rct.left) / 2);
    			cy = (int)(double)(cy / 2) - (double)((rct.bottom - rct.top) / 2);
    			
    			MoveWindow(hwnd, cx, cy, rct.right - rct.left, rct.bottom - rct.top, TRUE);
    			
    			
    			
    			ShowWindow(hwnd, SW_SHOW);
    		}
    		break;
    	case WM_SIZE:
    		{
    			SendMessage(hWndStatusBar, WM_SIZE, 0, 0);
    		}
    		break;
        case WM_COMMAND:
    		{
    			/*-------------Main Menu------------------------------------------------*/
    			if(LOWORD(wparam)== CM_MENU_FILE_NEW)       //new mdi window
    			{
    				mcs.szTitle = "Untitled";               //fill the mdi struct
    				mcs.szClass = WIN_MDI_CHILD;              //class name
    				mcs.hOwner = hInst;              //application instance
    				mcs.x = CW_USEDEFAULT;                    //x
    				mcs.y = CW_USEDEFAULT;                    //y
    				mcs.cx = CW_USEDEFAULT;                   //cx
    				mcs.cy = CW_USEDEFAULT;                   //cy
    				mcs.style = MDIS_ALLCHILDSTYLES;          //style
    				
    				SendMessage(hWndClient, WM_MDICREATE, 0, (LONG)&mcs);  //create the mdi child
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_FILE_CLOSE)     //close
    			{
    				SendMessage(hWndMDI, WM_CLOSE, 0, 0);  //hWndMDI tracks active mdi child
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_FILE_EXIT)      //exit
    			{
    				SendMessage(hwnd, WM_CLOSE, 0, 0);
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_WINDOW_TILEH)   //tile horizontally
    			{
    				PostMessage(hWndClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_WINDOW_TILEV)   //tile vertically
    			{
    				PostMessage(hWndClient, WM_MDITILE, MDITILE_VERTICAL, 0);
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_WINDOW_CASCADE) //cascade
    			{
    				PostMessage(hWndClient, WM_MDICASCADE, 0, 0);
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_WINDOW_ARRANGE) //arrange -defined but doesnt
    				//do anything?
    			{
    				PostMessage(hWndClient, WM_MDIICONARRANGE, 0, 0);
    				break;
    			}
    			if(LOWORD(wparam)== CM_MENU_HELP_ABOUT)     //about box
    			{
    				MessageBox(hwnd, "MDI Application Shell", "About:", MB_OK);
    				break;
    			}
    			/*----------------------------------------------------------------------*/
    			/************************************************************************/
    		}
    		break;
        case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			
    			return(0);
    		}
    		break;
      }
      /* new */
      return (DefFrameProc(hwnd, hWndClient, msg, wparam, lparam));
      /* old */
      //return (DefWindowProc(hwnd, msg, wparam, lparam));
    }
    
    
    
    
    RECT rect;
    
    
    LRESULT CALLBACK MDIChildWndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
    {
    	switch(msg)
    	{
        case WM_CREATE:
    		{
    			
    			HFONT hFont = CreateFont(10,0,0,0,0,0,0,0,0,0,0,0,0,"Courier");
    			
    			GetClientRect(hwnd, &rect);
    			
    			CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    				WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL 
    				| ES_MULTILINE | ES_WANTRETURN,
    				0, 0, rect.right - rect.left, rect.bottom - rect.top,
    				hwnd, (HMENU)IDC_EDIT, hInst, NULL);
    			
    			SendDlgItemMessage(hwnd, IDC_EDIT, WM_SETFONT, (WPARAM)hFont, 0);
    			
    			ShowWindow(hwnd, SW_SHOW);
    			hWndMDI = hwnd;                 //set this to active
    		}break;
        case WM_MDIACTIVATE:
    		{
    			hWndMDI = hwnd;                 //set this to active
    		}break;
    	case WM_SIZE:
    		{
    			GetClientRect(hwnd, &rect);
    			MoveWindow(GetDlgItem(hwnd, IDC_EDIT), 0, 0, rect.right - rect.left, 
    				rect.bottom - rect.top, TRUE);
    			break;
    		}
        case WM_SYSCOMMAND:
    		{
    			if(wparam == SC_CLOSE)
    			{
    				SendMessage(hwnd, WM_CLOSE, 0, 0);
    			}
    		}break;
    	}
    	return DefMDIChildProc(hwnd, msg, wparam, lparam);
    }
    Attached Files Attached Files

  2. #2
    Kitten CornedBee's Avatar
    Join Date
    Aug 2001
    Location
    In a microchip!
    Posts
    11,594
    Catch the WM_NCCALCSIZE message. This is where the client rectangle of your app is calculated. If you don't catch it DefWindowProc will simply take the inner edge of your window's frame, take away the menu bar and this is it. If you add anything else, like tool bars or status bars then you have to do the calculation yourself.

    I think the MDI client automatically adjusts its size using GetClientRect, so that should be all you have to do.
    All the buzzt
    CornedBee

    "Writing specifications is like writing a novel. Writing code is like writing poetry."
    - Anonymous, published by Raymond Chen

    Don't PM me with your problems, I scan most of the forums daily. If you do PM me, I will not answer your question.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width