DXUTgui.h
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:48k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------------------------
  2. // File: DXUTgui.h
  3. //
  4. // Desc: 
  5. //
  6. // Copyright (c) Microsoft Corporation. All rights reserved.
  7. //--------------------------------------------------------------------------------------
  8. #pragma once
  9. #ifndef DXUT_GUI_H
  10. #define DXUT_GUI_H
  11. #include <usp10.h>
  12. #include <dimm.h>
  13. //--------------------------------------------------------------------------------------
  14. // Defines and macros 
  15. //--------------------------------------------------------------------------------------
  16. #define EVENT_BUTTON_CLICKED                0x0101
  17. #define EVENT_COMBOBOX_SELECTION_CHANGED    0x0201
  18. #define EVENT_RADIOBUTTON_CHANGED           0x0301
  19. #define EVENT_CHECKBOX_CHANGED              0x0401
  20. #define EVENT_SLIDER_VALUE_CHANGED          0x0501
  21. #define EVENT_EDITBOX_STRING                0x0601
  22. // EVENT_EDITBOX_CHANGE is sent when the listbox content changes
  23. // due to user input.
  24. #define EVENT_EDITBOX_CHANGE                0x0602
  25. #define EVENT_LISTBOX_ITEM_DBLCLK           0x0701
  26. // EVENT_LISTBOX_SELECTION is fired off when the selection changes in
  27. // a single selection list box.
  28. #define EVENT_LISTBOX_SELECTION             0x0702
  29. #define EVENT_LISTBOX_SELECTION_END         0x0703
  30. //--------------------------------------------------------------------------------------
  31. // Forward declarations
  32. //--------------------------------------------------------------------------------------
  33. class CDXUTDialogResourceManager;
  34. class CDXUTControl;
  35. class CDXUTButton;
  36. class CDXUTStatic;
  37. class CDXUTCheckBox;
  38. class CDXUTRadioButton;
  39. class CDXUTComboBox;
  40. class CDXUTSlider;
  41. class CDXUTEditBox;
  42. class CDXUTIMEEditBox;
  43. class CDXUTListBox;
  44. class CDXUTScrollBar;
  45. class CDXUTElement;
  46. struct DXUTElementHolder;
  47. struct DXUTTextureNode;
  48. struct DXUTFontNode;
  49. typedef VOID (CALLBACK *PCALLBACKDXUTGUIEVENT) ( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
  50. //--------------------------------------------------------------------------------------
  51. // Enums for pre-defined control types
  52. //--------------------------------------------------------------------------------------
  53. enum DXUT_CONTROL_TYPE 
  54.     DXUT_CONTROL_BUTTON, 
  55.     DXUT_CONTROL_STATIC, 
  56.     DXUT_CONTROL_CHECKBOX,
  57.     DXUT_CONTROL_RADIOBUTTON,
  58.     DXUT_CONTROL_COMBOBOX,
  59.     DXUT_CONTROL_SLIDER,
  60.     DXUT_CONTROL_EDITBOX,
  61.     DXUT_CONTROL_IMEEDITBOX,
  62.     DXUT_CONTROL_LISTBOX,
  63.     DXUT_CONTROL_SCROLLBAR,
  64. };
  65. enum DXUT_CONTROL_STATE
  66. {
  67.     DXUT_STATE_NORMAL = 0,
  68.     DXUT_STATE_DISABLED,
  69.     DXUT_STATE_HIDDEN,
  70.     DXUT_STATE_FOCUS,
  71.     DXUT_STATE_MOUSEOVER,
  72.     DXUT_STATE_PRESSED,
  73. };
  74. #define MAX_CONTROL_STATES 6
  75. struct DXUTBlendColor
  76. {
  77.     void Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor = D3DCOLOR_ARGB(200, 128, 128, 128), D3DCOLOR hiddenColor = 0 );
  78.     void Blend( UINT iState, float fElapsedTime, float fRate = 0.7f );
  79.     
  80.     D3DCOLOR  States[ MAX_CONTROL_STATES ]; // Modulate colors for all possible control states
  81.     D3DXCOLOR Current;
  82. };
  83. //-----------------------------------------------------------------------------
  84. // Contains all the display tweakables for a sub-control
  85. //-----------------------------------------------------------------------------
  86. class CDXUTElement
  87. {
  88. public:
  89.     void SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor = D3DCOLOR_ARGB(255, 255, 255, 255) );
  90.     void SetFont( UINT iFont, D3DCOLOR defaultFontColor = D3DCOLOR_ARGB(255, 255, 255, 255), DWORD dwTextFormat = DT_CENTER | DT_VCENTER );
  91.     
  92.     void Refresh();
  93.     
  94.     UINT iTexture;          // Index of the texture for this Element 
  95.     UINT iFont;             // Index of the font for this Element
  96.     DWORD dwTextFormat;     // The format argument to DrawText 
  97.     RECT rcTexture;         // Bounding rect of this element on the composite texture
  98.     
  99.     DXUTBlendColor TextureColor;
  100.     DXUTBlendColor FontColor;
  101. };
  102. //-----------------------------------------------------------------------------
  103. // All controls must be assigned to a dialog, which handles
  104. // input and rendering for the controls.
  105. //-----------------------------------------------------------------------------
  106. class CDXUTDialog
  107. {
  108.     friend class CDXUTDialogResourceManager;
  109. public:
  110.     CDXUTDialog();
  111.     ~CDXUTDialog();
  112.     // Need to call this now
  113.     void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog = true );
  114.     void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR pszControlTextureFilename );
  115.     void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule );
  116.     // Windows message handler
  117.     bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  118.     // Control creation
  119.     HRESULT AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTStatic** ppCreated=NULL );
  120.     HRESULT AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey=0, bool bIsDefault=false, CDXUTButton** ppCreated=NULL );
  121.     HRESULT AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false, CDXUTCheckBox** ppCreated=NULL );
  122.     HRESULT AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, int height, bool bChecked=false, UINT nHotkey=0, bool bIsDefault=false, CDXUTRadioButton** ppCreated=NULL );
  123.     HRESULT AddComboBox( int ID, int x, int y, int width, int height, UINT nHotKey=0, bool bIsDefault=false, CDXUTComboBox** ppCreated=NULL );
  124.     HRESULT AddSlider( int ID, int x, int y, int width, int height, int min=0, int max=100, int value=50, bool bIsDefault=false, CDXUTSlider** ppCreated=NULL );
  125.     HRESULT AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTEditBox** ppCreated=NULL );
  126.     HRESULT AddIMEEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTIMEEditBox** ppCreated=NULL );
  127.     HRESULT AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle=0, CDXUTListBox** ppCreated=NULL );
  128.     HRESULT AddControl( CDXUTControl* pControl );
  129.     HRESULT InitControl( CDXUTControl* pControl );
  130.     // Control retrieval
  131.     CDXUTStatic*      GetStatic( int ID ) { return (CDXUTStatic*) GetControl( ID, DXUT_CONTROL_STATIC ); }
  132.     CDXUTButton*      GetButton( int ID ) { return (CDXUTButton*) GetControl( ID, DXUT_CONTROL_BUTTON ); }
  133.     CDXUTCheckBox*    GetCheckBox( int ID ) { return (CDXUTCheckBox*) GetControl( ID, DXUT_CONTROL_CHECKBOX ); }
  134.     CDXUTRadioButton* GetRadioButton( int ID ) { return (CDXUTRadioButton*) GetControl( ID, DXUT_CONTROL_RADIOBUTTON ); }
  135.     CDXUTComboBox*    GetComboBox( int ID ) { return (CDXUTComboBox*) GetControl( ID, DXUT_CONTROL_COMBOBOX ); }
  136.     CDXUTSlider*      GetSlider( int ID ) { return (CDXUTSlider*) GetControl( ID, DXUT_CONTROL_SLIDER ); }
  137.     CDXUTEditBox*     GetEditBox( int ID ) { return (CDXUTEditBox*) GetControl( ID, DXUT_CONTROL_EDITBOX ); }
  138.     CDXUTIMEEditBox*  GetIMEEditBox( int ID ) { return (CDXUTIMEEditBox*) GetControl( ID, DXUT_CONTROL_IMEEDITBOX ); }
  139.     CDXUTListBox*     GetListBox( int ID ) { return (CDXUTListBox*) GetControl( ID, DXUT_CONTROL_LISTBOX ); }
  140.     CDXUTControl* GetControl( int ID );
  141.     CDXUTControl* GetControl( int ID, UINT nControlType );
  142.     CDXUTControl* GetControlAtPoint( POINT pt );
  143.     bool GetControlEnabled( int ID );
  144.     void SetControlEnabled( int ID, bool bEnabled );
  145.     void ClearRadioButtonGroup( UINT nGroup );
  146.     void ClearComboBox( int ID );
  147.     // Access the default display Elements used when adding new controls
  148.     HRESULT       SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement );
  149.     CDXUTElement* GetDefaultElement( UINT nControlType, UINT iElement );
  150.     // Methods called by controls
  151.     void SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl );
  152.     void RequestFocus( CDXUTControl* pControl );
  153.     // Render helpers
  154.     HRESULT DrawRect( RECT* pRect, D3DCOLOR color );
  155.     HRESULT DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color );
  156.     HRESULT DrawSprite( CDXUTElement* pElement, RECT* prcDest );
  157.     HRESULT CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount = -1 );
  158.     HRESULT DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, int nCount = -1 );
  159.     // Attributes
  160.     bool GetVisible() { return m_bVisible; }
  161.     void SetVisible( bool bVisible ) { m_bVisible = bVisible; }
  162.     bool GetMinimized() { return m_bMinimized; }
  163.     void SetMinimized( bool bMinimized ) { m_bMinimized = bMinimized; }
  164.     void SetBackgroundColors( D3DCOLOR colorAllCorners ) { SetBackgroundColors( colorAllCorners, colorAllCorners, colorAllCorners, colorAllCorners ); }
  165.     void SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft, D3DCOLOR colorBottomRight );
  166.     void EnableCaption( bool bEnable ) { m_bCaption = bEnable; }
  167.     int GetCaptionHeight() const { return m_nCaptionHeight; }
  168.     void SetCaptionHeight( int nHeight ) { m_nCaptionHeight = nHeight; }
  169.     void SetCaptionText( const WCHAR *pwszText ) { StringCchCopy( m_wszCaption, sizeof(m_wszCaption)/sizeof(m_wszCaption[0]), pwszText); }
  170.     void GetLocation( POINT &Pt ) const { Pt.x = m_x; Pt.y = m_y; }
  171.     void SetLocation( int x, int y ) { m_x = x; m_y = y; }
  172.     void SetSize( int width, int height ) { m_width = width; m_height = height;  }
  173.     int GetWidth() { return m_width; }
  174.     int GetHeight() { return m_height; }
  175.     static void SetRefreshTime( float fTime ){ s_fTimeRefresh = fTime; }
  176.     static CDXUTControl* GetNextControl( CDXUTControl* pControl );
  177.     static CDXUTControl* GetPrevControl( CDXUTControl* pControl );
  178.     void RemoveControl( int ID );
  179.     void RemoveAllControls();
  180.     // Sets the callback used to notify the app of control events
  181.     void SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext = NULL );
  182.     void EnableNonUserEvents( bool bEnable ) { m_bNonUserEvents = bEnable; }
  183.     void EnableKeyboardInput( bool bEnable ) { m_bKeyboardInput = bEnable; }
  184.     void EnableMouseInput( bool bEnable ) { m_bMouseInput = bEnable; }
  185.     bool IsKeyboardInputEnabled() const { return m_bKeyboardInput; }
  186.     // Device state notification
  187.     void Refresh();
  188.     HRESULT OnRender( float fElapsedTime );
  189.     // Shared resource access. Indexed fonts and textures are shared among
  190.     // all the controls.
  191.     HRESULT       SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight );
  192.     DXUTFontNode* GetFont( UINT index );
  193.     HRESULT          SetTexture( UINT index, LPCWSTR strFilename );
  194.     HRESULT          SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule );
  195.     DXUTTextureNode* GetTexture( UINT index );
  196.     CDXUTDialogResourceManager* GetManager() { return m_pManager; }
  197.     static void ClearFocus();
  198.     void FocusDefaultControl();
  199.     bool m_bNonUserEvents;
  200.     bool m_bKeyboardInput;
  201.     bool m_bMouseInput;
  202. private:
  203.     int m_nDefaultControlID;
  204.     static double s_fTimeRefresh;
  205.     double m_fTimeLastRefresh;
  206.     // Initialize default Elements
  207.     void InitDefaultElements();
  208.     // Windows message handlers
  209.     void OnMouseMove( POINT pt );
  210.     void OnMouseUp( POINT pt );
  211.     void SetNextDialog( CDXUTDialog* pNextDialog );
  212.     // Control events
  213.     bool OnCycleFocus( bool bForward );
  214.     static CDXUTControl* s_pControlFocus;        // The control which has focus
  215.     static CDXUTControl* s_pControlPressed;      // The control currently pressed
  216.     CDXUTControl* m_pControlMouseOver;           // The control which is hovered over
  217.     bool m_bVisible;
  218.     bool m_bCaption;
  219.     bool m_bMinimized;
  220.     bool m_bDrag;
  221.     WCHAR m_wszCaption[256];
  222.     int m_x;
  223.     int m_y;
  224.     int m_width;
  225.     int m_height;
  226.     int m_nCaptionHeight;
  227.     D3DCOLOR m_colorTopLeft;
  228.     D3DCOLOR m_colorTopRight;
  229.     D3DCOLOR m_colorBottomLeft;
  230.     D3DCOLOR m_colorBottomRight;
  231.     CDXUTDialogResourceManager* m_pManager;
  232.     PCALLBACKDXUTGUIEVENT m_pCallbackEvent;
  233.     void* m_pCallbackEventUserContext;
  234.     CGrowableArray< int > m_Textures;   // Index into m_TextureCache;
  235.     CGrowableArray< int > m_Fonts;      // Index into m_FontCache;
  236.     CGrowableArray< CDXUTControl* > m_Controls;
  237.     CGrowableArray< DXUTElementHolder* > m_DefaultElements;
  238.     CDXUTElement m_CapElement;  // Element for the caption
  239.     CDXUTDialog* m_pNextDialog;
  240.     CDXUTDialog* m_pPrevDialog;
  241. };
  242. //--------------------------------------------------------------------------------------
  243. // Structs for shared resources
  244. //--------------------------------------------------------------------------------------
  245. struct DXUTTextureNode
  246. {
  247.     bool bFileSource;  // True if this texture is loaded from a file. False if from resource.
  248.     HMODULE hResourceModule;
  249.     int nResourceID;   // Resource ID. If 0, string-based ID is used and stored in strFilename.
  250.     WCHAR strFilename[MAX_PATH];
  251.     IDirect3DTexture9* pTexture;
  252.     DWORD dwWidth;
  253.     DWORD dwHeight;
  254. };
  255. struct DXUTFontNode
  256. {
  257.     WCHAR strFace[MAX_PATH];
  258.     ID3DXFont* pFont;
  259.     LONG  nHeight;
  260.     LONG  nWeight;
  261. };
  262. //-----------------------------------------------------------------------------
  263. // Manages shared resources of dialogs
  264. //-----------------------------------------------------------------------------
  265. class CDXUTDialogResourceManager
  266. {
  267. public:
  268.     CDXUTDialogResourceManager();
  269.     ~CDXUTDialogResourceManager();
  270.     HRESULT     OnCreateDevice( LPDIRECT3DDEVICE9 pd3dDevice );
  271.     HRESULT     OnResetDevice();
  272.     void        OnLostDevice();
  273.     void        OnDestroyDevice();
  274.     bool        MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
  275.     
  276.     int AddFont( LPCWSTR strFaceName, LONG height, LONG weight );
  277.     int AddTexture( LPCWSTR strFilename );
  278.     int AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule );
  279.     DXUTFontNode*     GetFontNode( int iIndex )     { return m_FontCache.GetAt( iIndex ); };
  280.     DXUTTextureNode*  GetTextureNode( int iIndex )  { return m_TextureCache.GetAt( iIndex ); };
  281.     IDirect3DDevice9* GetD3DDevice()                { return m_pd3dDevice; }
  282.     bool RegisterDialog( CDXUTDialog *pDialog );
  283.     void UnregisterDialog( CDXUTDialog *pDialog );
  284.     void EnableKeyboardInputForAllDialogs();
  285.     // Shared between all dialogs
  286.     IDirect3DStateBlock9* m_pStateBlock;
  287.     ID3DXSprite*          m_pSprite;          // Sprite used for drawing
  288.     CGrowableArray< CDXUTDialog* > m_Dialogs;            // Dialogs registered
  289. protected:
  290.     CGrowableArray< DXUTTextureNode* > m_TextureCache;   // Shared textures
  291.     CGrowableArray< DXUTFontNode* > m_FontCache;         // Shared fonts
  292.     IDirect3DDevice9* m_pd3dDevice;
  293.     // Resource creation helpers
  294.     HRESULT CreateFont( UINT index );
  295.     HRESULT CreateTexture( UINT index );
  296. };
  297. //-----------------------------------------------------------------------------
  298. // Base class for controls
  299. //-----------------------------------------------------------------------------
  300. class CDXUTControl
  301. {
  302. public:
  303.     CDXUTControl( CDXUTDialog *pDialog = NULL );
  304.     virtual ~CDXUTControl();
  305.     virtual HRESULT OnInit() { return S_OK; }
  306.     virtual void Refresh();
  307.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime ) { };
  308.     // Windows message handler
  309.     virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) { return false; }
  310.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) { return false; }
  311.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) { return false; }
  312.     virtual bool CanHaveFocus() { return false; }
  313.     virtual void OnFocusIn() { m_bHasFocus = true; }
  314.     virtual void OnFocusOut() { m_bHasFocus = false; }
  315.     virtual void OnMouseEnter() { m_bMouseOver = true; }
  316.     virtual void OnMouseLeave() { m_bMouseOver = false; }
  317.     virtual void OnHotkey() {}
  318.     virtual BOOL ContainsPoint( POINT pt ) { return PtInRect( &m_rcBoundingBox, pt ); }
  319.     virtual void SetEnabled( bool bEnabled ) { m_bEnabled = bEnabled; }
  320.     virtual bool GetEnabled() { return m_bEnabled; }
  321.     virtual void SetVisible( bool bVisible ) { m_bVisible = bVisible; }
  322.     virtual bool GetVisible() { return m_bVisible; }
  323.     UINT GetType() const { return m_Type; }
  324.     int  GetID() const { return m_ID; }
  325.     void SetID( int ID ) { m_ID = ID; }
  326.     void SetLocation( int x, int y ) { m_x = x; m_y = y; UpdateRects(); }
  327.     void SetSize( int width, int height ) { m_width = width; m_height = height; UpdateRects(); }
  328.     void SetHotkey( UINT nHotkey ) { m_nHotkey = nHotkey; }
  329.     UINT GetHotkey() { return m_nHotkey; }
  330.     void SetUserData( void *pUserData ) { m_pUserData = pUserData; }
  331.     void *GetUserData() const { return m_pUserData; }
  332.     virtual void SetTextColor( D3DCOLOR Color );
  333.     CDXUTElement* GetElement( UINT iElement ) { return m_Elements.GetAt( iElement ); }
  334.     HRESULT SetElement( UINT iElement, CDXUTElement* pElement);
  335.     bool m_bVisible;                // Shown/hidden flag
  336.     bool m_bMouseOver;              // Mouse pointer is above control
  337.     bool m_bHasFocus;               // Control has input focus
  338.     bool m_bIsDefault;              // Is the default control
  339.     // Size, scale, and positioning members
  340.     int m_x, m_y;
  341.     int m_width, m_height;
  342.     // These members are set by the container
  343.     CDXUTDialog* m_pDialog;    // Parent container
  344.     UINT m_Index;              // Index within the control list
  345.     
  346.     CGrowableArray< CDXUTElement* > m_Elements;  // All display elements
  347. protected:
  348.     virtual void UpdateRects();
  349.     int  m_ID;                 // ID number
  350.     DXUT_CONTROL_TYPE m_Type;  // Control type, set once in constructor  
  351.     UINT m_nHotkey;            // Virtual key code for this control's hotkey
  352.     void *m_pUserData;         // Data associated with this control that is set by user.
  353.     
  354.     bool m_bEnabled;           // Enabled/disabled flag
  355.     
  356.     RECT m_rcBoundingBox;      // Rectangle defining the active region of the control
  357. };
  358. //-----------------------------------------------------------------------------
  359. // Contains all the display information for a given control type
  360. //-----------------------------------------------------------------------------
  361. struct DXUTElementHolder
  362. {
  363.     UINT nControlType;
  364.     UINT iElement;
  365.     CDXUTElement Element;
  366. };
  367. //-----------------------------------------------------------------------------
  368. // Static control
  369. //-----------------------------------------------------------------------------
  370. class CDXUTStatic : public CDXUTControl
  371. {
  372. public:
  373.     CDXUTStatic( CDXUTDialog *pDialog = NULL );
  374.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  375.     virtual BOOL ContainsPoint( POINT pt ) { return false; }
  376.     HRESULT GetTextCopy( LPWSTR strDest, UINT bufferCount );
  377.     LPCWSTR GetText() { return m_strText; }
  378.     HRESULT SetText( LPCWSTR strText );
  379. protected:
  380.     WCHAR m_strText[MAX_PATH];      // Window text  
  381. };
  382. //-----------------------------------------------------------------------------
  383. // Button control
  384. //-----------------------------------------------------------------------------
  385. class CDXUTButton : public CDXUTStatic
  386. {
  387. public:
  388.     CDXUTButton( CDXUTDialog *pDialog = NULL );
  389.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  390.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  391.     virtual void OnHotkey() { if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); }
  392.     
  393.     virtual BOOL ContainsPoint( POINT pt ) { return PtInRect( &m_rcBoundingBox, pt ); }
  394.     virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); }
  395.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  396. protected:
  397.     bool m_bPressed;
  398. };
  399. //-----------------------------------------------------------------------------
  400. // CheckBox control
  401. //-----------------------------------------------------------------------------
  402. class CDXUTCheckBox : public CDXUTButton
  403. {
  404. public:
  405.     CDXUTCheckBox( CDXUTDialog *pDialog = NULL );
  406.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  407.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  408.     virtual void OnHotkey() { if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); SetCheckedInternal( !m_bChecked, true ); }
  409.     virtual BOOL ContainsPoint( POINT pt ); 
  410.     virtual void UpdateRects(); 
  411.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  412.     bool GetChecked() { return m_bChecked; }
  413.     void SetChecked( bool bChecked ) { SetCheckedInternal( bChecked, false ); }
  414.     
  415. protected:
  416.     virtual void SetCheckedInternal( bool bChecked, bool bFromInput );
  417.     bool m_bChecked;
  418.     RECT m_rcButton;
  419.     RECT m_rcText;
  420. };
  421. //-----------------------------------------------------------------------------
  422. // RadioButton control
  423. //-----------------------------------------------------------------------------
  424. class CDXUTRadioButton : public CDXUTCheckBox
  425. {
  426. public:
  427.     CDXUTRadioButton( CDXUTDialog *pDialog = NULL );
  428.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  429.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  430.     virtual void OnHotkey() { if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); SetCheckedInternal( true, true, true ); }
  431.     
  432.     void SetChecked( bool bChecked, bool bClearGroup=true ) { SetCheckedInternal( bChecked, bClearGroup, false ); }
  433.     void SetButtonGroup( UINT nButtonGroup ) { m_nButtonGroup = nButtonGroup; }
  434.     UINT GetButtonGroup() { return m_nButtonGroup; }
  435.     
  436. protected:
  437.     virtual void SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput );
  438.     UINT m_nButtonGroup;
  439. };
  440. //-----------------------------------------------------------------------------
  441. // Scrollbar control
  442. //-----------------------------------------------------------------------------
  443. class CDXUTScrollBar : public CDXUTControl
  444. {
  445. public:
  446.     CDXUTScrollBar( CDXUTDialog *pDialog = NULL );
  447.     virtual ~CDXUTScrollBar();
  448.     virtual bool    HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  449.     virtual bool    HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  450.     virtual bool    MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
  451.     virtual void    Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  452.     virtual void    UpdateRects();
  453.     void SetTrackRange( int nStart, int nEnd );
  454.     int GetTrackPos() { return m_nPosition; }
  455.     void SetTrackPos( int nPosition ) { m_nPosition = nPosition; Cap(); UpdateThumbRect(); }
  456.     int GetPageSize() { return m_nPageSize; }
  457.     void SetPageSize( int nPageSize ) { m_nPageSize = nPageSize; Cap(); UpdateThumbRect(); }
  458.     void Scroll( int nDelta );    // Scroll by nDelta items (plus or minus)
  459.     void ShowItem( int nIndex );  // Ensure that item nIndex is displayed, scroll if necessary
  460. protected:
  461.     // ARROWSTATE indicates the state of the arrow buttons.
  462.     // CLEAR            No arrow is down.
  463.     // CLICKED_UP       Up arrow is clicked.
  464.     // CLICKED_DOWN     Down arrow is clicked.
  465.     // HELD_UP          Up arrow is held down for sustained period.
  466.     // HELD_DOWN        Down arrow is held down for sustained period.
  467.     enum ARROWSTATE { CLEAR, CLICKED_UP, CLICKED_DOWN, HELD_UP, HELD_DOWN };
  468.     void UpdateThumbRect();
  469.     void Cap();  // Clips position at boundaries. Ensures it stays within legal range.
  470.     bool m_bShowThumb;
  471.     bool m_bDrag;
  472.     RECT m_rcUpButton;
  473.     RECT m_rcDownButton;
  474.     RECT m_rcTrack;
  475.     RECT m_rcThumb;
  476.     int m_nPosition;  // Position of the first displayed item
  477.     int m_nPageSize;  // How many items are displayable in one page
  478.     int m_nStart;     // First item
  479.     int m_nEnd;       // The index after the last item
  480.     POINT m_LastMouse;// Last mouse position
  481.     ARROWSTATE m_Arrow; // State of the arrows
  482.     double m_dArrowTS;  // Timestamp of last arrow event.
  483. };
  484. //-----------------------------------------------------------------------------
  485. // ListBox control
  486. //-----------------------------------------------------------------------------
  487. struct DXUTListBoxItem
  488. {
  489.     WCHAR strText[256];
  490.     void*  pData;
  491.     RECT  rcActive;
  492.     bool  bSelected;
  493. };
  494. class CDXUTListBox : public CDXUTControl
  495. {
  496. public:
  497.     CDXUTListBox( CDXUTDialog *pDialog = NULL );
  498.     virtual ~CDXUTListBox();
  499.     virtual HRESULT OnInit() { return m_pDialog->InitControl( &m_ScrollBar ); }
  500.     virtual bool    CanHaveFocus() { return (m_bVisible && m_bEnabled); }
  501.     virtual bool    HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  502.     virtual bool    HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  503.     virtual bool    MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
  504.     virtual void    Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  505.     virtual void    UpdateRects();
  506.     DWORD GetStyle() const { return m_dwStyle; }
  507.     int GetSize() const { return m_Items.GetSize(); }
  508.     void SetStyle( DWORD dwStyle ) { m_dwStyle = dwStyle; }
  509.     int  GetScrollBarWidth() const { return m_nSBWidth; }
  510.     void SetScrollBarWidth( int nWidth ) { m_nSBWidth = nWidth; UpdateRects(); }
  511.     void SetBorder( int nBorder, int nMargin ) { m_nBorder = nBorder; m_nMargin = nMargin; }
  512.     HRESULT AddItem( const WCHAR *wszText, void *pData );
  513.     HRESULT InsertItem( int nIndex, const WCHAR *wszText, void *pData );
  514.     void RemoveItem( int nIndex );
  515.     void RemoveItemByText( WCHAR *wszText );
  516.     void RemoveItemByData( void *pData );
  517.     void RemoveAllItems();
  518.     DXUTListBoxItem *GetItem( int nIndex );
  519.     int GetSelectedIndex( int nPreviousSelected = -1 );
  520.     DXUTListBoxItem *GetSelectedItem( int nPreviousSelected = -1 ) { return GetItem( GetSelectedIndex( nPreviousSelected ) ); }
  521.     void SelectItem( int nNewIndex );
  522.     enum STYLE { MULTISELECTION = 1 };
  523. protected:
  524.     RECT m_rcText;      // Text rendering bound
  525.     RECT m_rcSelection; // Selection box bound
  526.     CDXUTScrollBar m_ScrollBar;
  527.     int m_nSBWidth;
  528.     int m_nBorder;
  529.     int m_nMargin;
  530.     int m_nTextHeight;  // Height of a single line of text
  531.     DWORD m_dwStyle;    // List box style
  532.     int m_nSelected;    // Index of the selected item for single selection list box
  533.     int m_nSelStart;    // Index of the item where selection starts (for handling multi-selection)
  534.     bool m_bDrag;       // Whether the user is dragging the mouse to select
  535.     CGrowableArray< DXUTListBoxItem* > m_Items;
  536. };
  537. //-----------------------------------------------------------------------------
  538. // ComboBox control
  539. //-----------------------------------------------------------------------------
  540. struct DXUTComboBoxItem
  541. {
  542.     WCHAR strText[256];
  543.     void*  pData;
  544.     RECT  rcActive;
  545.     bool  bVisible;
  546. };
  547. class CDXUTComboBox : public CDXUTButton
  548. {
  549. public:
  550.     CDXUTComboBox( CDXUTDialog *pDialog = NULL );
  551.     virtual ~CDXUTComboBox();
  552.     
  553.     virtual void SetTextColor( D3DCOLOR Color );
  554.     virtual HRESULT OnInit() { return m_pDialog->InitControl( &m_ScrollBar ); }
  555.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  556.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  557.     virtual void OnHotkey();
  558.     virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); }
  559.     virtual void OnFocusOut();
  560.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  561.     virtual void UpdateRects(); 
  562.     HRESULT AddItem( const WCHAR* strText, void* pData );
  563.     void    RemoveAllItems();
  564.     void    RemoveItem( UINT index );
  565.     bool    ContainsItem( const WCHAR* strText, UINT iStart=0 );
  566.     int     FindItem( const WCHAR* strText, UINT iStart=0 );
  567.     void*   GetItemData( const WCHAR* strText );
  568.     void*   GetItemData( int nIndex );
  569.     void    SetDropHeight( UINT nHeight ) { m_nDropHeight = nHeight; UpdateRects(); }
  570.     int     GetScrollBarWidth() const { return m_nSBWidth; }
  571.     void    SetScrollBarWidth( int nWidth ) { m_nSBWidth = nWidth; UpdateRects(); }
  572.     void*   GetSelectedData();
  573.     DXUTComboBoxItem* GetSelectedItem();
  574.     UINT    GetNumItems() { return m_Items.GetSize(); }
  575.     DXUTComboBoxItem* GetItem( UINT index ) { return m_Items.GetAt( index ); }
  576.     HRESULT SetSelectedByIndex( UINT index );
  577.     HRESULT SetSelectedByText( const WCHAR* strText );
  578.     HRESULT SetSelectedByData( void* pData );  
  579. protected:
  580.     int     m_iSelected;
  581.     int     m_iFocused;
  582.     int     m_nDropHeight;
  583.     CDXUTScrollBar m_ScrollBar;
  584.     int     m_nSBWidth;
  585.     bool    m_bOpened;
  586.     RECT m_rcText;
  587.     RECT m_rcButton;
  588.     RECT m_rcDropdown;
  589.     RECT m_rcDropdownText;
  590.     
  591.     CGrowableArray< DXUTComboBoxItem* > m_Items;
  592. };
  593. //-----------------------------------------------------------------------------
  594. // Slider control
  595. //-----------------------------------------------------------------------------
  596. class CDXUTSlider : public CDXUTControl
  597. {
  598. public:
  599.     CDXUTSlider( CDXUTDialog *pDialog = NULL );
  600.     virtual BOOL ContainsPoint( POINT pt ); 
  601.     virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); }
  602.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  603.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  604.     
  605.     virtual void UpdateRects(); 
  606.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  607.     void SetValue( int nValue ) { SetValueInternal( nValue, false ); }
  608.     int  GetValue() const { return m_nValue; };
  609.     void GetRange( int &nMin, int &nMax ) const { nMin = m_nMin; nMax = m_nMax; }
  610.     void SetRange( int nMin, int nMax );
  611. protected:
  612.     void SetValueInternal( int nValue, bool bFromInput );
  613.     int  ValueFromPos( int x ); 
  614.     int m_nValue;
  615.     int m_nMin;
  616.     int m_nMax;
  617.     int m_nDragX;      // Mouse position at start of drag
  618.     int m_nDragOffset; // Drag offset from the center of the button
  619.     int m_nButtonX;
  620.     bool m_bPressed;
  621.     RECT m_rcButton;
  622. };
  623. //-----------------------------------------------------------------------------
  624. // CUniBuffer class for the edit control
  625. //-----------------------------------------------------------------------------
  626. class CUniBuffer
  627. {
  628. public:
  629.     CUniBuffer( int nInitialSize = 1 );
  630.     ~CUniBuffer();
  631.     static void Initialize();
  632.     static void Uninitialize();
  633.     int  GetBufferSize() { return m_nBufferSize; }
  634.     bool SetBufferSize( int nSize );
  635.     int  GetTextSize()  { return lstrlenW( m_pwszBuffer ); }
  636.     const WCHAR* GetBuffer() { return m_pwszBuffer; }
  637.     const WCHAR& operator[]( int n ) const { return m_pwszBuffer[n]; }
  638.     WCHAR& operator[]( int n );
  639.     DXUTFontNode* GetFontNode() { return m_pFontNode; }
  640.     void SetFontNode( DXUTFontNode *pFontNode ) { m_pFontNode = pFontNode; }
  641.     void Clear();
  642.     bool InsertChar( int nIndex, WCHAR wChar ); // Inserts the char at specified index. If nIndex == -1, insert to the end.
  643.     bool RemoveChar( int nIndex );  // Removes the char at specified index. If nIndex == -1, remove the last char.
  644.     bool InsertString( int nIndex, const WCHAR *pStr, int nCount = -1 );  // Inserts the first nCount characters of the string pStr at specified index.  If nCount == -1, the entire string is inserted. If nIndex == -1, insert to the end.
  645.     bool SetText( LPCWSTR wszText );
  646.     // Uniscribe
  647.     HRESULT CPtoX( int nCP, BOOL bTrail, int *pX );
  648.     HRESULT XtoCP( int nX, int *pCP, int *pnTrail );
  649.     void GetPriorItemPos( int nCP, int *pPrior );
  650.     void GetNextItemPos( int nCP, int *pPrior );
  651. private:
  652.     HRESULT Analyse();      // Uniscribe -- Analyse() analyses the string in the buffer
  653.     WCHAR* m_pwszBuffer;    // Buffer to hold text
  654.     int    m_nBufferSize;   // Size of the buffer allocated, in characters
  655.     // Uniscribe-specific
  656.     DXUTFontNode* m_pFontNode;          // Font node for the font that this buffer uses
  657.     bool m_bAnalyseRequired;            // True if the string has changed since last analysis.
  658.     SCRIPT_STRING_ANALYSIS m_Analysis;  // Analysis for the current string
  659. private:
  660.     // Empty implementation of the Uniscribe API
  661.     static HRESULT WINAPI Dummy_ScriptApplyDigitSubstitution( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, SCRIPT_STATE* ) { return E_NOTIMPL; }
  662.     static HRESULT WINAPI Dummy_ScriptStringAnalyse( HDC, const void *, int, int, int, DWORD, int, SCRIPT_CONTROL*, SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*, SCRIPT_STRING_ANALYSIS* ) { return E_NOTIMPL; }
  663.     static HRESULT WINAPI Dummy_ScriptStringCPtoX( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) { return E_NOTIMPL; }
  664.     static HRESULT WINAPI Dummy_ScriptStringXtoCP( SCRIPT_STRING_ANALYSIS, int, int*, int* ) { return E_NOTIMPL; }
  665.     static HRESULT WINAPI Dummy_ScriptStringFree( SCRIPT_STRING_ANALYSIS* ) { return E_NOTIMPL; }
  666.     static const SCRIPT_LOGATTR* WINAPI Dummy_ScriptString_pLogAttr( SCRIPT_STRING_ANALYSIS ) { return NULL; }
  667.     static const int* WINAPI Dummy_ScriptString_pcOutChars( SCRIPT_STRING_ANALYSIS ) { return NULL; }
  668.     // Function pointers
  669.     static HRESULT (WINAPI *_ScriptApplyDigitSubstitution)( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, SCRIPT_STATE* );
  670.     static HRESULT (WINAPI *_ScriptStringAnalyse)( HDC, const void *, int, int, int, DWORD, int, SCRIPT_CONTROL*, SCRIPT_STATE*, const int*, SCRIPT_TABDEF*, const BYTE*, SCRIPT_STRING_ANALYSIS* );
  671.     static HRESULT (WINAPI *_ScriptStringCPtoX)( SCRIPT_STRING_ANALYSIS, int, BOOL, int* );
  672.     static HRESULT (WINAPI *_ScriptStringXtoCP)( SCRIPT_STRING_ANALYSIS, int, int*, int* );
  673.     static HRESULT (WINAPI *_ScriptStringFree)( SCRIPT_STRING_ANALYSIS* );
  674.     static const SCRIPT_LOGATTR* (WINAPI *_ScriptString_pLogAttr)( SCRIPT_STRING_ANALYSIS );
  675.     static const int* (WINAPI *_ScriptString_pcOutChars)( SCRIPT_STRING_ANALYSIS );
  676.     static HINSTANCE s_hDll;  // Uniscribe DLL handle
  677. };
  678. //-----------------------------------------------------------------------------
  679. // EditBox control
  680. //-----------------------------------------------------------------------------
  681. class CDXUTEditBox : public CDXUTControl
  682. {
  683. public:
  684.     CDXUTEditBox( CDXUTDialog *pDialog = NULL );
  685.     virtual ~CDXUTEditBox();
  686.     virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam );
  687.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  688.     virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
  689.     virtual void UpdateRects();
  690.     virtual bool CanHaveFocus() { return (m_bVisible && m_bEnabled); }
  691.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  692.     virtual void OnFocusIn();
  693.     void SetText( LPCWSTR wszText, bool bSelected = false );
  694.     LPCWSTR GetText() { return m_Buffer.GetBuffer(); }
  695.     int GetTextLength() { return m_Buffer.GetTextSize(); }  // Returns text length in chars excluding NULL.
  696.     HRESULT GetTextCopy( LPWSTR strDest, UINT bufferCount );
  697.     void ClearText();
  698.     virtual void SetTextColor( D3DCOLOR Color ) { m_TextColor = Color; }  // Text color
  699.     void SetSelectedTextColor( D3DCOLOR Color ) { m_SelTextColor = Color; }  // Selected text color
  700.     void SetSelectedBackColor( D3DCOLOR Color ) { m_SelBkColor = Color; }  // Selected background color
  701.     void SetCaretColor( D3DCOLOR Color ) { m_CaretColor = Color; }  // Caret color
  702.     void SetBorderWidth( int nBorder ) { m_nBorder = nBorder; UpdateRects(); }  // Border of the window
  703.     void SetSpacing( int nSpacing ) { m_nSpacing = nSpacing; UpdateRects(); }
  704.     void ParseFloatArray( float *pNumbers, int nCount );
  705.     void SetTextFloatArray( const float *pNumbers, int nCount );
  706. protected:
  707.     void PlaceCaret( int nCP );
  708.     void DeleteSelectionText();
  709.     void ResetCaretBlink();
  710.     void CopyToClipboard();
  711.     void PasteFromClipboard();
  712.     CUniBuffer m_Buffer;     // Buffer to hold text
  713.     int      m_nBorder;      // Border of the window
  714.     int      m_nSpacing;     // Spacing between the text and the edge of border
  715.     RECT     m_rcText;       // Bounding rectangle for the text
  716.     RECT     m_rcRender[9];  // Convenient rectangles for rendering elements
  717.     double   m_dfBlink;      // Caret blink time in milliseconds
  718.     double   m_dfLastBlink;  // Last timestamp of caret blink
  719.     bool     m_bCaretOn;     // Flag to indicate whether caret is currently visible
  720.     int      m_nCaret;       // Caret position, in characters
  721.     bool     m_bInsertMode;  // If true, control is in insert mode. Else, overwrite mode.
  722.     int      m_nSelStart;    // Starting position of the selection. The caret marks the end.
  723.     int      m_nFirstVisible;// First visible character in the edit control
  724.     D3DCOLOR m_TextColor;    // Text color
  725.     D3DCOLOR m_SelTextColor; // Selected text color
  726.     D3DCOLOR m_SelBkColor;   // Selected background color
  727.     D3DCOLOR m_CaretColor;   // Caret color
  728.     // Mouse-specific
  729.     bool m_bMouseDrag;       // True to indicate drag in progress
  730.     // Static
  731.     static bool s_bHideCaret;   // If true, we don't render the caret.
  732. };
  733. //-----------------------------------------------------------------------------
  734. // IME-enabled EditBox control
  735. //-----------------------------------------------------------------------------
  736. #define MAX_CANDLIST 10
  737. #define MAX_COMPSTRING_SIZE 256
  738. class CDXUTIMEEditBox : public CDXUTEditBox
  739. {
  740. protected:
  741.     // Empty implementation of the IMM32 API
  742.     static INPUTCONTEXT* WINAPI Dummy_ImmLockIMC( HIMC ) { return NULL; }
  743.     static BOOL WINAPI Dummy_ImmUnlockIMC( HIMC ) { return FALSE; }
  744.     static LPVOID WINAPI Dummy_ImmLockIMCC( HIMCC ) { return NULL; }
  745.     static BOOL WINAPI Dummy_ImmUnlockIMCC( HIMCC ) { return FALSE; }
  746.     static BOOL WINAPI Dummy_ImmDisableTextFrameService( DWORD ) { return TRUE; }
  747.     static LONG WINAPI Dummy_ImmGetCompositionStringW( HIMC, DWORD, LPVOID, DWORD ) { return IMM_ERROR_GENERAL; }
  748.     static DWORD WINAPI Dummy_ImmGetCandidateListW( HIMC, DWORD, LPCANDIDATELIST, DWORD ) { return 0; }
  749.     static HIMC WINAPI Dummy_ImmGetContext( HWND ) { return NULL; }
  750.     static BOOL WINAPI Dummy_ImmReleaseContext( HWND, HIMC ) { return FALSE; }
  751.     static HIMC WINAPI Dummy_ImmAssociateContext( HWND, HIMC ) { return NULL; }
  752.     static BOOL WINAPI Dummy_ImmGetOpenStatus( HIMC ) { return 0; }
  753.     static BOOL WINAPI Dummy_ImmSetOpenStatus( HIMC, BOOL ) { return 0; }
  754.     static BOOL WINAPI Dummy_ImmGetConversionStatus( HIMC, LPDWORD, LPDWORD ) { return 0; }
  755.     static HWND WINAPI Dummy_ImmGetDefaultIMEWnd( HWND ) { return NULL; }
  756.     static UINT WINAPI Dummy_ImmGetIMEFileNameA( HKL, LPSTR, UINT ) { return 0; }
  757.     static UINT WINAPI Dummy_ImmGetVirtualKey( HWND ) { return 0; }
  758.     static BOOL WINAPI Dummy_ImmNotifyIME( HIMC, DWORD, DWORD, DWORD ) { return FALSE; }
  759.     static BOOL WINAPI Dummy_ImmSetConversionStatus( HIMC, DWORD, DWORD ) { return FALSE; }
  760.     static BOOL WINAPI Dummy_ImmSimulateHotKey( HWND, DWORD ) { return FALSE; }
  761.     static BOOL WINAPI Dummy_ImmIsIME( HKL ) { return FALSE; }
  762.     // Traditional Chinese IME
  763.     static UINT WINAPI Dummy_GetReadingString( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT ) { return 0; }
  764.     static BOOL WINAPI Dummy_ShowReadingWindow( HIMC, BOOL ) { return FALSE; }
  765.     // Verion library imports
  766.     static BOOL APIENTRY Dummy_VerQueryValueA( const LPVOID, LPSTR, LPVOID *, PUINT ) { return 0; }
  767.     static BOOL APIENTRY Dummy_GetFileVersionInfoA( LPSTR, DWORD, DWORD, LPVOID ) { return 0; }
  768.     static DWORD APIENTRY Dummy_GetFileVersionInfoSizeA( LPSTR, LPDWORD ) { return 0; }
  769.     // Function pointers: IMM32
  770.     static INPUTCONTEXT* (WINAPI * _ImmLockIMC)( HIMC );
  771.     static BOOL (WINAPI * _ImmUnlockIMC)( HIMC );
  772.     static LPVOID (WINAPI * _ImmLockIMCC)( HIMCC );
  773.     static BOOL (WINAPI * _ImmUnlockIMCC)( HIMCC );
  774.     static BOOL (WINAPI * _ImmDisableTextFrameService)( DWORD );
  775.     static LONG (WINAPI * _ImmGetCompositionStringW)( HIMC, DWORD, LPVOID, DWORD );
  776.     static DWORD (WINAPI * _ImmGetCandidateListW)( HIMC, DWORD, LPCANDIDATELIST, DWORD );
  777.     static HIMC (WINAPI * _ImmGetContext)( HWND );
  778.     static BOOL (WINAPI * _ImmReleaseContext)( HWND, HIMC );
  779.     static HIMC (WINAPI * _ImmAssociateContext)( HWND, HIMC );
  780.     static BOOL (WINAPI * _ImmGetOpenStatus)( HIMC );
  781.     static BOOL (WINAPI * _ImmSetOpenStatus)( HIMC, BOOL );
  782.     static BOOL (WINAPI * _ImmGetConversionStatus)( HIMC, LPDWORD, LPDWORD );
  783.     static HWND (WINAPI * _ImmGetDefaultIMEWnd)( HWND );
  784.     static UINT (WINAPI * _ImmGetIMEFileNameA)( HKL, LPSTR, UINT );
  785.     static UINT (WINAPI * _ImmGetVirtualKey)( HWND );
  786.     static BOOL (WINAPI * _ImmNotifyIME)( HIMC, DWORD, DWORD, DWORD );
  787.     static BOOL (WINAPI * _ImmSetConversionStatus)( HIMC, DWORD, DWORD );
  788.     static BOOL (WINAPI * _ImmSimulateHotKey)( HWND, DWORD );
  789.     static BOOL (WINAPI * _ImmIsIME)( HKL );
  790.     // Function pointers: Traditional Chinese IME
  791.     static UINT (WINAPI * _GetReadingString)( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT );
  792.     static BOOL (WINAPI * _ShowReadingWindow)( HIMC, BOOL );
  793.     // Function pointers: Verion library imports
  794.     static BOOL (APIENTRY * _VerQueryValueA)( const LPVOID, LPSTR, LPVOID *, PUINT );
  795.     static BOOL (APIENTRY * _GetFileVersionInfoA)( LPSTR, DWORD, DWORD, LPVOID );
  796.     static DWORD (APIENTRY * _GetFileVersionInfoSizeA)( LPSTR, LPDWORD );
  797. public:
  798.     CDXUTIMEEditBox( CDXUTDialog *pDialog = NULL );
  799.     virtual ~CDXUTIMEEditBox();
  800.     static void Initialize();
  801.     static void Uninitialize();
  802.     static  HRESULT StaticOnCreateDevice();
  803.     static  bool StaticMsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
  804.     static  void EnableImeSystem( bool bEnable );
  805.     virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  806.     virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
  807.     virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
  808.     virtual void UpdateRects();
  809.     virtual void OnFocusIn();
  810.     virtual void OnFocusOut();
  811.     void PumpMessage();
  812.     virtual void RenderCandidateReadingWindow( IDirect3DDevice9* pd3dDevice, float fElapsedTime, bool bReading );
  813.     virtual void RenderComposition( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  814.     virtual void RenderIndicator( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
  815. protected:
  816.     static WORD GetLanguage() { return LOWORD( s_hklCurrent ); }
  817.     static WORD GetPrimaryLanguage() { return PRIMARYLANGID( LOWORD( s_hklCurrent ) ); }
  818.     static WORD GetSubLanguage() { return SUBLANGID( LOWORD( s_hklCurrent ) ); }
  819.     static void SendKey( BYTE nVirtKey );
  820.     static DWORD GetImeId( UINT uIndex = 0 );
  821.     static void CheckInputLocale();
  822.     static void CheckToggleState();
  823.     static void SetupImeApi();
  824.     static void ResetCompositionString();
  825.     void TruncateCompString( bool bUseBackSpace = true, int iNewStrLen = 0 );
  826.     void FinalizeString( bool bSend );
  827.     static void GetReadingWindowOrientation( DWORD dwId );
  828.     static void GetPrivateReadingString();
  829.     void SendCompString();
  830. protected:
  831.     enum { INDICATOR_NON_IME, INDICATOR_CHS, INDICATOR_CHT, INDICATOR_KOREAN, INDICATOR_JAPANESE };
  832.     enum IMESTATE { IMEUI_STATE_OFF, IMEUI_STATE_ON, IMEUI_STATE_ENGLISH };
  833.     struct CCandList
  834.     {
  835.         WCHAR awszCandidate[MAX_CANDLIST][256];
  836.         CUniBuffer HoriCand; // Candidate list string (for horizontal candidate window)
  837.         int   nFirstSelected; // First character position of the selected string in HoriCand
  838.         int   nHoriSelectedLen; // Length of the selected string in HoriCand
  839.         DWORD dwCount;       // Number of valid entries in the candidate list
  840.         DWORD dwSelection;   // Currently selected candidate entry relative to page top
  841.         DWORD dwPageSize;
  842.         int   nReadingError; // Index of the error character
  843.         bool  bShowWindow;   // Whether the candidate list window is visible
  844.         RECT  rcCandidate;   // Candidate rectangle computed and filled each time before rendered
  845.     };
  846.     struct CInputLocale
  847.     {
  848.         HKL   m_hKL;            // Keyboard layout
  849.         WCHAR m_wszLangAbb[3];  // Language abbreviation
  850.         WCHAR m_wszLang[64];    // Localized language name
  851.     };
  852.     // Application-wide data
  853.     static HINSTANCE s_hDllImm32;         // IMM32 DLL handle
  854.     static HINSTANCE s_hDllVer;           // Version DLL handle
  855.     static HIMC      s_hImcDef;           // Default input context
  856.     static HKL     s_hklCurrent;          // Current keyboard layout of the process
  857.     static bool    s_bVerticalCand;       // Indicates that the candidates are listed vertically
  858.     static LPWSTR  s_wszCurrIndicator;    // Points to an indicator string that corresponds to current input locale
  859.     static WCHAR   s_aszIndicator[5][3];  // String to draw to indicate current input locale
  860.     static bool    s_bInsertOnType;       // Insert the character as soon as a key is pressed (Korean behavior)
  861.     static HINSTANCE s_hDllIme;           // Instance handle of the current IME module
  862.     static IMESTATE  s_ImeState;          // IME global state
  863.     static bool    s_bEnableImeSystem;    // Whether the IME system is active
  864.     static POINT   s_ptCompString;        // Composition string position. Updated every frame.
  865.     static int     s_nCompCaret;          // Caret position of the composition string
  866.     static int     s_nFirstTargetConv;    // Index of the first target converted char in comp string.  If none, -1.
  867.     static CUniBuffer s_CompString;       // Buffer to hold the composition string (we fix its length)
  868.     static BYTE    s_abCompStringAttr[MAX_COMPSTRING_SIZE];
  869.     static DWORD   s_adwCompStringClause[MAX_COMPSTRING_SIZE];
  870.     static WCHAR   s_wszReadingString[32];// Used only with horizontal reading window (why?)
  871.     static CCandList s_CandList;          // Data relevant to the candidate list
  872.     static bool    s_bShowReadingWindow;  // Indicates whether reading window is visible
  873.     static bool    s_bHorizontalReading;  // Indicates whether the reading window is vertical or horizontal
  874.     static bool    s_bChineseIME;
  875.     static CGrowableArray< CInputLocale > s_Locale; // Array of loaded keyboard layout on system
  876.     // Color of various IME elements
  877.     D3DCOLOR       m_ReadingColor;        // Reading string color
  878.     D3DCOLOR       m_ReadingWinColor;     // Reading window color
  879.     D3DCOLOR       m_ReadingSelColor;     // Selected character in reading string
  880.     D3DCOLOR       m_ReadingSelBkColor;   // Background color for selected char in reading str
  881.     D3DCOLOR       m_CandidateColor;      // Candidate string color
  882.     D3DCOLOR       m_CandidateWinColor;   // Candidate window color
  883.     D3DCOLOR       m_CandidateSelColor;   // Selected candidate string color
  884.     D3DCOLOR       m_CandidateSelBkColor; // Selected candidate background color
  885.     D3DCOLOR       m_CompColor;           // Composition string color
  886.     D3DCOLOR       m_CompWinColor;        // Composition string window color
  887.     D3DCOLOR       m_CompCaretColor;      // Composition string caret color
  888.     D3DCOLOR       m_CompTargetColor;     // Composition string target converted color
  889.     D3DCOLOR       m_CompTargetBkColor;   // Composition string target converted background
  890.     D3DCOLOR       m_CompTargetNonColor;  // Composition string target non-converted color
  891.     D3DCOLOR       m_CompTargetNonBkColor;// Composition string target non-converted background
  892.     D3DCOLOR       m_IndicatorImeColor;   // Indicator text color for IME
  893.     D3DCOLOR       m_IndicatorEngColor;   // Indicator text color for English
  894.     D3DCOLOR       m_IndicatorBkColor;    // Indicator text background color
  895.     // Edit-control-specific data
  896.     int            m_nIndicatorWidth;     // Width of the indicator symbol
  897.     RECT           m_rcIndicator;         // Rectangle for drawing the indicator button
  898. #if defined(DEBUG) || defined(_DEBUG)
  899.     static bool    m_bIMEStaticMsgProcCalled;
  900. #endif
  901. };
  902. #endif // DXUT_GUI_H