windows-nt/Source/XPSP1/NT/com/oleutest/letest/gizmobar/init.c
2020-09-26 16:20:57 +08:00

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);
}