116 lines
4.2 KiB
C
116 lines
4.2 KiB
C
|
// HWNDHost.h
|
||
|
//
|
||
|
|
||
|
#ifndef DUI_CONTROL_HWNDHOST_H_INCLUDED
|
||
|
#define DUI_CONTROL_HWNDHOST_H_INCLUDED
|
||
|
|
||
|
namespace DirectUI
|
||
|
{
|
||
|
|
||
|
////////////////////////////////////////////////////////
|
||
|
// HWNDHost
|
||
|
|
||
|
// Element to HWND bridge
|
||
|
|
||
|
#define HHC_CacheFont 0x00000001
|
||
|
|
||
|
// HWNDHost subclasses the HWND child and intercepts all input. This input is forward to DUser
|
||
|
// as a normal message (as if the message never originated via the HWND child). After the input
|
||
|
// message routes, it will be sent to the peer gadget and then on to Element (via OnInput).
|
||
|
// A HWND message will be constructed and sent to the HWND child.
|
||
|
//
|
||
|
// The following flags disables the forwarding of the original HWND message into the DUser world.
|
||
|
// Thus, while the underlying gadget may get mouse/key focus, the HWND will appear as a
|
||
|
// "dead area" within the Element.
|
||
|
//
|
||
|
// These options are used if the HWND is used in an environment where it is not guaranteed that
|
||
|
// all messages sent to it will be dispatched. If they aren't, DUser's state cannot by synchronized.
|
||
|
|
||
|
#define HHC_NoMouseForward 0x00000002
|
||
|
#define HHC_NoKeyboardForward 0x00000004
|
||
|
#define HHC_SyncText 0x00000008
|
||
|
#define HHC_SyncPaint 0x00000010
|
||
|
|
||
|
// Class definition
|
||
|
class HWNDHost : public Element
|
||
|
{
|
||
|
public:
|
||
|
static HRESULT Create(OUT Element** ppElement) { return Create(HHC_CacheFont, AE_MouseAndKeyboard, ppElement); }
|
||
|
static HRESULT Create(UINT nCreate, UINT nActive, OUT Element** ppElement);
|
||
|
|
||
|
// System events
|
||
|
virtual void OnPropertyChanged(PropertyInfo* ppi, int iIndex, Value* pvOld, Value* pvNew);
|
||
|
virtual void OnInput(InputEvent* pInput);
|
||
|
virtual void OnDestroy();
|
||
|
|
||
|
// HWNDHost system events, control notification
|
||
|
virtual bool OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT* plRet);
|
||
|
|
||
|
// Sizing callback
|
||
|
virtual BOOL OnAdjustWindowSize(int x, int y, UINT uFlags);
|
||
|
|
||
|
// Message callback
|
||
|
virtual UINT MessageCallback(GMSG* pGMsg);
|
||
|
|
||
|
// Rendering
|
||
|
virtual void Paint(HDC hDC, const RECT* prcBounds, const RECT* prcInvalid, RECT* prcSkipBorder, RECT* prcSkipContent);
|
||
|
#ifdef GADGET_ENABLE_GDIPLUS
|
||
|
virtual void Paint(Gdiplus::Graphics* pgpgr, const Gdiplus::RectF* prcBounds, const Gdiplus::RectF* prcInvalid, Gdiplus::RectF* prSkipBorder, Gdiplus::RectF* prSkipContent);
|
||
|
#endif
|
||
|
|
||
|
HWND GetHWND() { return _hwndCtrl; }
|
||
|
|
||
|
HWND GetHWNDParent() { return _hwndSink; }
|
||
|
|
||
|
void Detach();
|
||
|
|
||
|
// ClassInfo accessors (static and virtual instance-based)
|
||
|
static IClassInfo* Class;
|
||
|
virtual IClassInfo* GetClassInfo() { return Class; }
|
||
|
static HRESULT Register();
|
||
|
|
||
|
///////////////////////////////////////////////////////
|
||
|
// Accessibility support
|
||
|
virtual HRESULT GetAccessibleImpl(IAccessible ** ppAccessible);
|
||
|
|
||
|
HWNDHost() { }
|
||
|
HRESULT Initialize(UINT nCreate, UINT nActive);
|
||
|
virtual ~HWNDHost() { }
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual void OnHosted(Element* peNewHost);
|
||
|
virtual void OnUnHosted(Element* peOldHost);
|
||
|
virtual HWND CreateHWND(HWND hwndParent);
|
||
|
|
||
|
// Synchronize control and sink to changes
|
||
|
void SyncRect(UINT nChangeFlags, bool bForceSync = false);
|
||
|
void SyncParent();
|
||
|
void SyncStyle();
|
||
|
void SyncVisible();
|
||
|
void SyncFont();
|
||
|
void SyncText();
|
||
|
|
||
|
private:
|
||
|
// Control and sink subclass procs
|
||
|
static BOOL CALLBACK _SinkWndProc(void* pThis, HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT* plRet);
|
||
|
static BOOL CALLBACK _CtrlWndProc(void* pThis, HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam, LRESULT* plRet);
|
||
|
|
||
|
static const UINT g_rgMouseMap[7][3]; // Gadget input message to HWND input message mapping
|
||
|
|
||
|
bool _fHwndCreate; // On first call, create HWNDs (sink and control)
|
||
|
|
||
|
HWND _hwndCtrl; // Hosted control
|
||
|
HWND _hwndSink; // HWND used to receive control notifications
|
||
|
WNDPROC _pfnCtrlOrgProc; // The Controls original WNDPROC
|
||
|
|
||
|
RECT _rcBounds; // Bounds of sink and control (in client coordinates)
|
||
|
HFONT _hFont; // Cached font (optional)
|
||
|
|
||
|
UINT _nCreate; // Creation flags
|
||
|
};
|
||
|
|
||
|
} // namespace DirectUI
|
||
|
|
||
|
#endif // DUI_CONTROL_HWNDHOST_H_INCLUDED
|