[comp.windows.ms.programmer] HELLOWIN.C question

ie43gn12@serss0.fiu.edu (Student - 33) (03/20/91)

I have a question.  The following
code listing comes from pages 17-19 in Petzold's book "Programming
Windows".  According to the book, "the window displays 'Hello
 Windows!' in the center of its client area".  The painting of the 
text comes about when WndProc() gets the WM_PAINT message.  When
the program is initialized, the WM_PAINT message is sent
(according to my Windows Turbo Debugger) and the appropriate
DrawText() function is called but the text does not appear in the
window until a second WM_PAINT message is received (e.g. resizing
the window).  Can someone tell me why Windows behaves in this
fashion?

I am using the Borland C++ compiler with the Windows application
parameter of all functions exportable.


George Santamarina.
ie43gn12@serss0.fiu.edu


/* Hellowin.c

	Displays "Hello, Windows!" in client area

*/


#include <windows.h>

long FAR PASCAL WndProc(HWND, WORD, WORD, LONG);


int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
		LPSTR lpszCmdParam, int nCmdShow) {


	static char szAppName[]="HelloWin";

	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	if(!hPrevInstance) {

		wndclass.style		= CS_HREDRAW | CS_VREDRAW;
		wndclass.lpfnWndProc	= WndProc;
		wndclass.cbClsExtra	= 0;
		wndclass.cbWndExtra	= 0;
		wndclass.hInstance	= hInstance;
		wndclass.hIcon		= LoadIcon(NULL, IDI_APPLICATION);
		wndclass.hCursor	= LoadCursor(NULL, IDC_ARROW);
		wndclass.hbrBackground	= GetStockObject(WHITE_BRUSH);
		wndclass.lpszMenuName	= NULL;
		wndclass.lpszClassName	= szAppName;

		RegisterClass(&wndclass);

	}

	hwnd=CreateWindow(szAppName,		// window class name
		"The Hello Program",		// window caption
		WS_OVERLAPPEDWINDOW,		// window style
		CW_USEDEFAULT,			// initial x position
		CW_USEDEFAULT,			// initial y position
		CW_USEDEFAULT,			// initial x size
		CW_USEDEFAULT,			// initial y size
		NULL,				// parent window handle
		NULL,				// window menu handle
		hInstance,			// program instance handle
		NULL);				// creation parameters

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0)) {

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}

	return msg.wParam;

}

long FAR PASCAL WndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) {

	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;

	switch(message) {

		case WM_PAINT:

			hdc=BeginPaint(hwnd, &ps);
			GetClientRect(hwnd, &rect);
			DrawText(hdc, "Hello Windows!", -1, &rect,
				DT_SINGLELINE | DT_CENTER | DT_VCENTER);

			EndPaint(hwnd, &ps);
			return (0);

		case WM_DESTROY:

			PostQuitMessage(0);
			return (0);

	}

	return DefWindowProc(hwnd, message, wParam, lParam);

}


;-------------------------------------
; HELLOWIN.DEF module definition file
;-------------------------------------

NAME		HELLOWIN
DESCRIPTION     'Hello Windows Program (c) Charles Petzold, 1990'
EXETYPE		WINDOWS
CODE		PRELOAD MOVEABLE DISCARDABLE
DATA		PRELOAD MOVEABLE MULTIPLE
HEAPSIZE	1024
STACKSIZE	8192

--
------------------------------------------------------------------------
George Santamarina 			INTERNET:ie43gn12@serss0.fiu.edu
"Life is only as good as you want to make it" - Unknown 

ebergman@isis.cs.du.edu (Eric Bergman-Terrell) (03/24/91)

Problems with dialogs often result from failing to "export" the
functions that manage the dialogs.

See Petzold, p. 19 - add the export line to your .def file.  That'll
probably fix your problem.

Terrell