windows-nt/Source/XPSP1/NT/public/internal/windows/inc/duser/duihwndhost.h
2020-09-26 16:20:57 +08:00

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