// 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