Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

547 lines
16 KiB

  1. // This file defines a set of classes such as CHwxObject,CHwxInkWindow,
  2. // CHwxMB,CHwxCAC,CHwxStroke,CHwxThread,CHwxThreadMB,CHwxThreadCAC,and
  3. // so on.
  4. #ifndef _HWXOBJ_H_
  5. #define _HWXOBJ_H_
  6. #include <windows.h>
  7. #include <windowsx.h>
  8. #include <commctrl.h>
  9. #include "const.h"
  10. #include "recog.h"
  11. #include "hwxapp.h"
  12. #include "../lib/ddbtn/ddbtn.h"
  13. #include "../lib/exbtn/exbtn.h"
  14. #include "../lib/plv/plv.h"
  15. #ifdef FE_JAPANESE
  16. #include "../imeskdic/imeskdic.h"
  17. #endif
  18. LRESULT WINAPI HWXWndProc(HWND, UINT, WPARAM, LPARAM);
  19. LRESULT WINAPI MBWndProc(HWND, UINT, WPARAM, LPARAM);
  20. LRESULT WINAPI CACWndProc(HWND, UINT, WPARAM, LPARAM);
  21. INT_PTR CALLBACK CACMBPropDlgProc(HWND, UINT, WPARAM, LPARAM);
  22. LRESULT WINAPI CACMBBtnWndProc(HWND, UINT, WPARAM, LPARAM);
  23. //----------------------------------------------------------------
  24. //980727: by ToshiaK
  25. //source is described in hwxobj.cpp
  26. //----------------------------------------------------------------
  27. BOOL IsWinNT4(VOID);
  28. BOOL IsWinNT5(VOID);
  29. BOOL IsWinNT5orUpper();
  30. BOOL IsWinNT(VOID);
  31. BOOL IsWin95(VOID);
  32. BOOL IsWin98(VOID);
  33. extern TCHAR szBuf[MAX_PATH];
  34. extern TOOLINFOW ti;
  35. class CHwxObject
  36. {
  37. public:
  38. CHwxObject(HINSTANCE hInstance);
  39. ~CHwxObject();
  40. virtual BOOL Initialize(TCHAR * pClsName);
  41. _inline TCHAR * GetHwxClsName() const { return (TCHAR *)m_pClassName; }
  42. _inline int GetHwxClsNameLength() const { return m_nLen; }
  43. #ifndef UNDER_CE
  44. _inline BOOL IsMyHwxCls(TCHAR * pClsName) { return !strcmp(m_pClassName,pClsName); }
  45. #else // UNDER_CE
  46. _inline BOOL IsMyHwxCls(TCHAR * pClsName) { return !lstrcmp(m_pClassName,pClsName); }
  47. #endif // UNDER_CE
  48. void * operator new(size_t size);
  49. void operator delete(void * pv);
  50. protected:
  51. static HINSTANCE m_hInstance;
  52. private:
  53. int m_nLen; // length of a class name
  54. TCHAR m_pClassName[16]; // class name
  55. };
  56. typedef struct tagSTROKE
  57. {
  58. struct tagSTROKE *pNext; // Pointer to the next stroke.
  59. int xLeft; // Left edge of the box this stroke is drawn in
  60. int iBox; // Logical box number the stroke was written in
  61. int cpt; // number of points within the stroke
  62. POINT apt[1];
  63. } STROKE, *PSTROKE;
  64. class CHwxThreadMB;
  65. class CHwxThreadCAC;
  66. class CHwxInkWindow;
  67. class CApplet;
  68. class CHwxStroke: public CHwxObject
  69. {
  70. public:
  71. CHwxStroke(BOOL bForward,long lSize);
  72. ~CHwxStroke();
  73. virtual BOOL Initialize(TCHAR * pClsName);
  74. BOOL ResetPen(VOID); //990618:ToshiaK for KOTAE #1329
  75. BOOL AddPoint(POINT pt);
  76. BOOL AddBoxStroke(int nLogBox,int nCurBox,int nBoxHeight);
  77. void EraseCurrentStroke();
  78. void DeleteAllStroke();
  79. CHwxStroke & operator=(CHwxStroke & stroke); // copy stroke from one class to the other
  80. void ScaleInkXY(long x,long y);
  81. PSTROKE CopyCurrentStroke();
  82. void DrawStroke(HDC hdc,int nPts,BOOL bEntire);
  83. void GetUpdateRect(RECT * prc);
  84. _inline PSTROKE GetCurrentStrokePtr() { return m_pCurStroke; }
  85. _inline PSTROKE GetStrokePtr() { return m_pStroke; }
  86. _inline long * GetNumStrokesAddress() { return &m_nStroke; }
  87. _inline long GetNumStrokes() { return m_nStroke; }
  88. _inline void IncStrokeCount() { m_nStroke++; }
  89. _inline void DecStrokeCount() { m_nStroke--; }
  90. protected:
  91. BOOL growPointBuffer();
  92. void resetPointBuffer();
  93. PSTROKE dupStroke();
  94. private:
  95. BOOL m_bForward; // TRUE means inserting a current stroke at the
  96. // beginning of a stroke list
  97. PSTROKE m_pStroke; // a stroke list to form a character
  98. PSTROKE m_pCurStroke; // point to the current stroke just inserted
  99. long m_nStroke; // number of strokes in the list
  100. POINT * m_ppt; // points being drawn currently
  101. long m_cpt; // count of points in the buffer
  102. long m_max; // max room for points in m_ppt
  103. long m_nSize; // a constant size for point buffer growing
  104. HPEN m_hPen;
  105. };
  106. typedef struct tagPROPDATA
  107. {
  108. UINT uTimerValue;
  109. BOOL bAlwaysRecog;
  110. }PROPDATA;
  111. class CHwxMB: public CHwxObject
  112. {
  113. public:
  114. CHwxMB(CHwxInkWindow * pInk,HINSTANCE hInst);
  115. ~CHwxMB();
  116. virtual BOOL Initialize(TCHAR * pClsName);
  117. BOOL CreateUI(HWND);
  118. void HandlePaint(HWND);
  119. BOOL HandleMouseEvent(HWND,UINT,WPARAM,LPARAM);
  120. LRESULT HandleUserMessage(HWND,UINT,WPARAM,LPARAM);
  121. LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM);
  122. void OnSettingChange(UINT,WPARAM,LPARAM);
  123. void SetBoxSize(WORD);
  124. _inline long GetStrokeCount() { return m_pCHwxStroke->GetNumStrokes(); }
  125. _inline long * GetStrokeCountAddress() { return m_pCHwxStroke->GetNumStrokesAddress(); }
  126. _inline PSTROKE GetStrokePoiner() { return m_pCHwxStroke->GetStrokePtr(); }
  127. _inline HWND GetMBWindow() { return m_hMBWnd; }
  128. _inline void SetMBWindow(HWND hwnd) { m_hMBWnd = hwnd; }
  129. _inline CHwxThreadMB * GetMBThread() { return m_pCHwxThreadMB; }
  130. _inline CHwxStroke * GetMBCHwxStroke() { return m_pCHwxStroke; }
  131. _inline UINT GetTimeOutValue() { return m_timeoutValue; }
  132. _inline void SetTimeOutValue(UINT u) { m_timeoutValue = u; }
  133. _inline void SetTimerStarted(BOOL bval) { m_bTimerStarted = bval; }
  134. protected:
  135. private:
  136. BOOL IsInInkBox(PPOINT);
  137. BOOL IsPointInResizeBox(PPOINT);
  138. void recognize();
  139. void SetLogicalBox(int);
  140. void SetContext();
  141. WCHAR findLastContext();
  142. void DrawMBInkBox(HDC, WORD);
  143. CHwxInkWindow * m_pInk;
  144. CHwxThreadMB * m_pCHwxThreadMB;
  145. CHwxStroke * m_pCHwxStroke;
  146. HWND m_hMBWnd;
  147. RECT m_clipRect; // Current clipping rectangle.
  148. POINT m_ptClient; // Client windows origin.
  149. DWORD m_CurrentMask;
  150. DWORD m_lastMaskSent;
  151. WCHAR m_lastCharSent;
  152. WCHAR m_Context[101];
  153. WORD m_bHiPri;
  154. WORD m_boxSize;
  155. WORD m_bDown;
  156. WORD m_bRightClick;
  157. WORD m_bNoInk;
  158. WORD m_cLogicalBox;
  159. WORD m_curBox;
  160. WORD m_iBoxPrev;
  161. HDC m_hdcMouse; // cache HDC. It must be NULL when deleting an object
  162. // of this class.
  163. HCURSOR m_hCursor;
  164. BOOL m_bResize;
  165. int m_firstX;
  166. BOOL m_bTimerStarted;
  167. UINT m_timeoutValue;
  168. WCHAR m_StringCandidate[MB_NUM_CANDIDATES][2];
  169. LPIMESTRINGCANDIDATE m_pImeStringCandidate;
  170. LPIMESTRINGCANDIDATEINFO m_pImeStringCandidateInfo;
  171. BOOL m_bErase;
  172. };
  173. class CHwxCAC;
  174. class CHwxInkWindow: public CHwxObject
  175. {
  176. public:
  177. CHwxInkWindow(BOOL,BOOL,CApplet *,HINSTANCE);
  178. ~CHwxInkWindow();
  179. virtual BOOL Initialize(TCHAR * pClsName);
  180. BOOL CreateUI(HWND);
  181. BOOL Terminate();
  182. BOOL HandleCreate(HWND);
  183. void HandlePaint(HWND);
  184. void HandleHelp(HWND,UINT,WPARAM,LPARAM);
  185. LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM);
  186. LRESULT HandleSettingChange(HWND,UINT,WPARAM,LPARAM);
  187. LRESULT HandleBtnSubWnd(HWND,UINT,WPARAM,LPARAM);
  188. LPWSTR LoadCACMBString(UINT);
  189. void HandleDlgMsg(HWND,BOOL);
  190. void CopyInkFromMBToCAC(CHwxStroke & str,long deltaX,long deltaY);
  191. void HandleSize(WPARAM,LPARAM);
  192. void ChangeLayout(BOOL);
  193. void SetTooltipInfo();
  194. void SetTooltipText(LPARAM);
  195. CHwxStroke * GetCACCHwxStroke();
  196. void DrawHwxGuide(HDC,LPRECT);
  197. void HandleConfigNotification();
  198. void UpdateRegistry(BOOL);
  199. void ChangeIMEPADSize(BOOL);
  200. BOOL HandleSizeNotify(INT *pWidth, INT *pHeight); //980605; ToshiaK
  201. _inline HWND GetInkWindow() { return m_hInkWnd; }
  202. _inline HWND GetToolTipWindow() { return m_hwndTT; }
  203. _inline int GetInkWindowWidth()
  204. {
  205. return m_bCAC ? m_wCACWidth : m_wInkWidth;
  206. }
  207. _inline int GetInkWindowHeight()
  208. {
  209. return m_bCAC ? m_wCACHeight : m_wInkHeight;
  210. }
  211. _inline int GetMBWidth() { return m_wPadWidth; }
  212. _inline int GetMBHeight() { return m_wPadHeight; }
  213. void SetMBHeight(int h);
  214. _inline int GetMBBoxNumber() { return m_numBoxes; }
  215. _inline int GetCACWidth() { return m_wCACWidth; }
  216. _inline int GetCACHeight() { return m_wCACHeight; }
  217. _inline int GetCACInkHeight() { return m_wCACInkHeight; }
  218. void SetCACInkHeight(int w);
  219. _inline CApplet * GetAppletPtr() { return m_pApplet; }
  220. _inline CHwxStroke * GetMBCHwxStroke() { return m_pMB->GetMBCHwxStroke(); }
  221. _inline BOOL Is16BitApp() { return m_b16Bit; }
  222. _inline BOOL IsNT() { return m_bNT; }
  223. _inline BOOL IsSglClk() { return m_bSglClk; }
  224. _inline BOOL IsDblClk() { return m_bDblClk; }
  225. _inline void SetSglClk(BOOL b)
  226. {
  227. m_bSglClk = b;
  228. if ( m_bCAC )
  229. {
  230. exbtnPushedorPoped(m_bSglClk);
  231. }
  232. }
  233. _inline void SetDblClk(BOOL b)
  234. {
  235. m_bDblClk = b;
  236. if ( m_bCAC )
  237. {
  238. if ( m_bDblClk )
  239. {
  240. m_bSglClk = FALSE;
  241. exbtnPushedorPoped(TRUE);
  242. }
  243. else
  244. {
  245. exbtnPushedorPoped(m_bSglClk);
  246. }
  247. }
  248. }
  249. INT OnChangeView(BOOL fLarge); //980728: by ToshiaK for raid #2846
  250. private:
  251. BOOL handleCACMBMenuCmd(RECT *,UINT,UINT,RECT *);
  252. void changeCACLayout(BOOL);
  253. void changeMBLayout(BOOL);
  254. void exbtnPushedorPoped(BOOL);
  255. FARPROC getCACMBBtnProc(HWND hwnd)
  256. {
  257. if ( hwnd == m_hCACMBMenu )
  258. return m_CACMBMenuDDBtnProc;
  259. else if ( hwnd == m_hCACMBRecog )
  260. return m_CACMBRecogEXBtnProc;
  261. else if ( hwnd == m_hCACMBRevert )
  262. return m_CACMBRevertEXBtnProc;
  263. else if ( hwnd == m_hCACMBClear )
  264. return m_CACMBClearEXBtnProc;
  265. else if ( hwnd == m_hCACSwitch )
  266. return m_CACSwitchDDBtnProc;
  267. else
  268. return NULL;
  269. }
  270. CApplet * m_pApplet;
  271. CHwxMB * m_pMB;
  272. CHwxCAC * m_pCAC;
  273. HWND m_hInkWnd;
  274. HWND m_hwndTT;
  275. BOOL m_b16Bit;
  276. BOOL m_bNT;
  277. BOOL m_bCAC;
  278. BOOL m_bSglClk;
  279. BOOL m_bDblClk;
  280. BOOL m_bMouseDown;
  281. HWND m_hCACMBMenu;
  282. HWND m_hCACMBRecog;
  283. HWND m_hCACMBRevert;
  284. HWND m_hCACMBClear;
  285. HWND m_hCACSwitch;
  286. FARPROC m_CACMBMenuDDBtnProc;
  287. FARPROC m_CACMBRecogEXBtnProc;
  288. FARPROC m_CACMBRevertEXBtnProc;
  289. FARPROC m_CACMBClearEXBtnProc;
  290. FARPROC m_CACSwitchDDBtnProc;
  291. int m_wInkWidth;
  292. int m_wInkHeight;
  293. int m_wPadWidth;
  294. int m_wPadHeight;
  295. int m_numBoxes;
  296. int m_wCACWidth;
  297. int m_wCACHeight;
  298. int m_wCACPLVHeight;
  299. int m_wCACPLVWidth;
  300. int m_wCACTMPWidth;
  301. int m_wCACInkHeight;
  302. };
  303. class CHwxCAC: public CHwxObject
  304. {
  305. friend int WINAPI GetItemForIcon(LPARAM lParam, int index, LPPLVITEM lpPlvItem);
  306. friend int WINAPI GetItemForReport(LPARAM lParam, int index, int indexCol, LPPLVITEM lpPlvItem);
  307. public:
  308. CHwxCAC(CHwxInkWindow * pInk,HINSTANCE hInst);
  309. ~CHwxCAC();
  310. virtual BOOL Initialize(TCHAR * pClsName);
  311. BOOL CreateUI(HWND);
  312. void HandlePaint(HWND);
  313. void HandleMouseEvent(HWND,UINT,WPARAM,LPARAM);
  314. void HandleRecogResult(HWND,WPARAM,LPARAM);
  315. void HandleShowRecogResult(HWND,WPARAM,LPARAM);
  316. void HandleSendResult(HWND,WPARAM,LPARAM);
  317. void GetInkFromMB(CHwxStroke & str,long deltaX,long deltaY);
  318. void HandleDeleteOneStroke();
  319. void HandleDeleteAllStroke();
  320. LRESULT HandleCommand(HWND,UINT,WPARAM,LPARAM);
  321. void OnSettingChange(UINT,WPARAM,LPARAM);
  322. void SetToolTipInfo(BOOL);
  323. void SetToolTipText(LPARAM);
  324. void recognize();
  325. void NoThreadRecognize(int);
  326. void HandleResizePaint(HWND);
  327. void SetInkSize(int);
  328. void HandleDrawSample();
  329. _inline long GetStrokeCount() { return m_pCHwxStroke->GetNumStrokes(); }
  330. _inline long * GetStrokeCountAddress() { return m_pCHwxStroke->GetNumStrokesAddress(); }
  331. _inline PSTROKE GetStrokePointer() { return m_pCHwxStroke->GetStrokePtr(); }
  332. _inline HWND GetCACWindow() { return m_hCACWnd; }
  333. _inline HWND GetCACLVWindow() { return m_hLVWnd; }
  334. _inline CHwxThreadCAC * GetCACThread() { return m_pCHwxThreadCAC; }
  335. _inline CHwxStroke * GetCACCHwxStroke() { return m_pCHwxStroke; }
  336. _inline BOOL Is16BitApp() { return m_pInk->Is16BitApp(); }
  337. _inline BOOL IsNT() { return m_pInk->IsNT(); }
  338. _inline BOOL IsLargeView() { return m_bLargeView; }
  339. _inline void SetLargeView(BOOL b) { m_bLargeView = b; }
  340. #ifdef FE_JAPANESE
  341. _inline IImeSkdic * GetIIMESKDIC() { return m_pIImeSkdic; }
  342. #endif
  343. _inline WCHAR GetWCHAR(int i)
  344. {
  345. if ( i >= 0 && i <= m_cnt )
  346. return m_gawch[i];
  347. return 0;
  348. }
  349. protected:
  350. private:
  351. BOOL Init();
  352. void InitBitmap(DWORD,int);
  353. void InitBitmapText();
  354. void InitBitmapBackground();
  355. BOOL checkRange(int, int);
  356. BOOL IsPointInResizeBox(int,int);
  357. BOOL IsDupResult(WORD);
  358. HBITMAP makeCharBitmap(WCHAR);
  359. void pickUpChar(LPPLVINFO);
  360. void pickUpCharHelper(WCHAR);
  361. #ifdef FE_JAPANESE
  362. void sortKanjiInfo(int);
  363. #endif
  364. CHwxInkWindow * m_pInk;
  365. CHwxThreadCAC * m_pCHwxThreadCAC;
  366. CHwxStroke * m_pCHwxStroke;
  367. HWND m_hCACWnd;
  368. BOOL m_bLargeView;
  369. BOOL m_gbDown;
  370. WORD m_bRightClick;
  371. WORD m_gawch[LISTTOTAL];
  372. int m_cnt;
  373. int m_inkSize;
  374. HDC m_ghdc;
  375. HBITMAP m_ghbm;
  376. HFONT m_ghfntTT;
  377. HWND m_hLVWnd;
  378. #ifdef FE_JAPANESE
  379. IImeSkdic * m_pIImeSkdic;
  380. HINSTANCE m_hSkdic;
  381. #endif
  382. LPPLVINFO m_lpPlvInfo;
  383. #ifdef FE_JAPANESE
  384. WCHAR m_wchOther[MAX_ITAIJI_COUNT+1];
  385. #endif
  386. HCURSOR m_hCursor;
  387. BOOL m_bResize;
  388. BOOL m_bDrawSample;
  389. };
  390. typedef BOOL (WINAPI * PHWXCONFIG)();
  391. typedef HRC (WINAPI * PHWXCREATE)(HRC);
  392. typedef BOOL (WINAPI * PHWXDESTROY)(HRC);
  393. typedef BOOL (WINAPI * PHWXSETGUIDE)(HRC,HWXGUIDE *);
  394. typedef BOOL (WINAPI * PHWXALCVALID)(HRC,ALC);
  395. typedef BOOL (WINAPI * PHWXALCPRIORITY)(HRC,ALC);
  396. typedef BOOL (WINAPI * PHWXSETPARTIAL)(HRC,UINT);
  397. typedef BOOL (WINAPI * PHWXSETABORT)(HRC,UINT *);
  398. typedef BOOL (WINAPI * PHWXINPUT)(HRC,POINT *,UINT,DWORD);
  399. typedef BOOL (WINAPI * PHWXENDINPUT)(HRC);
  400. typedef BOOL (WINAPI * PHWXPROCESS)(HRC);
  401. typedef INT (WINAPI * PHWXGETRESULTS)(HRC,UINT,UINT,UINT,HWXRESULTS *);
  402. typedef BOOL (WINAPI * PHWXSETCONTEXT)(HRC,WCHAR);
  403. typedef INT (WINAPI * PHWXRESULTSAVAILABLE)(HRC);
  404. typedef struct tagHWXRESULTPRI
  405. {
  406. WORD cbCount;
  407. WORD iSelection;
  408. WORD iPosition;
  409. WCHAR chCandidate[MB_NUM_CANDIDATES];
  410. struct tagHWXRESULTPRI *pNext;
  411. } HWXRESULTPRI, *LPHWXRESULTPRI;
  412. class CHwxThread: public CHwxObject
  413. {
  414. public:
  415. CHwxThread();
  416. ~CHwxThread();
  417. virtual BOOL Initialize(TCHAR * pClsName);
  418. BOOL StartThread() ;
  419. void StopThread() ;
  420. _inline BOOL IsThreadStarted() { return m_hThread != NULL; }
  421. _inline HANDLE GetHandle() { return m_hThread; }
  422. _inline DWORD GetID() { return m_thrdID; }
  423. _inline DWORD GetHwxThreadArg() { return m_thrdArg; }
  424. protected:
  425. virtual DWORD RecognizeThread(DWORD) = 0;
  426. //static HINSTANCE m_hHwxjpn;
  427. //----------------------------------------------------------------
  428. //971217:ToshiaK changed to static to no static.
  429. //ImePad window is created per Thread.
  430. //----------------------------------------------------------------
  431. HINSTANCE m_hHwxjpn;
  432. static PHWXCONFIG lpHwxConfig;
  433. static PHWXCREATE lpHwxCreate;
  434. static PHWXSETCONTEXT lpHwxSetContext;
  435. static PHWXSETGUIDE lpHwxSetGuide;
  436. static PHWXALCVALID lpHwxAlcValid;
  437. static PHWXSETPARTIAL lpHwxSetPartial;
  438. static PHWXSETABORT lpHwxSetAbort;
  439. static PHWXINPUT lpHwxInput;
  440. static PHWXENDINPUT lpHwxEndInput;
  441. static PHWXPROCESS lpHwxProcess;
  442. static PHWXRESULTSAVAILABLE lpHwxResultsAvailable;
  443. static PHWXGETRESULTS lpHwxGetResults;
  444. static PHWXDESTROY lpHwxDestroy;
  445. HANDLE m_hThread;
  446. DWORD m_thrdID;
  447. DWORD m_thrdArg;
  448. HANDLE m_hStopEvent;
  449. BOOL m_Quit; //971202: by Toshiak
  450. private:
  451. static DWORD WINAPI RealThreadProc(void* );
  452. DWORD ClassThreadProc();
  453. void RecogHelper(HRC,DWORD,DWORD);
  454. };
  455. class CHwxThreadMB: public CHwxThread
  456. {
  457. public:
  458. CHwxThreadMB(CHwxMB * pMB, int nSize);
  459. ~CHwxThreadMB();
  460. virtual BOOL Initialize(TCHAR * pClsName);
  461. virtual DWORD RecognizeThread(DWORD);
  462. protected:
  463. private:
  464. BOOL HandleThreadMsg(MSG *);
  465. HWXRESULTPRI *GetCandidates(HWXRESULTS *);
  466. void GetCharacters(int iSentAlready, int iReady);
  467. CHwxMB * m_pMB;
  468. ALC m_recogMask;
  469. WCHAR m_prevChar;
  470. HRC m_hrcActive; // HRC used for doing recognition.
  471. int m_giSent; // How many characters we have already sent.
  472. int m_bDirty; // True if there is ink to process.
  473. HWXGUIDE m_guide;
  474. };
  475. class CHwxThreadCAC: public CHwxThread
  476. {
  477. public:
  478. CHwxThreadCAC(CHwxCAC * pCAC);
  479. ~CHwxThreadCAC();
  480. virtual BOOL Initialize(TCHAR * pClsName);
  481. virtual DWORD RecognizeThread(DWORD);
  482. void RecognizeNoThread(int);
  483. _inline BOOL IsHwxjpnLoaded() { return m_hHwxjpn != NULL; }
  484. protected:
  485. private:
  486. void recoghelper(HRC,DWORD,DWORD);
  487. CHwxCAC * m_pCAC;
  488. };
  489. #endif // _HWXOBJ_H_