// // ico.h // // Generic ITfContextOwner object // #ifndef ICO_H #define ICO_H #include "private.h" #define ICO_INVALID_COOKIE ((DWORD)(-1)) #define ICO_POINT_TO_ACP 1 #define ICO_SCREENEXT 2 #define ICO_TEXTEXT 3 #define ICO_KEYDOWN 4 #define ICO_KEYUP 5 #define ICO_STATUS 6 #define ICO_WND 7 #define ICO_ATTR 8 #define ICO_ADVISEMOUSE 9 #define ICO_UNADVISEMOUSE 10 #define ICO_TESTKEYDOWN 11 #define ICO_TESTKEYUP 12 typedef struct { union { // ICO_POINT_TO_ACP struct { const POINT *pt; DWORD dwFlags; LONG *pacp; } pta; // ICO_SCREENEXT struct { RECT *prc; } scr_ext; // ICO_TEXTEXT struct { LONG acpStart; LONG acpEnd; RECT *prc; BOOL *pfClipped; } text_ext; // ICO_KEYDOWN, ICO_KEYUP struct { WPARAM wParam; LPARAM lParam; ITfContext *pic; BOOL *pfEaten; } key; // ICO_STATUS struct { TF_STATUS *pdcs; } status; // ICO_HWND struct { HWND *phwnd; } hwnd; // ICO_ATTR struct { const GUID *pguid; VARIANT *pvar; } sys_attr; // ICO_ADVISEMOUSE struct { ITfRangeACP *rangeACP; ITfMouseSink *pSink; DWORD *pdwCookie; } advise_mouse; // ICO_UNADVISEMOUSE struct { DWORD dwCookie; } unadvise_mouse; }; } ICOARGS; typedef HRESULT (*ICOCALLBACK)(UINT uCode, ICOARGS *pargs, void *pv); class CInputContextOwner : public ITfContextOwner, public ITfMouseTrackerACP { public: CInputContextOwner(ICOCALLBACK pfnCallback, void *pv); virtual ~CInputContextOwner() {}; // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfContextOwner // STDMETHODIMP GetACPFromPoint(const POINT *pt, DWORD dwFlags, LONG *pacp); STDMETHODIMP GetScreenExt(RECT *prc); STDMETHODIMP GetTextExt(LONG acpStart, LONG acpEnd, RECT *prc, BOOL *pfClipped); STDMETHODIMP GetStatus(TF_STATUS *pdcs); STDMETHODIMP GetWnd(HWND *phwnd); STDMETHODIMP GetAttribute(REFGUID rguidAttribute, VARIANT *pvarValue); // ITfMouseTrackerACP STDMETHODIMP AdviseMouseSink(ITfRangeACP *range, ITfMouseSink *pSink, DWORD *pdwCookie); STDMETHODIMP UnadviseMouseSink(DWORD dwCookie); HRESULT _Advise(ITfContext *pic); HRESULT _Unadvise(); protected: void SetCallbackPV(void* pv) { if (_pv == NULL) _pv = pv; }; private: long _cRef; ITfContext *_pic; DWORD _dwCookie; ICOCALLBACK _pfnCallback; void *_pv; }; class CInputContextKeyEventSink : public ITfContextKeyEventSink { public: CInputContextKeyEventSink(ICOCALLBACK pfnCallback, void *pv); // // IUnknown methods // STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // // ITfContextKeyEventSink // STDMETHODIMP OnKeyDown(WPARAM wParam, LPARAM lParam, BOOL *pfEaten); STDMETHODIMP OnKeyUp(WPARAM wParam, LPARAM lParam, BOOL *pfEaten); STDMETHODIMP OnTestKeyDown(WPARAM wParam, LPARAM lParam, BOOL *pfEaten); STDMETHODIMP OnTestKeyUp(WPARAM wParam, LPARAM lParam, BOOL *pfEaten); HRESULT _Advise(ITfContext *pic); HRESULT _Unadvise(); private: long _cRef; ITfContext *_pic; DWORD _dwCookie; ICOCALLBACK _pfnCallback; void *_pv; }; #endif // ICO_H