diff options
| author | Jason Maskell <[email protected]> | 2016-05-09 10:39:54 +0200 |
|---|---|---|
| committer | Jason Maskell <[email protected]> | 2016-05-09 10:39:54 +0200 |
| commit | 79b3462799c28af8ba586349bd671b1b56e72353 (patch) | |
| tree | 3b06e36c390254c0dc7f3733a0d32af213d87293 /sample/d3d11/common/DXUTgui.h | |
| download | waveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.tar.xz waveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.zip | |
Initial commit with PS4 and XBone stuff trimmed.
Diffstat (limited to 'sample/d3d11/common/DXUTgui.h')
| -rw-r--r-- | sample/d3d11/common/DXUTgui.h | 1383 |
1 files changed, 1383 insertions, 0 deletions
diff --git a/sample/d3d11/common/DXUTgui.h b/sample/d3d11/common/DXUTgui.h new file mode 100644 index 0000000..1b867ed --- /dev/null +++ b/sample/d3d11/common/DXUTgui.h @@ -0,0 +1,1383 @@ +//-------------------------------------------------------------------------------------- +// File: DXUTgui.h +// +// Copyright (c) Microsoft Corporation. All rights reserved. +//-------------------------------------------------------------------------------------- +#pragma once +#ifndef DXUT_GUI_H +#define DXUT_GUI_H + +#include <usp10.h> +#include <dimm.h> + + +//-------------------------------------------------------------------------------------- +// Defines and macros +//-------------------------------------------------------------------------------------- +#define EVENT_BUTTON_CLICKED 0x0101 +#define EVENT_COMBOBOX_SELECTION_CHANGED 0x0201 +#define EVENT_RADIOBUTTON_CHANGED 0x0301 +#define EVENT_CHECKBOX_CHANGED 0x0401 +#define EVENT_SLIDER_VALUE_CHANGED 0x0501 +#define EVENT_SLIDER_VALUE_CHANGED_UP 0x0502 + +#define EVENT_EDITBOX_STRING 0x0601 +// EVENT_EDITBOX_CHANGE is sent when the listbox content changes +// due to user input. +#define EVENT_EDITBOX_CHANGE 0x0602 +#define EVENT_LISTBOX_ITEM_DBLCLK 0x0701 +// EVENT_LISTBOX_SELECTION is fired off when the selection changes in +// a single selection list box. +#define EVENT_LISTBOX_SELECTION 0x0702 +#define EVENT_LISTBOX_SELECTION_END 0x0703 + + +//-------------------------------------------------------------------------------------- +// Forward declarations +//-------------------------------------------------------------------------------------- +class CDXUTDialogResourceManager; +class CDXUTControl; +class CDXUTButton; +class CDXUTStatic; +class CDXUTCheckBox; +class CDXUTRadioButton; +class CDXUTComboBox; +class CDXUTSlider; +class CDXUTEditBox; +class CDXUTListBox; +class CDXUTScrollBar; +class CDXUTElement; +struct DXUTElementHolder; +struct DXUTTextureNode; +struct DXUTFontNode; +typedef VOID ( CALLBACK*PCALLBACKDXUTGUIEVENT )( UINT nEvent, int nControlID, CDXUTControl* pControl, + void* pUserContext ); + + +//-------------------------------------------------------------------------------------- +// Enums for pre-defined control types +//-------------------------------------------------------------------------------------- +enum DXUT_CONTROL_TYPE +{ + DXUT_CONTROL_BUTTON, + DXUT_CONTROL_STATIC, + DXUT_CONTROL_CHECKBOX, + DXUT_CONTROL_RADIOBUTTON, + DXUT_CONTROL_COMBOBOX, + DXUT_CONTROL_SLIDER, + DXUT_CONTROL_EDITBOX, + DXUT_CONTROL_IMEEDITBOX, + DXUT_CONTROL_LISTBOX, + DXUT_CONTROL_SCROLLBAR, +}; + +enum DXUT_CONTROL_STATE +{ + DXUT_STATE_NORMAL = 0, + DXUT_STATE_DISABLED, + DXUT_STATE_HIDDEN, + DXUT_STATE_FOCUS, + DXUT_STATE_MOUSEOVER, + DXUT_STATE_PRESSED, +}; + +#define MAX_CONTROL_STATES 6 + +struct DXUTBlendColor +{ + void Init( D3DCOLOR defaultColor, D3DCOLOR disabledColor = D3DCOLOR_ARGB( 200, 128, 128, 128 ), + D3DCOLOR hiddenColor = 0 ); + void Blend( UINT iState, float fElapsedTime, float fRate = 0.7f ); + + D3DCOLOR States[ MAX_CONTROL_STATES ]; // Modulate colors for all possible control states + D3DXCOLOR Current; +}; + + +//----------------------------------------------------------------------------- +// Contains all the display tweakables for a sub-control +//----------------------------------------------------------------------------- +class CDXUTElement +{ +public: + void SetTexture( UINT iTexture, RECT* prcTexture, D3DCOLOR defaultTextureColor = D3DCOLOR_ARGB( 255, 255, 255, + 255 ) ); + void SetFont( UINT iFont, D3DCOLOR defaultFontColor = D3DCOLOR_ARGB( 255, 255, 255, + 255 ), DWORD dwTextFormat = DT_CENTER | + DT_VCENTER ); + + void Refresh(); + + UINT iTexture; // Index of the texture for this Element + UINT iFont; // Index of the font for this Element + DWORD dwTextFormat; // The format argument to DrawText + + RECT rcTexture; // Bounding rect of this element on the composite texture + + DXUTBlendColor TextureColor; + DXUTBlendColor FontColor; +}; + + +//----------------------------------------------------------------------------- +// All controls must be assigned to a dialog, which handles +// input and rendering for the controls. +//----------------------------------------------------------------------------- +class CDXUTDialog +{ + friend class CDXUTDialogResourceManager; + +public: + CDXUTDialog(); + ~CDXUTDialog(); + + // Need to call this now + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog = true ); + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR pszControlTextureFilename ); + void Init( CDXUTDialogResourceManager* pManager, bool bRegisterDialog, + LPCWSTR szControlTextureResourceName, HMODULE hControlTextureResourceModule ); + + // Windows message handler + bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + // Control creation + HRESULT AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, + CDXUTStatic** ppCreated=NULL ); + HRESULT AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey=0, + bool bIsDefault=false, CDXUTButton** ppCreated=NULL ); + 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 ); + 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 ); + HRESULT AddComboBox( int ID, int x, int y, int width, int height, UINT nHotKey=0, bool bIsDefault= + false, CDXUTComboBox** ppCreated=NULL ); + 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 ); + // AddIMEEditBox has been renamed into DXUTguiIME.cpp as CDXUTIMEEditBox::CreateIMEEditBox + HRESULT AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault= + false, CDXUTEditBox** ppCreated=NULL ); + HRESULT AddListBox( int ID, int x, int y, int width, int height, DWORD dwStyle=0, + CDXUTListBox** ppCreated=NULL ); + HRESULT AddControl( CDXUTControl* pControl ); + HRESULT InitControl( CDXUTControl* pControl ); + + // Control retrieval + CDXUTStatic* GetStatic( int ID ) + { + return ( CDXUTStatic* )GetControl( ID, DXUT_CONTROL_STATIC ); + } + CDXUTButton* GetButton( int ID ) + { + return ( CDXUTButton* )GetControl( ID, DXUT_CONTROL_BUTTON ); + } + CDXUTCheckBox* GetCheckBox( int ID ) + { + return ( CDXUTCheckBox* )GetControl( ID, DXUT_CONTROL_CHECKBOX ); + } + CDXUTRadioButton* GetRadioButton( int ID ) + { + return ( CDXUTRadioButton* )GetControl( ID, DXUT_CONTROL_RADIOBUTTON ); + } + CDXUTComboBox* GetComboBox( int ID ) + { + return ( CDXUTComboBox* )GetControl( ID, DXUT_CONTROL_COMBOBOX ); + } + CDXUTSlider* GetSlider( int ID ) + { + return ( CDXUTSlider* )GetControl( ID, DXUT_CONTROL_SLIDER ); + } + CDXUTEditBox* GetEditBox( int ID ) + { + return ( CDXUTEditBox* )GetControl( ID, DXUT_CONTROL_EDITBOX ); + } + CDXUTListBox* GetListBox( int ID ) + { + return ( CDXUTListBox* )GetControl( ID, DXUT_CONTROL_LISTBOX ); + } + + CDXUTControl* GetControl( int ID ); + CDXUTControl* GetControl( int ID, UINT nControlType ); + CDXUTControl* GetControlAtPoint( POINT pt ); + + bool GetControlEnabled( int ID ); + void SetControlEnabled( int ID, bool bEnabled ); + + void ClearRadioButtonGroup( UINT nGroup ); + void ClearComboBox( int ID ); + + // Access the default display Elements used when adding new controls + HRESULT SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement ); + CDXUTElement* GetDefaultElement( UINT nControlType, UINT iElement ); + + // Methods called by controls + void SendEvent( UINT nEvent, bool bTriggeredByUser, CDXUTControl* pControl ); + void RequestFocus( CDXUTControl* pControl ); + + // Render helpers + HRESULT DrawRect( RECT* pRect, D3DCOLOR color ); + HRESULT DrawRect9( RECT* pRect, D3DCOLOR color ); + HRESULT DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color ); + HRESULT DrawSprite( CDXUTElement* pElement, RECT* prcDest, float fDepth ); + HRESULT DrawSprite9( CDXUTElement* pElement, RECT* prcDest ); + HRESULT DrawSprite11( CDXUTElement* pElement, RECT* prcDest, float fDepth ); + HRESULT CalcTextRect( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, int nCount = -1 ); + HRESULT DrawText( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1, bool bCenter = false ); + HRESULT DrawText9( LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1 ); + HRESULT DrawText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, CDXUTElement* pElement, RECT* prcDest, bool bShadow = false, + int nCount = -1, bool bCenter = false ); + + // Attributes + bool GetVisible() + { + return m_bVisible; + } + void SetVisible( bool bVisible ) + { + m_bVisible = bVisible; + } + bool GetMinimized() + { + return m_bMinimized; + } + void SetMinimized( bool bMinimized ) + { + m_bMinimized = bMinimized; + } + void SetBackgroundColors( D3DCOLOR colorAllCorners ) + { + SetBackgroundColors( colorAllCorners, colorAllCorners, colorAllCorners, colorAllCorners ); + } + void SetBackgroundColors( D3DCOLOR colorTopLeft, D3DCOLOR colorTopRight, D3DCOLOR colorBottomLeft, + D3DCOLOR colorBottomRight ); + void EnableCaption( bool bEnable ) + { + m_bCaption = bEnable; + } + int GetCaptionHeight() const + { + return m_nCaptionHeight; + } + void SetCaptionHeight( int nHeight ) + { + m_nCaptionHeight = nHeight; + } + void SetCaptionText( const WCHAR* pwszText ) + { + wcscpy_s( m_wszCaption, sizeof( m_wszCaption ) / sizeof( m_wszCaption[0] ), pwszText ); + } + void GetLocation( POINT& Pt ) const + { + Pt.x = m_x; Pt.y = m_y; + } + void SetLocation( int x, int y ) + { + m_x = x; m_y = y; + } + void SetSize( int width, int height ) + { + m_width = width; m_height = height; + } + int GetWidth() + { + return m_width; + } + int GetHeight() + { + return m_height; + } + + static void WINAPI SetRefreshTime( float fTime ) + { + s_fTimeRefresh = fTime; + } + + static CDXUTControl* WINAPI GetNextControl( CDXUTControl* pControl ); + static CDXUTControl* WINAPI GetPrevControl( CDXUTControl* pControl ); + + void RemoveControl( int ID ); + void RemoveAllControls(); + + // Sets the callback used to notify the app of control events + void SetCallback( PCALLBACKDXUTGUIEVENT pCallback, void* pUserContext = NULL ); + void EnableNonUserEvents( bool bEnable ) + { + m_bNonUserEvents = bEnable; + } + void EnableKeyboardInput( bool bEnable ) + { + m_bKeyboardInput = bEnable; + } + void EnableMouseInput( bool bEnable ) + { + m_bMouseInput = bEnable; + } + bool IsKeyboardInputEnabled() const + { + return m_bKeyboardInput; + } + + // Device state notification + void Refresh(); + HRESULT OnRender( float fElapsedTime ); + + // Shared resource access. Indexed fonts and textures are shared among + // all the controls. + HRESULT SetFont( UINT index, LPCWSTR strFaceName, LONG height, LONG weight ); + DXUTFontNode* GetFont( UINT index ); + + HRESULT SetTexture( UINT index, LPCWSTR strFilename ); + HRESULT SetTexture( UINT index, LPCWSTR strResourceName, HMODULE hResourceModule ); + DXUTTextureNode* GetTexture( UINT index ); + + CDXUTDialogResourceManager* GetManager() + { + return m_pManager; + } + + static void WINAPI ClearFocus(); + void FocusDefaultControl(); + + bool m_bNonUserEvents; + bool m_bKeyboardInput; + bool m_bMouseInput; + +private: + int m_nDefaultControlID; + + HRESULT OnRender9( float fElapsedTime ); + HRESULT OnRender10( float fElapsedTime ); + HRESULT OnRender11( float fElapsedTime ); + + static double s_fTimeRefresh; + double m_fTimeLastRefresh; + + // Initialize default Elements + void InitDefaultElements(); + + // Windows message handlers + void OnMouseMove( POINT pt ); + void OnMouseUp( POINT pt ); + + void SetNextDialog( CDXUTDialog* pNextDialog ); + + // Control events + bool OnCycleFocus( bool bForward ); + + static CDXUTControl* s_pControlFocus; // The control which has focus + static CDXUTControl* s_pControlPressed; // The control currently pressed + + CDXUTControl* m_pControlMouseOver; // The control which is hovered over + + bool m_bVisible; + bool m_bCaption; + bool m_bMinimized; + bool m_bDrag; + WCHAR m_wszCaption[256]; + + int m_x; + int m_y; + int m_width; + int m_height; + int m_nCaptionHeight; + + D3DCOLOR m_colorTopLeft; + D3DCOLOR m_colorTopRight; + D3DCOLOR m_colorBottomLeft; + D3DCOLOR m_colorBottomRight; + + CDXUTDialogResourceManager* m_pManager; + PCALLBACKDXUTGUIEVENT m_pCallbackEvent; + void* m_pCallbackEventUserContext; + + CGrowableArray <int> m_Textures; // Index into m_TextureCache; + CGrowableArray <int> m_Fonts; // Index into m_FontCache; + + CGrowableArray <CDXUTControl*> m_Controls; + CGrowableArray <DXUTElementHolder*> m_DefaultElements; + + CDXUTElement m_CapElement; // Element for the caption + + CDXUTDialog* m_pNextDialog; + CDXUTDialog* m_pPrevDialog; +}; + + +//-------------------------------------------------------------------------------------- +// Structs for shared resources +//-------------------------------------------------------------------------------------- +struct DXUTTextureNode +{ + bool bFileSource; // True if this texture is loaded from a file. False if from resource. + HMODULE hResourceModule; + int nResourceID; // Resource ID. If 0, string-based ID is used and stored in strFilename. + WCHAR strFilename[MAX_PATH]; + DWORD dwWidth; + DWORD dwHeight; + IDirect3DTexture9* pTexture9; + ID3D11Texture2D* pTexture11; + ID3D11ShaderResourceView* pTexResView11; +}; + +struct DXUTFontNode +{ + WCHAR strFace[MAX_PATH]; + LONG nHeight; + LONG nWeight; + ID3DXFont* pFont9; +}; + +struct DXUTSpriteVertex +{ + D3DXVECTOR3 vPos; + D3DXCOLOR vColor; + D3DXVECTOR2 vTex; +}; + +//----------------------------------------------------------------------------- +// Manages shared resources of dialogs +//----------------------------------------------------------------------------- +class CDXUTDialogResourceManager +{ +public: + CDXUTDialogResourceManager(); + ~CDXUTDialogResourceManager(); + + bool MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + // D3D9 specific + HRESULT OnD3D9CreateDevice( LPDIRECT3DDEVICE9 pd3dDevice ); + HRESULT OnD3D9ResetDevice(); + void OnD3D9LostDevice(); + void OnD3D9DestroyDevice(); + IDirect3DDevice9* GetD3D9Device() + { + return m_pd3d9Device; + } + + // D3D11 specific + HRESULT OnD3D11CreateDevice( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ); + HRESULT OnD3D11ResizedSwapChain( ID3D11Device* pd3dDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc ); + void OnD3D11ReleasingSwapChain(); + void OnD3D11DestroyDevice(); + void StoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ); + void RestoreD3D11State( ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUI11( ID3D11DeviceContext* pd3dImmediateContext ); + void ApplyRenderUIUntex11( ID3D11DeviceContext* pd3dImmediateContext ); + void BeginSprites11( ); + void EndSprites11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3dImmediateContext ); + ID3D11Device* GetD3D11Device() + { + return m_pd3d11Device; + } + ID3D11DeviceContext* GetD3D11DeviceContext() + { + return m_pd3d11DeviceContext; + } + + DXUTFontNode* GetFontNode( int iIndex ) + { + return m_FontCache.GetAt( iIndex ); + }; + DXUTTextureNode* GetTextureNode( int iIndex ) + { + return m_TextureCache.GetAt( iIndex ); + }; + + int AddFont( LPCWSTR strFaceName, LONG height, LONG weight ); + int AddTexture( LPCWSTR strFilename ); + int AddTexture( LPCWSTR strResourceName, HMODULE hResourceModule ); + + bool RegisterDialog( CDXUTDialog* pDialog ); + void UnregisterDialog( CDXUTDialog* pDialog ); + void EnableKeyboardInputForAllDialogs(); + + // Shared between all dialogs + + // D3D9 + IDirect3DStateBlock9* m_pStateBlock; + ID3DXSprite* m_pSprite; // Sprite used for drawing + + // D3D11 + // Shaders + ID3D11VertexShader* m_pVSRenderUI11; + ID3D11PixelShader* m_pPSRenderUI11; + ID3D11PixelShader* m_pPSRenderUIUntex11; + + // States + ID3D11DepthStencilState* m_pDepthStencilStateUI11; + ID3D11RasterizerState* m_pRasterizerStateUI11; + ID3D11BlendState* m_pBlendStateUI11; + ID3D11SamplerState* m_pSamplerStateUI11; + + // Stored states + ID3D11DepthStencilState* m_pDepthStencilStateStored11; + UINT m_StencilRefStored11; + ID3D11RasterizerState* m_pRasterizerStateStored11; + ID3D11BlendState* m_pBlendStateStored11; + float m_BlendFactorStored11[4]; + UINT m_SampleMaskStored11; + ID3D11SamplerState* m_pSamplerStateStored11; + + ID3D11InputLayout* m_pInputLayout11; + ID3D11Buffer* m_pVBScreenQuad11; + + // Sprite workaround + ID3D11Buffer* m_pSpriteBuffer11; + UINT m_SpriteBufferBytes11; + CGrowableArray<DXUTSpriteVertex> m_SpriteVertices; + + UINT m_nBackBufferWidth; + UINT m_nBackBufferHeight; + + CGrowableArray <CDXUTDialog*> m_Dialogs; // Dialogs registered + +protected: + // D3D9 specific + IDirect3DDevice9* m_pd3d9Device; + HRESULT CreateFont9( UINT index ); + HRESULT CreateTexture9( UINT index ); + + // D3D11 specific + ID3D11Device* m_pd3d11Device; + ID3D11DeviceContext* m_pd3d11DeviceContext; + HRESULT CreateFont11( UINT index ); + HRESULT CreateTexture11( UINT index ); + + CGrowableArray <DXUTTextureNode*> m_TextureCache; // Shared textures + CGrowableArray <DXUTFontNode*> m_FontCache; // Shared fonts +}; + +void BeginText11(); +void DrawText11DXUT( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext, + LPCWSTR strText, RECT rcScreen, D3DXCOLOR vFontColor, + float fBBWidth, float fBBHeight, bool bCenter ); +void EndText11( ID3D11Device* pd3dDevice, ID3D11DeviceContext* pd3d11DeviceContext ); + +//----------------------------------------------------------------------------- +// Base class for controls +//----------------------------------------------------------------------------- +class CDXUTControl +{ +public: + CDXUTControl( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTControl(); + + virtual HRESULT OnInit() + { + return S_OK; + } + virtual void Refresh(); + virtual void Render( float fElapsedTime ) + { + }; + + // Windows message handler + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) + { + return false; + } + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) + { + return false; + } + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ) + { + return false; + } + + virtual bool CanHaveFocus() + { + return false; + } + virtual void OnFocusIn() + { + m_bHasFocus = true; + } + virtual void OnFocusOut() + { + m_bHasFocus = false; + } + virtual void OnMouseEnter() + { + m_bMouseOver = true; + } + virtual void OnMouseLeave() + { + m_bMouseOver = false; + } + virtual void OnHotkey() + { + } + + virtual BOOL ContainsPoint( POINT pt ) + { + return PtInRect( &m_rcBoundingBox, pt ); + } + + virtual void SetEnabled( bool bEnabled ) + { + m_bEnabled = bEnabled; + } + virtual bool GetEnabled() + { + return m_bEnabled; + } + virtual void SetVisible( bool bVisible ) + { + m_bVisible = bVisible; + } + virtual bool GetVisible() + { + return m_bVisible; + } + + UINT GetType() const + { + return m_Type; + } + + int GetID() const + { + return m_ID; + } + void SetID( int ID ) + { + m_ID = ID; + } + + void SetLocation( int x, int y ) + { + m_x = x; m_y = y; UpdateRects(); + } + void SetSize( int width, int height ) + { + m_width = width; m_height = height; UpdateRects(); + } + + void SetHotkey( UINT nHotkey ) + { + m_nHotkey = nHotkey; + } + UINT GetHotkey() + { + return m_nHotkey; + } + + void SetUserData( void* pUserData ) + { + m_pUserData = pUserData; + } + void* GetUserData() const + { + return m_pUserData; + } + + virtual void SetTextColor( D3DCOLOR Color ); + CDXUTElement* GetElement( UINT iElement ) + { + return m_Elements.GetAt( iElement ); + } + HRESULT SetElement( UINT iElement, CDXUTElement* pElement ); + + bool m_bVisible; // Shown/hidden flag + bool m_bMouseOver; // Mouse pointer is above control + bool m_bHasFocus; // Control has input focus + bool m_bIsDefault; // Is the default control + + // Size, scale, and positioning members + int m_x, m_y; + int m_width, m_height; + + // These members are set by the container + CDXUTDialog* m_pDialog; // Parent container + UINT m_Index; // Index within the control list + + CGrowableArray <CDXUTElement*> m_Elements; // All display elements + +protected: + virtual void UpdateRects(); + + int m_ID; // ID number + DXUT_CONTROL_TYPE m_Type; // Control type, set once in constructor + UINT m_nHotkey; // Virtual key code for this control's hotkey + void* m_pUserData; // Data associated with this control that is set by user. + + bool m_bEnabled; // Enabled/disabled flag + + RECT m_rcBoundingBox; // Rectangle defining the active region of the control +}; + + +//----------------------------------------------------------------------------- +// Contains all the display information for a given control type +//----------------------------------------------------------------------------- +struct DXUTElementHolder +{ + UINT nControlType; + UINT iElement; + + CDXUTElement Element; +}; + + +//----------------------------------------------------------------------------- +// Static control +//----------------------------------------------------------------------------- +class CDXUTStatic : public CDXUTControl +{ +public: + CDXUTStatic( CDXUTDialog* pDialog = NULL ); + + virtual void Render( float fElapsedTime ); + virtual BOOL ContainsPoint( POINT pt ) + { + return false; + } + + HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ); + LPCWSTR GetText() + { + return m_strText; + } + HRESULT SetText( LPCWSTR strText ); + + +protected: + WCHAR m_strText[MAX_PATH]; // Window text +}; + + +//----------------------------------------------------------------------------- +// Button control +//----------------------------------------------------------------------------- +class CDXUTButton : public CDXUTStatic +{ +public: + CDXUTButton( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this ); + } + + virtual BOOL ContainsPoint( POINT pt ) + { + return PtInRect( &m_rcBoundingBox, pt ); + } + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + + virtual void Render( float fElapsedTime ); + +protected: + bool m_bPressed; +}; + + +//----------------------------------------------------------------------------- +// CheckBox control +//----------------------------------------------------------------------------- +class CDXUTCheckBox : public CDXUTButton +{ +public: + CDXUTCheckBox( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( !m_bChecked, true ); + } + + virtual BOOL ContainsPoint( POINT pt ); + virtual void UpdateRects(); + + virtual void Render( float fElapsedTime ); + + bool GetChecked() + { + return m_bChecked; + } + void SetChecked( bool bChecked ) + { + SetCheckedInternal( bChecked, false ); + } + +protected: + virtual void SetCheckedInternal( bool bChecked, bool bFromInput ); + + bool m_bChecked; + RECT m_rcButton; + RECT m_rcText; +}; + + +//----------------------------------------------------------------------------- +// RadioButton control +//----------------------------------------------------------------------------- +class CDXUTRadioButton : public CDXUTCheckBox +{ +public: + CDXUTRadioButton( CDXUTDialog* pDialog = NULL ); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey() + { + if( m_pDialog->IsKeyboardInputEnabled() ) m_pDialog->RequestFocus( this ); + SetCheckedInternal( true, true, true ); + } + + void SetChecked( bool bChecked, bool bClearGroup=true ) + { + SetCheckedInternal( bChecked, bClearGroup, false ); + } + void SetButtonGroup( UINT nButtonGroup ) + { + m_nButtonGroup = nButtonGroup; + } + UINT GetButtonGroup() + { + return m_nButtonGroup; + } + +protected: + virtual void SetCheckedInternal( bool bChecked, bool bClearGroup, bool bFromInput ); + UINT m_nButtonGroup; +}; + + +//----------------------------------------------------------------------------- +// Scrollbar control +//----------------------------------------------------------------------------- +class CDXUTScrollBar : public CDXUTControl +{ +public: + CDXUTScrollBar( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTScrollBar(); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + + virtual void Render( float fElapsedTime ); + virtual void UpdateRects(); + + void SetTrackRange( int nStart, int nEnd ); + int GetTrackPos() + { + return m_nPosition; + } + void SetTrackPos( int nPosition ) + { + m_nPosition = nPosition; Cap(); UpdateThumbRect(); + } + int GetPageSize() + { + return m_nPageSize; + } + void SetPageSize( int nPageSize ) + { + m_nPageSize = nPageSize; Cap(); UpdateThumbRect(); + } + + void Scroll( int nDelta ); // Scroll by nDelta items (plus or minus) + void ShowItem( int nIndex ); // Ensure that item nIndex is displayed, scroll if necessary + +protected: + // ARROWSTATE indicates the state of the arrow buttons. + // CLEAR No arrow is down. + // CLICKED_UP Up arrow is clicked. + // CLICKED_DOWN Down arrow is clicked. + // HELD_UP Up arrow is held down for sustained period. + // HELD_DOWN Down arrow is held down for sustained period. + enum ARROWSTATE + { + CLEAR, + CLICKED_UP, + CLICKED_DOWN, + HELD_UP, + HELD_DOWN + }; + + void UpdateThumbRect(); + void Cap(); // Clips position at boundaries. Ensures it stays within legal range. + + bool m_bShowThumb; + bool m_bDrag; + RECT m_rcUpButton; + RECT m_rcDownButton; + RECT m_rcTrack; + RECT m_rcThumb; + int m_nPosition; // Position of the first displayed item + int m_nPageSize; // How many items are displayable in one page + int m_nStart; // First item + int m_nEnd; // The index after the last item + POINT m_LastMouse;// Last mouse position + ARROWSTATE m_Arrow; // State of the arrows + double m_dArrowTS; // Timestamp of last arrow event. +}; + + +//----------------------------------------------------------------------------- +// ListBox control +//----------------------------------------------------------------------------- +struct DXUTListBoxItem +{ + WCHAR strText[256]; + void* pData; + + RECT rcActive; + bool bSelected; +}; + +class CDXUTListBox : public CDXUTControl +{ +public: + CDXUTListBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTListBox(); + + virtual HRESULT OnInit() + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + + virtual void Render( float fElapsedTime ); + virtual void UpdateRects(); + + DWORD GetStyle() const + { + return m_dwStyle; + } + int GetSize() const + { + return m_Items.GetSize(); + } + void SetStyle( DWORD dwStyle ) + { + m_dwStyle = dwStyle; + } + int GetScrollBarWidth() const + { + return m_nSBWidth; + } + void SetScrollBarWidth( int nWidth ) + { + m_nSBWidth = nWidth; UpdateRects(); + } + void SetBorder( int nBorder, int nMargin ) + { + m_nBorder = nBorder; m_nMargin = nMargin; + } + HRESULT AddItem( const WCHAR* wszText, void* pData ); + HRESULT InsertItem( int nIndex, const WCHAR* wszText, void* pData ); + void RemoveItem( int nIndex ); + void RemoveAllItems(); + + DXUTListBoxItem* GetItem( int nIndex ); + int GetSelectedIndex( int nPreviousSelected = -1 ); + DXUTListBoxItem* GetSelectedItem( int nPreviousSelected = -1 ) + { + return GetItem( GetSelectedIndex( nPreviousSelected ) ); + } + void SelectItem( int nNewIndex ); + + enum STYLE + { + MULTISELECTION = 1 + }; + +protected: + RECT m_rcText; // Text rendering bound + RECT m_rcSelection; // Selection box bound + CDXUTScrollBar m_ScrollBar; + int m_nSBWidth; + int m_nBorder; + int m_nMargin; + int m_nTextHeight; // Height of a single line of text + DWORD m_dwStyle; // List box style + int m_nSelected; // Index of the selected item for single selection list box + int m_nSelStart; // Index of the item where selection starts (for handling multi-selection) + bool m_bDrag; // Whether the user is dragging the mouse to select + + CGrowableArray <DXUTListBoxItem*> m_Items; +}; + + +//----------------------------------------------------------------------------- +// ComboBox control +//----------------------------------------------------------------------------- +struct DXUTComboBoxItem +{ + WCHAR strText[256]; + void* pData; + + RECT rcActive; + bool bVisible; +}; + + +class CDXUTComboBox : public CDXUTButton +{ +public: + CDXUTComboBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTComboBox(); + + virtual void SetTextColor( D3DCOLOR Color ); + virtual HRESULT OnInit() + { + return m_pDialog->InitControl( &m_ScrollBar ); + } + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual void OnHotkey(); + + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual void OnFocusOut(); + virtual void Render( float fElapsedTime ); + + virtual void UpdateRects(); + + HRESULT AddItem( const WCHAR* strText, void* pData ); + void RemoveAllItems(); + void RemoveItem( UINT index ); + bool ContainsItem( const WCHAR* strText, UINT iStart=0 ); + int FindItem( const WCHAR* strText, UINT iStart=0 ); + void* GetItemData( const WCHAR* strText ); + void* GetItemData( int nIndex ); + void SetDropHeight( UINT nHeight ) + { + m_nDropHeight = nHeight; UpdateRects(); + } + int GetScrollBarWidth() const + { + return m_nSBWidth; + } + void SetScrollBarWidth( int nWidth ) + { + m_nSBWidth = nWidth; UpdateRects(); + } + + int GetSelectedIndex() const + { + return m_iSelected; + } + void* GetSelectedData(); + DXUTComboBoxItem* GetSelectedItem(); + + UINT GetNumItems() + { + return m_Items.GetSize(); + } + DXUTComboBoxItem* GetItem( UINT index ) + { + return m_Items.GetAt( index ); + } + + HRESULT SetSelectedByIndex( UINT index ); + HRESULT SetSelectedByText( const WCHAR* strText ); + HRESULT SetSelectedByData( void* pData ); + +protected: + int m_iSelected; + int m_iFocused; + int m_nDropHeight; + CDXUTScrollBar m_ScrollBar; + int m_nSBWidth; + + bool m_bOpened; + + RECT m_rcText; + RECT m_rcButton; + RECT m_rcDropdown; + RECT m_rcDropdownText; + + + CGrowableArray <DXUTComboBoxItem*> m_Items; +}; + + +//----------------------------------------------------------------------------- +// Slider control +//----------------------------------------------------------------------------- +class CDXUTSlider : public CDXUTControl +{ +public: + CDXUTSlider( CDXUTDialog* pDialog = NULL ); + + virtual BOOL ContainsPoint( POINT pt ); + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + + virtual void UpdateRects(); + + virtual void Render( float fElapsedTime ); + + void SetValue( int nValue ) + { + SetValueInternal( nValue, false ); + } + int GetValue() const + { + return m_nValue; + }; + + void GetRange( int& nMin, int& nMax ) const + { + nMin = m_nMin; nMax = m_nMax; + } + void SetRange( int nMin, int nMax ); + +protected: + void SetValueInternal( int nValue, bool bFromInput ); + int ValueFromPos( int x ); + + int m_nValue; + + int m_nMin; + int m_nMax; + + int m_nDragX; // Mouse position at start of drag + int m_nDragOffset; // Drag offset from the center of the button + int m_nButtonX; + + bool m_bPressed; + RECT m_rcButton; +}; + + +//----------------------------------------------------------------------------- +// CUniBuffer class for the edit control +//----------------------------------------------------------------------------- +class CUniBuffer +{ +public: + CUniBuffer( int nInitialSize = 1 ); + ~CUniBuffer(); + + static void WINAPI Initialize(); + static void WINAPI Uninitialize(); + + int GetBufferSize() + { + return m_nBufferSize; + } + bool SetBufferSize( int nSize ); + int GetTextSize() + { + return lstrlenW( m_pwszBuffer ); + } + const WCHAR* GetBuffer() + { + return m_pwszBuffer; + } + const WCHAR& operator[]( int n ) const + { + return m_pwszBuffer[n]; + } + WCHAR& operator[]( int n ); + DXUTFontNode* GetFontNode() + { + return m_pFontNode; + } + void SetFontNode( DXUTFontNode* pFontNode ) + { + m_pFontNode = pFontNode; + } + void Clear(); + + bool InsertChar( int nIndex, WCHAR wChar ); // Inserts the char at specified index. If nIndex == -1, insert to the end. + bool RemoveChar( int nIndex ); // Removes the char at specified index. If nIndex == -1, remove the last char. + 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. + bool SetText( LPCWSTR wszText ); + + // Uniscribe + HRESULT CPtoX( int nCP, BOOL bTrail, int* pX ); + HRESULT XtoCP( int nX, int* pCP, int* pnTrail ); + void GetPriorItemPos( int nCP, int* pPrior ); + void GetNextItemPos( int nCP, int* pPrior ); + +private: + HRESULT Analyse(); // Uniscribe -- Analyse() analyses the string in the buffer + + WCHAR* m_pwszBuffer; // Buffer to hold text + int m_nBufferSize; // Size of the buffer allocated, in characters + + // Uniscribe-specific + DXUTFontNode* m_pFontNode; // Font node for the font that this buffer uses + bool m_bAnalyseRequired; // True if the string has changed since last analysis. + SCRIPT_STRING_ANALYSIS m_Analysis; // Analysis for the current string + +private: + // Empty implementation of the Uniscribe API + static HRESULT WINAPI Dummy_ScriptApplyDigitSubstitution( const SCRIPT_DIGITSUBSTITUTE*, SCRIPT_CONTROL*, + SCRIPT_STATE* ) + { + return E_NOTIMPL; + } + 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; + } + static HRESULT WINAPI Dummy_ScriptStringCPtoX( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringXtoCP( SCRIPT_STRING_ANALYSIS, int, int*, int* ) + { + return E_NOTIMPL; + } + static HRESULT WINAPI Dummy_ScriptStringFree( SCRIPT_STRING_ANALYSIS* ) + { + return E_NOTIMPL; + } + static const SCRIPT_LOGATTR* WINAPI Dummy_ScriptString_pLogAttr( SCRIPT_STRING_ANALYSIS ) + { + return NULL; + } + static const int* WINAPI Dummy_ScriptString_pcOutChars( SCRIPT_STRING_ANALYSIS ) + { + return NULL; + } + + // Function pointers + static HRESULT( WINAPI* _ScriptApplyDigitSubstitution )( const SCRIPT_DIGITSUBSTITUTE*, + SCRIPT_CONTROL*, SCRIPT_STATE* ); + 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* ); + static HRESULT( WINAPI* _ScriptStringCPtoX )( SCRIPT_STRING_ANALYSIS, int, BOOL, int* ); + static HRESULT( WINAPI* _ScriptStringXtoCP )( SCRIPT_STRING_ANALYSIS, int, int*, int* ); + static HRESULT( WINAPI* _ScriptStringFree )( SCRIPT_STRING_ANALYSIS* ); + static const SCRIPT_LOGATTR* ( WINAPI*_ScriptString_pLogAttr )( SCRIPT_STRING_ANALYSIS ); + static const int* ( WINAPI*_ScriptString_pcOutChars )( SCRIPT_STRING_ANALYSIS ); + + static HINSTANCE s_hDll; // Uniscribe DLL handle + +}; + +//----------------------------------------------------------------------------- +// EditBox control +//----------------------------------------------------------------------------- +class CDXUTEditBox : public CDXUTControl +{ +public: + CDXUTEditBox( CDXUTDialog* pDialog = NULL ); + virtual ~CDXUTEditBox(); + + virtual bool HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam ); + virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam ); + virtual void UpdateRects(); + virtual bool CanHaveFocus() + { + return ( m_bVisible && m_bEnabled ); + } + virtual void Render( float fElapsedTime ); + virtual void OnFocusIn(); + + void SetText( LPCWSTR wszText, bool bSelected = false ); + LPCWSTR GetText() + { + return m_Buffer.GetBuffer(); + } + int GetTextLength() + { + return m_Buffer.GetTextSize(); + } // Returns text length in chars excluding NULL. + HRESULT GetTextCopy( __out_ecount(bufferCount) LPWSTR strDest, + UINT bufferCount ); + void ClearText(); + virtual void SetTextColor( D3DCOLOR Color ) + { + m_TextColor = Color; + } // Text color + void SetSelectedTextColor( D3DCOLOR Color ) + { + m_SelTextColor = Color; + } // Selected text color + void SetSelectedBackColor( D3DCOLOR Color ) + { + m_SelBkColor = Color; + } // Selected background color + void SetCaretColor( D3DCOLOR Color ) + { + m_CaretColor = Color; + } // Caret color + void SetBorderWidth( int nBorder ) + { + m_nBorder = nBorder; UpdateRects(); + } // Border of the window + void SetSpacing( int nSpacing ) + { + m_nSpacing = nSpacing; UpdateRects(); + } + void ParseFloatArray( float* pNumbers, int nCount ); + void SetTextFloatArray( const float* pNumbers, int nCount ); + +protected: + void PlaceCaret( int nCP ); + void DeleteSelectionText(); + void ResetCaretBlink(); + void CopyToClipboard(); + void PasteFromClipboard(); + + CUniBuffer m_Buffer; // Buffer to hold text + int m_nBorder; // Border of the window + int m_nSpacing; // Spacing between the text and the edge of border + RECT m_rcText; // Bounding rectangle for the text + RECT m_rcRender[9]; // Convenient rectangles for rendering elements + double m_dfBlink; // Caret blink time in milliseconds + double m_dfLastBlink; // Last timestamp of caret blink + bool m_bCaretOn; // Flag to indicate whether caret is currently visible + int m_nCaret; // Caret position, in characters + bool m_bInsertMode; // If true, control is in insert mode. Else, overwrite mode. + int m_nSelStart; // Starting position of the selection. The caret marks the end. + int m_nFirstVisible;// First visible character in the edit control + D3DCOLOR m_TextColor; // Text color + D3DCOLOR m_SelTextColor; // Selected text color + D3DCOLOR m_SelBkColor; // Selected background color + D3DCOLOR m_CaretColor; // Caret color + + // Mouse-specific + bool m_bMouseDrag; // True to indicate drag in progress + + // Static + static bool s_bHideCaret; // If true, we don't render the caret. +}; + + + + +#endif // DXUT_GUI_H |