Archived

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

Mike

MDI and Win32 API....

Recommended Posts

Mike    141
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

Share this post


Link to post
Share on other sites
Alamar    256
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

Share this post


Link to post
Share on other sites
Mike    141
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.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
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.

Share this post


Link to post
Share on other sites