|
|
// 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); // Set the text of this window for accessibilty
void SetWindowtext(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_
|