// This file defines a set of classes such as CHwxObject,CHwxInkWindow, // CHwxMB,CHwxCAC,CHwxStroke,CHwxThread,CHwxThreadMB,CHwxThreadCAC,and // so on. #ifndef _HWXOBJ_H_ #define _HWXOBJ_H_ #include #include #include #include "const.h" #include "recog.h" #include "hwxapp.h" #include "../lib/ddbtn/ddbtn.h" #include "../lib/exbtn/exbtn.h" #include "../lib/plv/plv.h" #ifdef FE_JAPANESE #include "../imeskdic/imeskdic.h" #endif LRESULT WINAPI HWXWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT WINAPI MBWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT WINAPI CACWndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK CACMBPropDlgProc(HWND, UINT, WPARAM, LPARAM); LRESULT WINAPI CACMBBtnWndProc(HWND, UINT, WPARAM, LPARAM); //---------------------------------------------------------------- //980727: by ToshiaK //source is described in hwxobj.cpp //---------------------------------------------------------------- BOOL IsWinNT4(VOID); BOOL IsWinNT5(VOID); BOOL IsWinNT5orUpper(); BOOL IsWinNT(VOID); BOOL IsWin95(VOID); BOOL IsWin98(VOID); extern TCHAR szBuf[MAX_PATH]; extern TOOLINFOW ti; class CHwxObject { public: CHwxObject(HINSTANCE hInstance); ~CHwxObject(); virtual BOOL Initialize(TCHAR * pClsName); _inline TCHAR * GetHwxClsName() const { return (TCHAR *)m_pClassName; } _inline int GetHwxClsNameLength() const { return m_nLen; } #ifndef UNDER_CE _inline BOOL IsMyHwxCls(TCHAR * pClsName) { return !strcmp(m_pClassName,pClsName); } #else // UNDER_CE _inline BOOL IsMyHwxCls(TCHAR * pClsName) { return !lstrcmp(m_pClassName,pClsName); } #endif // UNDER_CE void * operator new(size_t size); void operator delete(void * pv); protected: static HINSTANCE m_hInstance; private: int m_nLen; // length of a class name TCHAR m_pClassName[16]; // class name }; typedef struct tagSTROKE { struct tagSTROKE *pNext; // Pointer to the next stroke. int xLeft; // Left edge of the box this stroke is drawn in int iBox; // Logical box number the stroke was written in int cpt; // number of points within the stroke POINT apt[1]; } STROKE, *PSTROKE; class CHwxThreadMB; class CHwxThreadCAC; class CHwxInkWindow; class CApplet; class CHwxStroke: public CHwxObject { public: CHwxStroke(BOOL bForward,long lSize); ~CHwxStroke(); virtual BOOL Initialize(TCHAR * pClsName); BOOL ResetPen(VOID); //990618:ToshiaK for KOTAE #1329 BOOL AddPoint(POINT pt); BOOL AddBoxStroke(int nLogBox,int nCurBox,int nBoxHeight); void EraseCurrentStroke(); void DeleteAllStroke(); CHwxStroke & operator=(CHwxStroke & stroke); // copy stroke from one class to the other void ScaleInkXY(long x,long y); PSTROKE CopyCurrentStroke(); void DrawStroke(HDC hdc,int nPts,BOOL bEntire); void GetUpdateRect(RECT * prc); _inline PSTROKE GetCurrentStrokePtr() { return m_pCurStroke; } _inline PSTROKE GetStrokePtr() { return m_pStroke; } _inline long * GetNumStrokesAddress() { return &m_nStroke; } _inline long GetNumStrokes() { return m_nStroke; } _inline void IncStrokeCount() { m_nStroke++; } _inline void DecStrokeCount() { m_nStroke--; } protected: BOOL growPointBuffer(); void resetPointBuffer(); PSTROKE dupStroke(); private: BOOL m_bForward; // TRUE means inserting a current stroke at the // beginning of a stroke list PSTROKE m_pStroke; // a stroke list to form a character PSTROKE m_pCurStroke; // point to the current stroke just inserted long m_nStroke; // number of strokes in the list POINT * m_ppt; // points being drawn currently long m_cpt; // count of points in the buffer long m_max; // max room for points in m_ppt long m_nSize; // a constant size for point buffer growing HPEN m_hPen; }; typedef struct tagPROPDATA { UINT uTimerValue; BOOL bAlwaysRecog; }PROPDATA; class CHwxMB: public CHwxObject { public: CHwxMB(CHwxInkWindow * pInk,HINSTANCE hInst); ~CHwxMB(); virtual BOOL Initialize(TCHAR * pClsName); BOOL CreateUI(HWND); void HandlePaint(HWND); BOOL HandleMouseEvent(HWND,UINT,WPARAM,LPARAM); LRESULT HandleUserMessage(HWND,UINT,WPARAM,LPARAM); LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM); void OnSettingChange(UINT,WPARAM,LPARAM); void SetBoxSize(WORD); _inline long GetStrokeCount() { return m_pCHwxStroke->GetNumStrokes(); } _inline long * GetStrokeCountAddress() { return m_pCHwxStroke->GetNumStrokesAddress(); } _inline PSTROKE GetStrokePoiner() { return m_pCHwxStroke->GetStrokePtr(); } _inline HWND GetMBWindow() { return m_hMBWnd; } _inline void SetMBWindow(HWND hwnd) { m_hMBWnd = hwnd; } _inline CHwxThreadMB * GetMBThread() { return m_pCHwxThreadMB; } _inline CHwxStroke * GetMBCHwxStroke() { return m_pCHwxStroke; } _inline UINT GetTimeOutValue() { return m_timeoutValue; } _inline void SetTimeOutValue(UINT u) { m_timeoutValue = u; } _inline void SetTimerStarted(BOOL bval) { m_bTimerStarted = bval; } protected: private: BOOL IsInInkBox(PPOINT); BOOL IsPointInResizeBox(PPOINT); void recognize(); void SetLogicalBox(int); void SetContext(); WCHAR findLastContext(); void DrawMBInkBox(HDC, WORD); CHwxInkWindow * m_pInk; CHwxThreadMB * m_pCHwxThreadMB; CHwxStroke * m_pCHwxStroke; HWND m_hMBWnd; RECT m_clipRect; // Current clipping rectangle. POINT m_ptClient; // Client windows origin. DWORD m_CurrentMask; DWORD m_lastMaskSent; WCHAR m_lastCharSent; WCHAR m_Context[101]; WORD m_bHiPri; WORD m_boxSize; WORD m_bDown; WORD m_bRightClick; WORD m_bNoInk; WORD m_cLogicalBox; WORD m_curBox; WORD m_iBoxPrev; HDC m_hdcMouse; // cache HDC. It must be NULL when deleting an object // of this class. HCURSOR m_hCursor; BOOL m_bResize; int m_firstX; BOOL m_bTimerStarted; UINT m_timeoutValue; WCHAR m_StringCandidate[MB_NUM_CANDIDATES][2]; LPIMESTRINGCANDIDATE m_pImeStringCandidate; LPIMESTRINGCANDIDATEINFO m_pImeStringCandidateInfo; BOOL m_bErase; }; class CHwxCAC; class CHwxInkWindow: public CHwxObject { public: CHwxInkWindow(BOOL,BOOL,CApplet *,HINSTANCE); ~CHwxInkWindow(); virtual BOOL Initialize(TCHAR * pClsName); BOOL CreateUI(HWND); BOOL Terminate(); BOOL HandleCreate(HWND); void HandlePaint(HWND); void HandleHelp(HWND,UINT,WPARAM,LPARAM); LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM); LRESULT HandleSettingChange(HWND,UINT,WPARAM,LPARAM); LRESULT HandleBtnSubWnd(HWND,UINT,WPARAM,LPARAM); LPWSTR LoadCACMBString(UINT); void HandleDlgMsg(HWND,BOOL); void CopyInkFromMBToCAC(CHwxStroke & str,long deltaX,long deltaY); void HandleSize(WPARAM,LPARAM); void ChangeLayout(BOOL); void SetTooltipInfo(); void SetTooltipText(LPARAM); CHwxStroke * GetCACCHwxStroke(); void DrawHwxGuide(HDC,LPRECT); void HandleConfigNotification(); void UpdateRegistry(BOOL); void ChangeIMEPADSize(BOOL); BOOL HandleSizeNotify(INT *pWidth, INT *pHeight); //980605; ToshiaK _inline HWND GetInkWindow() { return m_hInkWnd; } _inline HWND GetToolTipWindow() { return m_hwndTT; } _inline int GetInkWindowWidth() { return m_bCAC ? m_wCACWidth : m_wInkWidth; } _inline int GetInkWindowHeight() { return m_bCAC ? m_wCACHeight : m_wInkHeight; } _inline int GetMBWidth() { return m_wPadWidth; } _inline int GetMBHeight() { return m_wPadHeight; } void SetMBHeight(int h); _inline int GetMBBoxNumber() { return m_numBoxes; } _inline int GetCACWidth() { return m_wCACWidth; } _inline int GetCACHeight() { return m_wCACHeight; } _inline int GetCACInkHeight() { return m_wCACInkHeight; } void SetCACInkHeight(int w); _inline CApplet * GetAppletPtr() { return m_pApplet; } _inline CHwxStroke * GetMBCHwxStroke() { return m_pMB->GetMBCHwxStroke(); } _inline BOOL Is16BitApp() { return m_b16Bit; } _inline BOOL IsNT() { return m_bNT; } _inline BOOL IsSglClk() { return m_bSglClk; } _inline BOOL IsDblClk() { return m_bDblClk; } _inline void SetSglClk(BOOL b) { m_bSglClk = b; if ( m_bCAC ) { exbtnPushedorPoped(m_bSglClk); } } _inline void SetDblClk(BOOL b) { m_bDblClk = b; if ( m_bCAC ) { if ( m_bDblClk ) { m_bSglClk = FALSE; exbtnPushedorPoped(TRUE); } else { exbtnPushedorPoped(m_bSglClk); } } } INT OnChangeView(BOOL fLarge); //980728: by ToshiaK for raid #2846 private: BOOL handleCACMBMenuCmd(RECT *,UINT,UINT,RECT *); void changeCACLayout(BOOL); void changeMBLayout(BOOL); void exbtnPushedorPoped(BOOL); FARPROC getCACMBBtnProc(HWND hwnd) { if ( hwnd == m_hCACMBMenu ) return m_CACMBMenuDDBtnProc; else if ( hwnd == m_hCACMBRecog ) return m_CACMBRecogEXBtnProc; else if ( hwnd == m_hCACMBRevert ) return m_CACMBRevertEXBtnProc; else if ( hwnd == m_hCACMBClear ) return m_CACMBClearEXBtnProc; else if ( hwnd == m_hCACSwitch ) return m_CACSwitchDDBtnProc; else return NULL; } CApplet * m_pApplet; CHwxMB * m_pMB; CHwxCAC * m_pCAC; HWND m_hInkWnd; HWND m_hwndTT; BOOL m_b16Bit; BOOL m_bNT; BOOL m_bCAC; BOOL m_bSglClk; BOOL m_bDblClk; BOOL m_bMouseDown; HWND m_hCACMBMenu; HWND m_hCACMBRecog; HWND m_hCACMBRevert; HWND m_hCACMBClear; HWND m_hCACSwitch; FARPROC m_CACMBMenuDDBtnProc; FARPROC m_CACMBRecogEXBtnProc; FARPROC m_CACMBRevertEXBtnProc; FARPROC m_CACMBClearEXBtnProc; FARPROC m_CACSwitchDDBtnProc; int m_wInkWidth; int m_wInkHeight; int m_wPadWidth; int m_wPadHeight; int m_numBoxes; int m_wCACWidth; int m_wCACHeight; int m_wCACPLVHeight; int m_wCACPLVWidth; int m_wCACTMPWidth; int m_wCACInkHeight; }; class CHwxCAC: public CHwxObject { friend int WINAPI GetItemForIcon(LPARAM lParam, int index, LPPLVITEM lpPlvItem); friend int WINAPI GetItemForReport(LPARAM lParam, int index, int indexCol, LPPLVITEM lpPlvItem); public: CHwxCAC(CHwxInkWindow * pInk,HINSTANCE hInst); ~CHwxCAC(); virtual BOOL Initialize(TCHAR * pClsName); BOOL CreateUI(HWND); void HandlePaint(HWND); void HandleMouseEvent(HWND,UINT,WPARAM,LPARAM); void HandleRecogResult(HWND,WPARAM,LPARAM); void HandleShowRecogResult(HWND,WPARAM,LPARAM); void HandleSendResult(HWND,WPARAM,LPARAM); void GetInkFromMB(CHwxStroke & str,long deltaX,long deltaY); void HandleDeleteOneStroke(); void HandleDeleteAllStroke(); LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM); void OnSettingChange(UINT,WPARAM,LPARAM); void SetToolTipInfo(BOOL); void SetToolTipText(LPARAM); void recognize(); void NoThreadRecognize(int); void HandleResizePaint(HWND); void SetInkSize(int); void HandleDrawSample(); _inline long GetStrokeCount() { return m_pCHwxStroke->GetNumStrokes(); } _inline long * GetStrokeCountAddress() { return m_pCHwxStroke->GetNumStrokesAddress(); } _inline PSTROKE GetStrokePointer() { return m_pCHwxStroke->GetStrokePtr(); } _inline HWND GetCACWindow() { return m_hCACWnd; } _inline HWND GetCACLVWindow() { return m_hLVWnd; } _inline CHwxThreadCAC * GetCACThread() { return m_pCHwxThreadCAC; } _inline CHwxStroke * GetCACCHwxStroke() { return m_pCHwxStroke; } _inline BOOL Is16BitApp() { return m_pInk->Is16BitApp(); } _inline BOOL IsNT() { return m_pInk->IsNT(); } _inline BOOL IsLargeView() { return m_bLargeView; } _inline void SetLargeView(BOOL b) { m_bLargeView = b; } #ifdef FE_JAPANESE _inline IImeSkdic * GetIIMESKDIC() { return m_pIImeSkdic; } #endif _inline WCHAR GetWCHAR(int i) { if ( i >= 0 && i <= m_cnt ) return m_gawch[i]; return 0; } protected: private: BOOL Init(); void InitBitmap(DWORD,int); void InitBitmapText(); void InitBitmapBackground(); BOOL checkRange(int, int); BOOL IsPointInResizeBox(int,int); BOOL IsDupResult(WORD); HBITMAP makeCharBitmap(WCHAR); void pickUpChar(LPPLVINFO); void pickUpCharHelper(WCHAR); #ifdef FE_JAPANESE void sortKanjiInfo(int); #endif CHwxInkWindow * m_pInk; CHwxThreadCAC * m_pCHwxThreadCAC; CHwxStroke * m_pCHwxStroke; HWND m_hCACWnd; BOOL m_bLargeView; BOOL m_gbDown; WORD m_bRightClick; WORD m_gawch[LISTTOTAL]; int m_cnt; int m_inkSize; HDC m_ghdc; HBITMAP m_ghbm; HFONT m_ghfntTT; HWND m_hLVWnd; #ifdef FE_JAPANESE IImeSkdic * m_pIImeSkdic; HINSTANCE m_hSkdic; #endif LPPLVINFO m_lpPlvInfo; #ifdef FE_JAPANESE WCHAR m_wchOther[MAX_ITAIJI_COUNT+1]; #endif HCURSOR m_hCursor; BOOL m_bResize; BOOL m_bDrawSample; }; typedef BOOL (WINAPI * PHWXCONFIG)(); typedef HRC (WINAPI * PHWXCREATE)(HRC); typedef BOOL (WINAPI * PHWXDESTROY)(HRC); typedef BOOL (WINAPI * PHWXSETGUIDE)(HRC,HWXGUIDE *); typedef BOOL (WINAPI * PHWXALCVALID)(HRC,ALC); typedef BOOL (WINAPI * PHWXALCPRIORITY)(HRC,ALC); typedef BOOL (WINAPI * PHWXSETPARTIAL)(HRC,UINT); typedef BOOL (WINAPI * PHWXSETABORT)(HRC,UINT *); typedef BOOL (WINAPI * PHWXINPUT)(HRC,POINT *,UINT,DWORD); typedef BOOL (WINAPI * PHWXENDINPUT)(HRC); typedef BOOL (WINAPI * PHWXPROCESS)(HRC); typedef INT (WINAPI * PHWXGETRESULTS)(HRC,UINT,UINT,UINT,HWXRESULTS *); typedef BOOL (WINAPI * PHWXSETCONTEXT)(HRC,WCHAR); typedef INT (WINAPI * PHWXRESULTSAVAILABLE)(HRC); typedef struct tagHWXRESULTPRI { WORD cbCount; WORD iSelection; WORD iPosition; WCHAR chCandidate[MB_NUM_CANDIDATES]; struct tagHWXRESULTPRI *pNext; } HWXRESULTPRI, *LPHWXRESULTPRI; class CHwxThread: public CHwxObject { public: CHwxThread(); ~CHwxThread(); virtual BOOL Initialize(TCHAR * pClsName); BOOL StartThread() ; void StopThread() ; _inline BOOL IsThreadStarted() { return m_hThread != NULL; } _inline HANDLE GetHandle() { return m_hThread; } _inline DWORD GetID() { return m_thrdID; } _inline DWORD GetHwxThreadArg() { return m_thrdArg; } protected: virtual DWORD RecognizeThread(DWORD) = 0; //static HINSTANCE m_hHwxjpn; //---------------------------------------------------------------- //971217:ToshiaK changed to static to no static. //ImePad window is created per Thread. //---------------------------------------------------------------- HINSTANCE m_hHwxjpn; static PHWXCONFIG lpHwxConfig; static PHWXCREATE lpHwxCreate; static PHWXSETCONTEXT lpHwxSetContext; static PHWXSETGUIDE lpHwxSetGuide; static PHWXALCVALID lpHwxAlcValid; static PHWXSETPARTIAL lpHwxSetPartial; static PHWXSETABORT lpHwxSetAbort; static PHWXINPUT lpHwxInput; static PHWXENDINPUT lpHwxEndInput; static PHWXPROCESS lpHwxProcess; static PHWXRESULTSAVAILABLE lpHwxResultsAvailable; static PHWXGETRESULTS lpHwxGetResults; static PHWXDESTROY lpHwxDestroy; HANDLE m_hThread; DWORD m_thrdID; DWORD m_thrdArg; HANDLE m_hStopEvent; BOOL m_Quit; //971202: by Toshiak private: static DWORD WINAPI RealThreadProc(void* ); DWORD ClassThreadProc(); void RecogHelper(HRC,DWORD,DWORD); }; class CHwxThreadMB: public CHwxThread { public: CHwxThreadMB(CHwxMB * pMB, int nSize); ~CHwxThreadMB(); virtual BOOL Initialize(TCHAR * pClsName); virtual DWORD RecognizeThread(DWORD); protected: private: BOOL HandleThreadMsg(MSG *); HWXRESULTPRI *GetCandidates(HWXRESULTS *); void GetCharacters(int iSentAlready, int iReady); CHwxMB * m_pMB; ALC m_recogMask; WCHAR m_prevChar; HRC m_hrcActive; // HRC used for doing recognition. int m_giSent; // How many characters we have already sent. int m_bDirty; // True if there is ink to process. HWXGUIDE m_guide; }; class CHwxThreadCAC: public CHwxThread { public: CHwxThreadCAC(CHwxCAC * pCAC); ~CHwxThreadCAC(); virtual BOOL Initialize(TCHAR * pClsName); virtual DWORD RecognizeThread(DWORD); void RecognizeNoThread(int); _inline BOOL IsHwxjpnLoaded() { return m_hHwxjpn != NULL; } protected: private: void recoghelper(HRC,DWORD,DWORD); CHwxCAC * m_pCAC; }; #endif // _HWXOBJ_H_