windows-nt/Source/XPSP1/NT/enduser/netmeeting/h/genwindow.h
2020-09-26 16:20:57 +08:00

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_