234 lines
5.3 KiB
C
234 lines
5.3 KiB
C
|
/*
|
||
|
* INIT.C
|
||
|
* GizmoBar Version 1.00, Win32 version August 1993
|
||
|
*
|
||
|
* LibMain entry point and initialization code for the GizmoBar
|
||
|
* DLL that is likely to be used once or very infrequently.
|
||
|
*
|
||
|
* Copyright (c)1993 Microsoft Corporation, All Rights Reserved
|
||
|
*
|
||
|
* Kraig Brockschmidt, Software Design Engineer
|
||
|
* Microsoft Systems Developer Relations
|
||
|
*
|
||
|
* Internet : kraigb@microsoft.com
|
||
|
* Compuserve: >INTERNET:kraigb@microsoft.com
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include "gizmoint.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
* LibMain
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Entry point conditionally compiled for Windows NT and Windows
|
||
|
* 3.1. Provides the proper structure for each environment
|
||
|
* and calls InternalLibMain for real initialization.
|
||
|
*/
|
||
|
|
||
|
#ifdef WIN32
|
||
|
BOOL _cdecl LibMain(
|
||
|
HINSTANCE hDll,
|
||
|
DWORD dwReason,
|
||
|
LPVOID lpvReserved)
|
||
|
{
|
||
|
if (DLL_PROCESS_ATTACH == dwReason)
|
||
|
{
|
||
|
return FRegisterControl(hDll);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
HANDLE FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg
|
||
|
, WORD cbHeapSize, LPSTR lpCmdLine)
|
||
|
{
|
||
|
//Perform global initialization.
|
||
|
if (FRegisterControl(hInstance))
|
||
|
{
|
||
|
if (0!=cbHeapSize)
|
||
|
UnlockData(0);
|
||
|
}
|
||
|
|
||
|
return hInstance;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* WEP
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Required DLL Exit function. Does nothing.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* bSystemExit BOOL indicating if the system is being shut
|
||
|
* down or the DLL has just been unloaded.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* void
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
void FAR PASCAL WEP(int bSystemExit)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* FRegisterControl
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Registers the GizmoBar control class, including CS_GLOBALCLASS
|
||
|
* to make the control available to all applications in the system.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* hInst HINSTANCE of the DLL that will own this class.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* BOOL TRUE if the class is registered, FALSE otherwise.
|
||
|
*/
|
||
|
|
||
|
BOOL FRegisterControl(HINSTANCE hInst)
|
||
|
{
|
||
|
static BOOL fRegistered=FALSE;
|
||
|
WNDCLASS wc;
|
||
|
|
||
|
if (!fRegistered)
|
||
|
{
|
||
|
wc.lpfnWndProc =GizmoBarWndProc;
|
||
|
wc.cbClsExtra =0;
|
||
|
wc.cbWndExtra =CBWINDOWEXTRA;
|
||
|
wc.hInstance =hInst;
|
||
|
wc.hIcon =NULL;
|
||
|
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
|
||
|
wc.hbrBackground =(HBRUSH)(COLOR_BTNFACE+1);
|
||
|
wc.lpszMenuName =NULL;
|
||
|
wc.lpszClassName =CLASS_GIZMOBAR;
|
||
|
wc.style =CS_DBLCLKS | CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
|
||
|
|
||
|
fRegistered=RegisterClass(&wc);
|
||
|
}
|
||
|
|
||
|
return fRegistered;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* GizmoBarPAllocate
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Allocates and initializes the control's primary data structure for
|
||
|
* each window that gets created.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* pfSuccess LPINT indicating success of the function.
|
||
|
* hWnd HWND that is tied to this structure.
|
||
|
* hInst HINSTANCE of the DLL.
|
||
|
* hWndAssociate HWND to which we send messages.
|
||
|
* dwStyle DWORD initial style.
|
||
|
* uState UINT initial state.
|
||
|
* uID UINT identifier for this window.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* LPGIZMOBAR If NULL returned then GizmoBarPAllocate could not allocate
|
||
|
* memory. If a non-NULL pointer is returned with
|
||
|
* *pfSuccess, then call GizmoBarPFree immediately. If you
|
||
|
* get a non-NULL pointer and *pfSuccess==TRUE then the
|
||
|
* function succeeded.
|
||
|
*/
|
||
|
|
||
|
LPGIZMOBAR GizmoBarPAllocate(LPINT pfSuccess, HWND hWnd, HINSTANCE hInst
|
||
|
, HWND hWndAssociate, DWORD dwStyle, UINT uState, UINT uID)
|
||
|
{
|
||
|
LPGIZMOBAR pGB;
|
||
|
|
||
|
if (NULL==pfSuccess)
|
||
|
return NULL;
|
||
|
|
||
|
*pfSuccess=FALSE;
|
||
|
|
||
|
//Allocate the structure
|
||
|
pGB=(LPGIZMOBAR)(void *)LocalAlloc(LPTR, CBGIZMOBAR);
|
||
|
|
||
|
if (NULL==pGB)
|
||
|
return NULL;
|
||
|
|
||
|
//Initialize LibMain parameter holders.
|
||
|
pGB->hWnd =hWnd;
|
||
|
pGB->hInst =hInst;
|
||
|
pGB->hWndAssociate=hWndAssociate;
|
||
|
pGB->dwStyle =dwStyle;
|
||
|
pGB->uState =uState;
|
||
|
pGB->uID =uID;
|
||
|
pGB->fEnabled =TRUE;
|
||
|
|
||
|
pGB->crFace=GetSysColor(COLOR_BTNFACE);
|
||
|
pGB->hBrFace=CreateSolidBrush(pGB->crFace);
|
||
|
|
||
|
if (NULL==pGB->hBrFace)
|
||
|
return pGB;
|
||
|
|
||
|
pGB->hFont=GetStockObject(SYSTEM_FONT);
|
||
|
|
||
|
*pfSuccess=TRUE;
|
||
|
return pGB;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* GizmoBarPFree
|
||
|
*
|
||
|
* Purpose:
|
||
|
* Reverses all initialization done by GizmoBarPAllocate, cleaning up
|
||
|
* any allocations including the application structure itself.
|
||
|
*
|
||
|
* Parameters:
|
||
|
* pGB LPGIZMOBAR to the control's structure
|
||
|
*
|
||
|
* Return Value:
|
||
|
* LPGIZMOBAR NULL if successful, pGB if not, meaning we couldn't
|
||
|
* free some allocation.
|
||
|
*/
|
||
|
|
||
|
LPGIZMOBAR GizmoBarPFree(LPGIZMOBAR pGB)
|
||
|
{
|
||
|
if (NULL==pGB)
|
||
|
return NULL;
|
||
|
|
||
|
/*
|
||
|
* Free all the gizmos we own. When we call GizmoPFree we always
|
||
|
* free the first one in the list which updates pGB->pGizmos for
|
||
|
* us, so we just have to keep going until pGizmos is NULL, meaning
|
||
|
* we're at the end of the list.
|
||
|
*/
|
||
|
while (NULL!=pGB->pGizmos)
|
||
|
GizmoPFree(&pGB->pGizmos, pGB->pGizmos);
|
||
|
|
||
|
if (NULL!=pGB->hBrFace)
|
||
|
DeleteObject(pGB->hBrFace);
|
||
|
|
||
|
/*
|
||
|
* Notice that since we never create a font, we aren't responsible
|
||
|
* for our hFont member.
|
||
|
*/
|
||
|
|
||
|
return (LPGIZMOBAR)(void *)LocalFree((HLOCAL)(void *)(LONG)pGB);
|
||
|
}
|