214 lines
6.4 KiB
C++
214 lines
6.4 KiB
C++
// File: GenWindow.h
|
|
|
|
#ifndef _GenWINDOW_H_
|
|
#define _GenWINDOW_H_
|
|
|
|
#include "Referenc.h"
|
|
|
|
// Minimal interface for windows to talk to each other
|
|
interface DECLSPEC_UUID("{9B677AA6-ACA3-11d2-9C97-00C04FB17782}")
|
|
IGenWindow : public IUnknown
|
|
{
|
|
public:
|
|
// Retrieve the desired size of a window so parents can layout their
|
|
// children in an abstract manner
|
|
virtual void GetDesiredSize(
|
|
SIZE *psize // The returned desired size
|
|
) = 0;
|
|
|
|
// Method to call when the desired size for a GenWindow changes
|
|
virtual void OnDesiredSizeChanged() = 0;
|
|
|
|
// Get the background brush to use
|
|
virtual HBRUSH GetBackgroundBrush() = 0;
|
|
|
|
// Get the palette the app is using
|
|
virtual HPALETTE GetPalette() = 0;
|
|
|
|
// Get the LPARAM of user data
|
|
virtual LPARAM GetUserData() = 0;
|
|
|
|
// Sends the registered c_msgFromHandle message to the hwnd. The hwnd
|
|
// should return an IGenWindow* from that message
|
|
static IGenWindow *FromHandle(
|
|
HWND hwnd // The hwnd to get the IGenWindow* from
|
|
);
|
|
|
|
protected:
|
|
// Registered message for retrieving the IGenWindow*
|
|
static const DWORD c_msgFromHandle;
|
|
} ;
|
|
|
|
// Generic window class. Override the ProcessMessage method to add your own
|
|
// functionality
|
|
class DECLSPEC_UUID("{CEEA6922-ACA3-11d2-9C97-00C04FB17782}")
|
|
CGenWindow : REFCOUNT, public IGenWindow
|
|
{
|
|
public:
|
|
typedef void (*InvokeProc)(CGenWindow *pWin, WPARAM wParam);
|
|
|
|
// Default constructor; inits a few intrinsics
|
|
CGenWindow();
|
|
|
|
// Create the window, analagous to Win32's CreateWindowEx. Only the
|
|
// class name is missing, since CGenWindow works only for its own window
|
|
// class
|
|
BOOL Create(
|
|
HWND hWndParent, // Window parent
|
|
LPCTSTR szWindowName, // Window name
|
|
DWORD dwStyle, // Window style
|
|
DWORD dwEXStyle, // Extended window style
|
|
int x, // Window pos: x
|
|
int y, // Window pos: y
|
|
int nWidth, // Window size: width
|
|
int nHeight, // Window size: height
|
|
HINSTANCE hInst, // The hInstance to create the window on
|
|
HMENU hmMain=NULL, // Window menu
|
|
LPCTSTR szClassName=NULL // The class name to use
|
|
);
|
|
|
|
// Create a child window, analagous to Win32's CreateWindowEx. The class
|
|
// name is missing, since CGenWindow works only for its own window class.
|
|
// Size and pos are also missing since most children will get layed out by
|
|
// their parent.
|
|
BOOL Create(
|
|
HWND hWndParent, // Window parent
|
|
INT_PTR nId=0, // ID of the child window
|
|
LPCTSTR szWindowName=TEXT(""), // Window name
|
|
DWORD dwStyle=0, // Window style; WS_CHILD|WS_VISIBLE will be added to this
|
|
DWORD dwEXStyle=WS_EX_CONTROLPARENT // Extended window style
|
|
);
|
|
|
|
// Return the HWND
|
|
inline HWND GetWindow()
|
|
{
|
|
return(m_hwnd);
|
|
}
|
|
|
|
// Override if you want to layout your window in a specific way when it
|
|
// resizes.
|
|
// Making this public so it can be forced on a window.
|
|
virtual void Layout()
|
|
{
|
|
}
|
|
|
|
// begin IGenWindow interface
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFGUID iid, LPVOID *pObj);
|
|
virtual ULONG STDMETHODCALLTYPE AddRef(void) { return(REFCOUNT::AddRef()); }
|
|
virtual ULONG STDMETHODCALLTYPE Release(void) { return(REFCOUNT::Release()); }
|
|
|
|
virtual void GetDesiredSize(SIZE *ppt);
|
|
|
|
// Forward the notification to the parent
|
|
virtual void OnDesiredSizeChanged();
|
|
|
|
// Get the background brush to use; use parent's by default
|
|
virtual HBRUSH GetBackgroundBrush();
|
|
|
|
// Get the palette the app is using
|
|
virtual HPALETTE GetPalette();
|
|
|
|
// Get the LPARAM of user data
|
|
virtual LPARAM GetUserData();
|
|
|
|
// end IGenWindow interface
|
|
|
|
void SetUserData(LPARAM lUserData) { m_lUserData = lUserData; }
|
|
|
|
// Set the global Hot control
|
|
static void SetHotControl(CGenWindow *pHot);
|
|
|
|
// Do a layout on this window at some time soon
|
|
void ScheduleLayout();
|
|
|
|
// Invoke on a posted message
|
|
BOOL AsyncInvoke(InvokeProc proc, WPARAM wParam);
|
|
|
|
// Set the tooltip for this window
|
|
void SetTooltip(LPCTSTR pszTip);
|
|
// Remove the tooltip for this window
|
|
void RemoveTooltip();
|
|
|
|
// Get the standard palette for drawing
|
|
static HPALETTE GetStandardPalette();
|
|
// Delete the standard palette for drawing
|
|
static void DeleteStandardPalette();
|
|
|
|
// Get the standard palette for drawing
|
|
static HBRUSH GetStandardBrush();
|
|
// Delete the standard palette for drawing
|
|
static void DeleteStandardBrush();
|
|
|
|
protected:
|
|
// Virtual destructor so clients can provide specific destruction code
|
|
// This is protected to indicate that only Release should call it, not
|
|
// creators of this object. I'd rather make it private, but then extenders
|
|
// would not work.
|
|
virtual ~CGenWindow();
|
|
|
|
// The virtual window procedure. Override this to add specific behavior.
|
|
virtual LRESULT ProcessMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
|
|
// Set this control to be hot
|
|
virtual void SetHot(BOOL bHot);
|
|
// Is this control currently hot
|
|
virtual BOOL IsHot();
|
|
|
|
// Get the info necessary for displaying a tooltip
|
|
virtual void GetSharedTooltipInfo(TOOLINFO *pti);
|
|
|
|
private:
|
|
// The current hot control
|
|
static CGenWindow *g_pCurHot;
|
|
// The standard palette
|
|
static HPALETTE g_hPal;
|
|
// Whether we actually need a palette or not
|
|
static BOOL g_bNeedPalette;
|
|
// The standard background brush
|
|
static HBRUSH g_hBrush;
|
|
// The single list of tooltip windows
|
|
static class CTopWindowArray *g_pTopArray;
|
|
|
|
// Stuff nobody should ever do
|
|
CGenWindow(const CGenWindow& rhs);
|
|
CGenWindow& operator=(const CGenWindow& rhs);
|
|
|
|
// The window class name
|
|
static const LPCTSTR c_szGenWindowClass;
|
|
|
|
// Initalizes the window class
|
|
static BOOL InitWindowClass(LPCTSTR szClassName, HINSTANCE hThis);
|
|
// The real window procedure that sets up the "this" pointer and calls
|
|
// ProcessMessage
|
|
static LRESULT CALLBACK RealWindowProc(
|
|
HWND hWnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
);
|
|
// WM_NCCREATE handler. Stores away the "this" pointer.
|
|
static BOOL OnNCCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
|
|
|
|
// The hwnd associated with this object
|
|
HWND m_hwnd;
|
|
|
|
// A single LPARAM so no need to extend just to add a little data
|
|
LPARAM m_lUserData;
|
|
|
|
// WM_SIZE handler. Calls the Layout function.
|
|
void OnSize(HWND hwnd, UINT state, int cx, int cy);
|
|
// WM_ERASEBKGND handler. Clears the window.
|
|
BOOL OnEraseBkgnd(HWND hwnd, HDC hdc);
|
|
// WM_MOUSEMOVE handler; sets the Hot control
|
|
void OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags);
|
|
// clears the Hot tracking
|
|
void OnMouseLeave();
|
|
// Tells the parent to layout
|
|
void OnShowWindow(HWND hwnd, BOOL fShow, int fnStatus);
|
|
|
|
// Returns TRUE if the TT exists
|
|
BOOL InitToolInfo(TOOLINFO *pti, LPTSTR pszText=NULL);
|
|
} ;
|
|
|
|
#endif // _GENWINDOW_H_
|