MDI and Win32 API....

Started by
3 comments, last by Mike 22 years, 8 months ago
The code:
  
#include 

#define APP_NAME	"server_test"
#define APP_WIDTH	300
#define APP_HEIGHT	200
#define APP_X		(GetSystemMetrics( SM_CXSCREEN )-APP_WIDTH)>>1
#define APP_Y		(GetSystemMetrics( SM_CYSCREEN )-APP_HEIGHT)>>1

#define CHAT_SERVER_NAME "chat_server"

HWND g_hWnd;
HWND g_mdi;

LRESULT CALLBACK ChatProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	return DefMDIChildProc( hWnd, msg, wParam, lParam );
}

LRESULT CALLBACK WinProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch( msg )
	{
	case WM_CLOSE:
		PostQuitMessage( 0 );
		return 0;

	default:
		return DefFrameProc( hWnd, g_mdi, msg, wParam, lParam );
	}
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
	WNDCLASS	wc;
	MSG			msg;

	wc.cbClsExtra		= NULL;
	wc.cbWndExtra		= NULL;
	wc.hbrBackground	= (HBRUSH)GetStockObject( GRAY_BRUSH );
	wc.hCursor			= LoadCursor( NULL, IDC_ARROW );
	wc.hIcon			= LoadIcon( NULL, IDI_APPLICATION );
	wc.hInstance		= hInstance;
	wc.lpfnWndProc		= WinProc;
	wc.lpszClassName	= APP_NAME;
	wc.lpszMenuName		= NULL;
	wc.style			= CS_HREDRAW | CS_VREDRAW;

	RegisterClass( &wc );

	wc.cbClsExtra		= NULL;
	wc.cbWndExtra		= NULL;
	wc.hbrBackground	= (HBRUSH)GetStockObject( GRAY_BRUSH );
	wc.hCursor			= LoadCursor( NULL, IDC_ARROW );
	wc.hIcon			= LoadIcon( NULL, IDI_APPLICATION );
	wc.hInstance		= hInstance;
	wc.lpfnWndProc		= ChatProc;
	wc.lpszClassName	= CHAT_SERVER_NAME;
	wc.lpszMenuName		= NULL;
	wc.style			= CS_HREDRAW | CS_VREDRAW;

	RegisterClass( &wc );

	g_hWnd = CreateWindow( APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, APP_X, APP_Y,
							 APP_WIDTH, APP_HEIGHT, NULL, NULL, hInstance, NULL );

	ShowWindow( g_hWnd, SW_SHOW );
	UpdateWindow( g_hWnd );

	CLIENTCREATESTRUCT ccs;

	ccs.hWindowMenu		= NULL;
	ccs.idFirstChild	= 50000;

	g_mdi = CreateWindow( "MDICLIENT", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
							0, 0, 0, 0, g_hWnd, NULL, hInstance, (LPSTR)&ccs );

	MDICREATESTRUCT mdic;

	mdic.cx			= 100;
	mdic.cy			= 100;
	mdic.hOwner		= hInstance;
	mdic.lParam		= NULL;
	mdic.style		= NULL;
	mdic.szClass	= CHAT_SERVER_NAME;
	mdic.szTitle	= "Chat Server Window";
	mdic.x			= 10;
	mdic.y			= 10;

	HWND c = (HWND)SendMessage( g_mdi, WM_MDICREATE, NULL, (LPARAM)(LPMDICREATESTRUCT)&mdic );

	while( GetMessage( &msg, 0, 0, 0 ) )
	{
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}

	return msg.wParam;
}
 
The Problem: When you run the program it does not show the MDI child window until you either resize the window or minimize and maximize the main window. What in the heck am I missing? Edited by - mike on August 8, 2001 10:42:01 AM
Advertisement
What you''re missing, is that you''re making an MDI app in win32 when MFC has been working on it and doing a much better job of it than you have, for years...

G''luck,
-Alamar
okay, now that i''ve heard the mfc advertisement, does anyone with any actually knowladge care to give me a helping hand? I know that MFC does MDI much better. So does VB for that matter. For what I''m doing I do not want the extra fluff indtroduced by MFC.
quote:Original post by Mike
okay, now that i''ve heard the mfc advertisement


LOL thats a clasic well done


~prevail by daring to fail~
The problem is the way you create your client window. You make it a rectangle with coordinates (0, 0) - (0, 0). When you call resize, it automatically gets bigger (to match the window size), so then the child window (which is always created) becomes visible.

Change:

g_mdi = CreateWindow( "MDICLIENT", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, g_hWnd, NULL, hInstance, (LPSTR)&ccs );

to:

g_mdi = CreateWindow( "MDICLIENT", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, APP_WIDTH, APP_HEIGHT, g_hWnd, NULL, hInstance, (LPSTR)&ccs );

And it works.

This topic is closed to new replies.

Advertisement