#include <windows.h>
#include <commdlg.h>

typedef struct
{
  HANDLE  hInstance;
  HWND    hMainWnd;
  HMENU   hMainMenu;
} GLOBALS;

GLOBALS Globals;

BOOL FileOpen(HWND hWnd)
{
  char filename[80] = "test.c";
  OPENFILENAME ofn = { sizeof(OPENFILENAME),
		       hWnd, NULL, "C code\0*.c\0", NULL, 0, 0, filename, 80,
		       NULL, 0, NULL, NULL, OFN_CREATEPROMPT |
		       OFN_SHOWHELP, 0, 0, NULL, 0, NULL };
  return GetOpenFileName(&ofn);
}

LRESULT CALLBACK DlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
	case WM_INITDIALOG:
	    break;
	case WM_COMMAND:
	    switch (wParam)
	    {
		case 100:
		    EndDialog(hWnd, 100);
		    return TRUE;
	    }
    }
    return FALSE;
}

LRESULT CALLBACK WndProc (HWND wnd, UINT msg, WPARAM w, LPARAM l)
{
    switch (msg){

	case WM_COMMAND:
	switch(w){
		case 100:
			DialogBox(Globals.hInstance,
				"DIADEMO", wnd,
				(DLGPROC)DlgProc);
			return 0;
		case 101:
		{
			HDC hdc, hMemDC;
			HBITMAP hBitmap, hPrevBitmap;
			BITMAP bmp;

			hBitmap = LoadBitmapA (Globals.hInstance, "BITDEMO");
			hdc = GetDC (wnd);
			hMemDC = CreateCompatibleDC (hdc);
			hPrevBitmap = SelectObject (hMemDC, hBitmap);
			GetObjectA (hBitmap, sizeof(BITMAP), &bmp);
			BitBlt (hdc, 0, 0, bmp.bmWidth, bmp.bmHeight,
				hMemDC, 0, 0, SRCCOPY);
			SelectObject (hMemDC, hPrevBitmap);
			DeleteDC (hMemDC);
			ReleaseDC (wnd, hdc);
			return 0;
		}
	        case 102:
		        FileOpen(wnd);
			return 0;
		default:
			return DefWindowProc (wnd, msg, w, l);
	}
    case WM_DESTROY:
	PostQuitMessage (0);
	break;

    default:
	return DefWindowProc (wnd, msg, w, l);
    }
    return 0l;
}

int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
{
    MSG      msg;
    WNDCLASS class;
    char className[] = "class";  /* To make sure className >= 0x10000 */
    char winName[] = "Test app";

    Globals.hInstance = inst;
    if (!prev){
	class.style = CS_HREDRAW | CS_VREDRAW;
	class.lpfnWndProc = WndProc;
	class.cbClsExtra = 0;
	class.cbWndExtra = 0;
	class.hInstance  = inst;
	class.hIcon      = LoadIcon (0, IDI_APPLICATION);
	class.hCursor    = LoadCursor (0, IDC_ARROW);
	class.hbrBackground = GetStockObject (WHITE_BRUSH);
	class.lpszMenuName = 0;
	class.lpszClassName = className;
    }
    if (!RegisterClass (&class))
	return FALSE;

    Globals.hMainWnd = CreateWindow (className, winName, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 
			LoadMenu(inst,"MAIN"), inst, 0);
    ShowWindow (Globals.hMainWnd, show);
    UpdateWindow (Globals.hMainWnd);

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