254 lines
5.9 KiB
C
254 lines
5.9 KiB
C
/*
|
|
* ICONBOX.C
|
|
*
|
|
* Implemenatation of an IconBox control for OLE 2.0 UI dialogs that we'll
|
|
* use wherever a dialog needs an icon/label display. Through the control's
|
|
* interface we can change the image or control label visibility.
|
|
*
|
|
* The IconBox discusses images in CF_METAFILEPICT format. When drawing
|
|
* such a metafile, the entire aspect is centered in the IconBox, so long
|
|
* labels are chopped at either end.
|
|
*
|
|
* Copyright (c)1992 Microsoft Corporation, All Right Reserved
|
|
*/
|
|
|
|
|
|
#define STRICT 1
|
|
#include "ole2ui.h"
|
|
#include "iconbox.h"
|
|
|
|
|
|
//Flag indicating if we've registered the class
|
|
static BOOL fRegistered=FALSE;
|
|
|
|
|
|
/*
|
|
* FIconBoxInitialize
|
|
*
|
|
* Purpose:
|
|
* Registers the IconBox control class.
|
|
*
|
|
* Parameters:
|
|
* hInst HINSTANCE instance of the DLL.
|
|
*
|
|
* hPrevInst HINSTANCE of the previous instance. Used to
|
|
* determine whether to register window classes or not.
|
|
*
|
|
* lpszClassName LPSTR containing the class name to register the
|
|
* IconBox control class with.
|
|
*
|
|
* Return Value:
|
|
* BOOL TRUE if all initialization succeeded, FALSE otherwise.
|
|
*/
|
|
|
|
BOOL FIconBoxInitialize(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpszClassName)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
// Only register class if we're the first instance
|
|
if (hPrevInst)
|
|
fRegistered = TRUE;
|
|
else
|
|
{
|
|
|
|
// Static flag fRegistered guards against calling this function more
|
|
// than once
|
|
if (!fRegistered)
|
|
{
|
|
wc.lpfnWndProc =IconBoxWndProc;
|
|
wc.cbClsExtra =0;
|
|
wc.cbWndExtra =CBICONBOXWNDEXTRA;
|
|
wc.hInstance =hInst;
|
|
wc.hIcon =NULL;
|
|
wc.hCursor =LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground =(HBRUSH)NULL;
|
|
wc.lpszMenuName =NULL;
|
|
wc.lpszClassName =lpszClassName;
|
|
wc.style =CS_GLOBALCLASS | CS_VREDRAW | CS_HREDRAW;
|
|
|
|
fRegistered=RegisterClass(&wc);
|
|
}
|
|
}
|
|
|
|
return fRegistered;
|
|
}
|
|
|
|
|
|
/*
|
|
* IconBoxUninitialize
|
|
*
|
|
* Purpose:
|
|
* Cleans up anything done in FIconBoxInitialize. Currently there is
|
|
* nothing, but we do this for symmetry.
|
|
*
|
|
* Parameters:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*/
|
|
|
|
void IconBoxUninitialize(void)
|
|
{
|
|
//Nothing to do.
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
* IconBoxWndProc
|
|
*
|
|
* Purpose:
|
|
* Window Procedure for the IconBox custom control. Only handles
|
|
* WM_CREATE, WM_PAINT, and private messages to manipulate the image.
|
|
*
|
|
* Parameters:
|
|
* Standard
|
|
*
|
|
* Return Value:
|
|
* Standard
|
|
*/
|
|
|
|
LONG CALLBACK EXPORT IconBoxWndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HGLOBAL hMF=NULL;
|
|
PAINTSTRUCT ps;
|
|
HDC hDC;
|
|
RECT rc;
|
|
|
|
|
|
//Handle standard Windows messages.
|
|
switch (iMsg)
|
|
{
|
|
case WM_CREATE:
|
|
SetWindowLong(hWnd, IBWW_HIMAGE, 0);
|
|
SetWindowWord(hWnd, IBWW_FLABEL, TRUE);
|
|
return 0L;
|
|
|
|
|
|
case WM_ERASEBKGND:
|
|
{
|
|
|
|
HBRUSH hBrush;
|
|
RECT Rect;
|
|
#if defined( WIN32 )
|
|
POINT point;
|
|
#endif
|
|
|
|
GetClientRect(hWnd, &Rect);
|
|
#if defined( WIN32 )
|
|
hBrush = (HBRUSH)SendMessage(GetParent(hWnd),
|
|
WM_CTLCOLORDLG,
|
|
wParam,
|
|
(LPARAM)GetParent(hWnd));
|
|
#else
|
|
hBrush = (HBRUSH)SendMessage(GetParent(hWnd),
|
|
WM_CTLCOLOR,
|
|
wParam,
|
|
MAKELPARAM(GetParent(hWnd), CTLCOLOR_DLG));
|
|
#endif
|
|
|
|
|
|
if (!hBrush)
|
|
return FALSE;
|
|
|
|
UnrealizeObject(hBrush);
|
|
|
|
#if defined( WIN32 )
|
|
SetBrushOrgEx((HDC)wParam, 0, 0, &point);
|
|
#else
|
|
SetBrushOrg((HDC)wParam, 0, 0);
|
|
#endif
|
|
|
|
FillRect((HDC)wParam, &Rect, hBrush);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
case WM_PAINT:
|
|
hMF=(HGLOBAL)GetWindowLong(hWnd, IBWW_HIMAGE);
|
|
|
|
//BeginPaint and EndPaint clear us even if hMF is NULL.
|
|
hDC=BeginPaint(hWnd, &ps);
|
|
|
|
if (NULL!=hMF)
|
|
{
|
|
BOOL fLabel;
|
|
|
|
//Now we get to paint the metafile, centered in our rect.
|
|
GetClientRect(hWnd, &rc);
|
|
|
|
/*
|
|
* If we're doing icon only, then place the metafile
|
|
* at the center of our box minus half the icon width.
|
|
* Top is top.
|
|
*/
|
|
|
|
fLabel=GetWindowWord(hWnd, IBWW_FLABEL);
|
|
|
|
|
|
//Go draw where we decided to place it.
|
|
OleUIMetafilePictIconDraw(hDC, &rc, hMF, !fLabel);
|
|
}
|
|
|
|
EndPaint(hWnd, &ps);
|
|
break;
|
|
|
|
|
|
case IBXM_IMAGESET:
|
|
/*
|
|
* wParam contains the new handle.
|
|
* lParam is a flag to delete the old or not.
|
|
*/
|
|
hMF=(HGLOBAL)SetWindowLong(hWnd, IBWW_HIMAGE, wParam);
|
|
InvalidateRect(hWnd, NULL, TRUE);
|
|
UpdateWindow(hWnd);
|
|
|
|
//Delete the old handle if requested
|
|
if (0L!=lParam)
|
|
{
|
|
OleUIMetafilePictIconFree(hMF);
|
|
hMF=NULL;
|
|
}
|
|
|
|
return (LONG)(UINT)hMF;
|
|
|
|
|
|
case IBXM_IMAGEGET:
|
|
//Return the current index.
|
|
hMF=(HGLOBAL)GetWindowLong(hWnd, IBWW_HIMAGE);
|
|
return (LONG)(UINT)hMF;
|
|
|
|
|
|
case IBXM_IMAGEFREE:
|
|
//Free up whatever we're holding.
|
|
hMF=(HGLOBAL)GetWindowLong(hWnd, IBWW_HIMAGE);
|
|
OleUIMetafilePictIconFree(hMF);
|
|
return 1L;
|
|
|
|
|
|
case IBXM_LABELENABLE:
|
|
//wParam has the new flag, returns the previous flag.
|
|
return (LONG)SetWindowWord(hWnd, IBWW_FLABEL, (WORD)wParam);
|
|
|
|
|
|
default:
|
|
return DefWindowProc(hWnd, iMsg, wParam, lParam);
|
|
}
|
|
|
|
return 0L;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|