/*
* ENUMRECT.H
* C/C++ Enumerator Demonstrtion Chapter 2
*
* Definitions, classes, and prototypes
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#ifndef _ENUMRECT_H_
#define _ENUMRECT_H_
#define CHAPTER2
#include <inole.h>
#ifndef WIN32
#include <malloc.h>
#endif
#include "ienum.h" //Interface definitions
//Menu Resource ID and Commands
#define IDR_MENU 1
#define IDM_ENUMCREATEC 100
#define IDM_ENUMCREATECPP 101
#define IDM_ENUMRELEASE 102
#define IDM_ENUMRUNTHROUGH 103
#define IDM_ENUMEVERYTHIRD 104
#define IDM_ENUMRESET 105
#define IDM_ENUMCLONE 106
#define IDM_ENUMEXIT 107
//Number of rects that objects with IEnumRECT support (for demo)
#define CRECTS 15
//Skip the C++ stuff when this file is included from ENUMC.C
#ifdef __cplusplus
//ENUMRECT.CPP
LRESULT APIENTRY EnumWndProc(HWND, UINT, WPARAM, LPARAM);
class CApp
{
friend LRESULT APIENTRY EnumWndProc(HWND, UINT, WPARAM, LPARAM);
protected:
HINSTANCE m_hInst; //WinMain parameters
HINSTANCE m_hInstPrev;
UINT m_nCmdShow;
HWND m_hWnd; //Main window handle
PENUMRECT m_pIEnumRect; //Enumerator object
public:
CApp(HINSTANCE, HINSTANCE, UINT);
~CApp(void);
BOOL Init(void);
void Message(LPTSTR);
};
typedef CApp *PAPP;
#define CBWNDEXTRA sizeof(PAPP)
#define ENUMWL_STRUCTURE 0
//ENUMCPP.CPP
/*
* The class definition for an object that singly implements
* IEnumRECT in C++.
*/
class CEnumRect : public IEnumRECT
{
private:
DWORD m_cRef; //Reference count
DWORD m_iCur; //Current enum position
RECT m_rgrc[CRECTS]; //RECTS we enumerate
public:
CEnumRect(void);
~CEnumRect(void);
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IEnumRECT members
STDMETHODIMP Next(ULONG, LPRECT, ULONG *);
STDMETHODIMP Skip(ULONG);
STDMETHODIMP Reset(void);
STDMETHODIMP Clone(PENUMRECT *);
};
typedef CEnumRect *PCEnumRect;
//Function that creates one of these objects
BOOL CreateRECTEnumeratorCPP(PENUMRECT *);
//End of __cplusplus
#else
//Start of non __cplusplus definitions
//ENUMC.C
/*
* The structure definition for an object that singly implements
* IEnumRECT in C. We make a class by reusing the elements of
* the IEnumRECT structure thereby inheriting from it, albeit
* manually.
*/
typedef struct tagRECTENUMERATOR
{
IEnumRECTVtbl *lpVtbl;
DWORD m_cRef; //Reference count
DWORD m_iCur; //Current enum position
RECT m_rgrc[CRECTS]; //RECTS we enumerate
} RECTENUMERATOR, *PRECTENUMERATOR;
/*
* In C we have to separately declare member functions with
* globally unique names, so prefixing with the class name
* should remove any conflicts.
*/
PRECTENUMERATOR RECTENUM_Constructor(void);
void RECTENUM_Destructor(PRECTENUMERATOR);
STDMETHODIMP RECTENUM_QueryInterface(PENUMRECT, REFIID, PPVOID);
STDMETHODIMP_(ULONG) RECTENUM_AddRef(PENUMRECT);
STDMETHODIMP_(ULONG) RECTENUM_Release(PENUMRECT);
STDMETHODIMP RECTENUM_Next(PENUMRECT, DWORD, LPRECT, LPDWORD);
STDMETHODIMP RECTENUM_Skip(PENUMRECT, DWORD);
STDMETHODIMP RECTENUM_Reset(PENUMRECT);
STDMETHODIMP RECTENUM_Clone(PENUMRECT, PENUMRECT *);
//End of __cplusplus conditions
#endif
#ifdef __cplusplus
extern "C"
{
#endif
//Function that creates one of these objects
BOOL CreateRECTEnumeratorC(PENUMRECT *);
#ifdef __cplusplus
}
#endif
#endif //_ENUMRECT_H_