MAIN.CPP

////////////////////////////////////////////////////////////////////////////// 
//
// FILE: MAIN.CPP
//
// DESCRIPTION: This file contains the code for the entry function and
// the main window for this form
//
//
// Copyright (c) 1995, Microsoft Corporation.
// All rights reserved.
//
//--

#include "precomp.h"
#include <wrap3d.h>

// Just to make it easier to determine appropriate code paths:
#if defined (_WIN32) // This had better be true, but just in case...
#define IS_WIN32 TRUE
#else
#define IS_WIN32 FALSE
#endif
#define IS_NT IS_WIN32 && (BOOL)(GetVersion() < 0x80000000)
#define IS_WIN32S IS_WIN32 && (BOOL)(!(IS_NT) && (LOBYTE(LOWORD(GetVersion()))<4))
#define IS_CHICAGO (BOOL)(!(IS_NT) && !(IS_WIN32S)) && IS_WIN32

///////////////////////// Global Variables /////////////////////////////////

extern CClassFactory ClassFactory;
HINSTANCE g_hinst;
char SzAppName[] = "SimpFrm"; // The name of this application
char g_szSendWinClass[] = "SampleFormSend";
char g_szReadWinClass[] = "SampleFormRead";
char g_szFormName[] = "Simple Sample Form";
char g_szWindowCaption[] = "Sample Form";
CBaseForm * g_PfrmFirst = NULL;
LPVOID g_lpCtl3d = NULL; // CTL3D context

//// Internal Flags

ULONG UlCoRegForm = 0;
BOOL FMapiInitialized = FALSE;

//we have to create an atom containig string representation of
// the class id; the atom has to have the same live time as the
//ClassFactory object
static ATOM atmCFAlive;

//////////////////////////// Extern and forward declarations //////////////

LRESULT CALLBACK WndProcMain(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProcForm(HWND, UINT, WPARAM, LPARAM);

//// InitApplication
//

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASSEX wc;

// Fill in the window class structure with parameters that describe
// the main window. This window will never be displayed and exists
// so that OLE can talk to us.

wc.cbSize = sizeof(wc);
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProcMain;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = SzAppName;
wc.hIconSm = LoadIcon(hInstance, "SmallIcon");

// Register the window class.
if (!RegisterClassEx(&wc))
{
return FALSE;
}

// Now setup and register the acutual window class used for the
// form.

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpszClassName = g_szSendWinClass;
wc.lpfnWndProc = (WNDPROC) WndProcForm;
wc.cbWndExtra = 4;
wc.hIcon = LoadIcon(hInstance, "IconL");
// if (IS_CHICAGO) {
// wc.lpszMenuName = "CHICAGO";
// }
// else {
wc.lpszMenuName = MAKEINTRESOURCE(IDR_SEND_FORM);
// }

if (!RegisterClassEx(&wc))
{
return FALSE;
}

// Now setup and register the acutual window class used for the
// form.

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpszClassName = g_szReadWinClass;
wc.lpfnWndProc = (WNDPROC) WndProcForm;
wc.cbWndExtra = 4;
wc.hIcon = LoadIcon(hInstance, "IconL");
// if (IS_CHICAGO) {
// wc.lpszMenuName = "CHICAGO";
// }
// else {
wc.lpszMenuName = MAKEINTRESOURCE(IDR_READ_FORM);
// }

return RegisterClassEx(&wc);
}

//// InitInstance
//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HRESULT hr;
ULONG ulVer;
HWND hWnd;
BOOL f;

///////////////////////////////////////////////////////////////////////
//
// Initialize OLE and MAPI

ulVer = CoBuildVersion ();
#if 0
if (HIWORD (ulVer) != rmm)
{
return FALSE;
}
#endif // 0

//
// Initialize MAPI -- this implies a successfull initialization of
// OLE on success
//

hr = MAPIInitialize (NULL);
if (HR_FAILED(hr))
{
return FALSE;
}
FMapiInitialized = TRUE;

//
// Give ourselves the 3D look
//

if (!g_lpCtl3d)
{
g_lpCtl3d = CTL3D_Initialize(hInstance);
if (g_lpCtl3d)
CTL3D_AutoSubclass(g_lpCtl3d, hInstance, &f);
}


//Create global atom with string representaton of our class id
if(0 == FindAtom(szGUID))
atmCFAlive = GlobalAddAtom(szGUID);


//
// Register our class factory for the form
//

hr = CoRegisterClassObject(CLSID_IPM_NOTE_SAMPLE, &ClassFactory,
CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE,
&UlCoRegForm);
if (FAILED(hr))
{
return FALSE;
}

//
// Create a main window -- This window is used for dealing with
// messages coming from the top of the work and consitutes
// our main window. We create this window of size zero and
// not visible since it is not the window the user
// interacts with

hWnd = CreateWindow(SzAppName, NULL, WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}

ClassFactory.ms_hWndMain = hWnd;
g_hinst = hInstance;

return TRUE;
}


int ExitInstance ()
{
//
// Revoke all classes factories here so we don't get any new
// creates

if (UlCoRegForm != 0)
{
CoRevokeClassObject (UlCoRegForm);
UlCoRegForm = 0;
}

//
// Shut down CTL3D

if (g_lpCtl3d)
{
CTL3D_Uninitialize(g_lpCtl3d);
g_lpCtl3d = NULL;
}

//
// Uninitialize MAPI

if (FMapiInitialized)
{
MAPIUninitialize();
FMapiInitialized = FALSE;
}

GlobalDeleteAtom(atmCFAlive);

return 0;
}


//// WinMain
//

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR /*lpCmdLine*/, int nCmdShow)
{
MSG msg;

if (!hPrevInstance)
{
// Perform instance initialization
if (!InitApplication(hInstance))
{
return FALSE;
}
}

// Perform application initialization
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}


// Main message loop
while (GetMessage(&msg, NULL, 0, 0))
{
CBaseForm * pfrm;

//
// Find which top level window this message is for
//

for (pfrm = g_PfrmFirst; pfrm != NULL; pfrm = pfrm->GetNext())
{
if (pfrm->TranslateMessage(msg))
{
break;
}
}

if (pfrm == NULL)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

ExitInstance();

return msg.wParam;
}



//// A specialized version of the window proc which plays how messages
// are going to be handled.
//

LRESULT CALLBACK WndProcMain(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc (hwnd, msg, wParam, lParam);
}

return 0;
}