梁志斌的专栏

游戏开发 DirectX技术

 
首页>>
关于作者

作  者:梁  志  斌

QQ   :3055720

QQ群:14739153

友情链接
搜索日志
访问计数
最新评论

微软的DirectSDK文档(DxGUI)头文件 [2005-8-6]
happy201 发表在 游戏开发源代码
//--------------------------------------------------------------------------------------
// file: DXUTgui.h
//
// Desc:
//
// 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_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


//--------------------------------------------------------------------------------------
// Forward declarations
//--------------------------------------------------------------------------------------
class CDXUTControl;
class CDXUTButton;
class CDXUTStatic;
class CDXUTCheckBox;
class CDXUTRadioButton;
class CDXUTComboBox;
class CDXUTSlider;
class CDXUTEditBox;
class CDXUTIMEEditBox;
class CDXUTListBox;
class CDXUTScrollBar;
class CDXUTElement;
struct DXUTElementHolder;
struct DXUTTextureNode;
struct DXUTFontNode;
typedef VOID (CALLBACK *PCALLBACKDXUTGUIEVENT) ( UINT nEvent, int nControlID, CDXUTControl* pControl );


//--------------------------------------------------------------------------------------
// 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
{
public:
CDXUTDialog();
~CDXUTDialog();

// 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 );
HRESULT AddEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTEditBox** ppCreated=NULL );
HRESULT AddIMEEditBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault=false, CDXUTIMEEditBox** 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 ); }
CDXUTIMEEditBox* GetIMEEditBox( int ID ) { return (CDXUTIMEEditBox*) GetControl( ID, DXUT_CONTROL_IMEEDITBOX ); }
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 DrawPolyLine( POINT* apPoints, UINT nNumPoints, D3DCOLOR color );
HRESULT DrawSprite( CDXUTElement* pElement, RECT* prcDest );
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 );

// 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 ) { StringCchCopy( 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; }

void SetNextDialog( CDXUTDialog* pNextDialog );

static void SetRefreshTime( float fTime ){ s_fTimeRefresh = fTime; }

static CDXUTControl* GetNextControl( CDXUTControl* pControl );
static CDXUTControl* GetPrevControl( CDXUTControl* pControl );

void RemoveControl( int ID );
void RemoveAllControls();

// Sets the callback used to notify the app of control events
void SetCallback( PCALLBACKDXUTGUIEVENT pCallback ) { m_pCallbackEvent = pCallback; }
void EnableNonUserEvents( bool bEnable ) { m_bNonUserEvents = bEnable; }
void EnableKeyboardInput( bool bEnable ) { m_bKeyboardInput = bEnable; }
void EnableMouseInput( bool bEnable ) { m_bMouseInput = bEnable; }

// 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 );
DXUTTextureNode* GetTexture( UINT index );

static void ClearFocus();
void FocusDefaultControl();

bool m_bNonUserEvents;
bool m_bKeyboardInput;
bool m_bMouseInput;

private:
int m_nDefaultControlID;

static double s_fTimeRefresh;
double m_fTimeLastRefresh;

// Initialize default Elements
void InitDefaultElements();

// Windows message handlers
void onMouseMove( POINT pt );
void onMouseUp( POINT pt );

// 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;
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;

PCALLBACKDXUTGUIEVENT m_pCallbackEvent;

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
{
WCHAR strFilename[MAX_PATH];
IDirect3DTexture9* pTexture;
DWORD dwWidth;
DWORD dwHeight;
};

struct DXUTFontNode
{
WCHAR strFace[MAX_PATH];
ID3DXFont* pFont;
LONG nHeight;
LONG nWeight;
};


//-----------------------------------------------------------------------------
// Manages shared resources of dialogs
// Use DXUTGetGlobalDialogResourceManager() to get access to the global instance
//-----------------------------------------------------------------------------
class CDXUTDialogResourceManager
{
public:
int AddFont( LPCWSTR strFaceName, LONG height, LONG weight );
int AddTexture( LPCWSTR strFilename );

DXUTFontNode* GetFontNode( int iIndex ) { return m_FontCache.GetAt( iIndex ); };
DXUTTextureNode* GetTextureNode( int iIndex ) { return m_TextureCache.GetAt( iIndex ); };
IDirect3DDevice9* GetD3DDevice() { return m_pd3dDevice; }

// Shared between all dialogs
IDirect3DStateBlock9* m_pStateBlock;
ID3DXSprite* m_pSprite; // Sprite used for drawing

~CDXUTDialogResourceManager();

// Automation helpers
void SetAutomation( bool b ) { m_bAutomation = b; }
bool GetAutomation() const { return m_bAutomation; }

protected:
friend CDXUTDialogResourceManager* DXUTGetGlobalDialogResourceManager();
friend HRESULT DXUTInitialize3DEnvironment();
friend HRESULT DXUTReset3DEnvironment();
friend void DXUTCleanup3DEnvironment( bool bReleaseSettings );

// Use DXUTGetGlobalDialogResourceManager() to get access to the global instance
CDXUTDialogResourceManager();

// The sample framework uses the global instance and automatically calls the device events
HRESULT OnCreateDevice( LPDIRECT3DDEVICE9 pd3dDevice );
HRESULT OnResetDevice();
void OnLostDevice();
void OnDestroyDevice();

CGrowableArray< DXUTTextureNode* > m_TextureCache; // Shared textures
CGrowableArray< DXUTFontNode* > m_FontCache; // Shared fonts

IDirect3DDevice9* m_pd3dDevice;

// Resource creation helpers
HRESULT CreateFont( UINT index );
HRESULT CreateTexture( UINT index );

// Automation helper
bool m_bAutomation;
};

CDXUTDialogResourceManager* DXUTGetGlobalDialogResourceManager();


//-----------------------------------------------------------------------------
// 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( IDirect3DDevice9* pd3dDevice, 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( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
virtual BOOL ContainsPoint( POINT pt ) { return false; }

HRESULT GetTextCopy( 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() { 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( IDirect3DDevice9* pd3dDevice, 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() { m_pDialog->RequestFocus( this ); SetCheckedInternal( !m_bChecked, true ); }

virtual BOOL ContainsPoint( POINT pt );
virtual void UpdateRects();

virtual void Render( IDirect3DDevice9* pd3dDevice, 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() { 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 void Render( IDirect3DDevice9* pd3dDevice, 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;
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 void Render( IDirect3DDevice9* pd3dDevice, 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; }
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 RemoveItemByText( WCHAR *wszText );
void RemoveItemByData( void *pData );
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( IDirect3DDevice9* pd3dDevice, 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(); }
void SetScrollBarWidth( int nWidth ) { m_nSBWidth = nWidth; UpdateRects(); }

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( IDirect3DDevice9* pd3dDevice, 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;
};


//-----------------------------------------------------------------------------
// EditBox control
//-----------------------------------------------------------------------------
#define UNISCRIBE_DLLNAME L"\\usp10.dll"

#define GETPROCADDRESS( Module, APIName, Temp ) \
Temp = GetProcAddress( Module, #APIName ); \
if( Temp ) \
*(FARPROC*)&_##APIName = Temp

#define PLACEHOLDERPROC( APIName ) \
_##APIName = Dummy_##APIName

class CDXUTEditBox : public CDXUTControl
{
friend class CExternalApiInitializer;

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( IDirect3DDevice9* pd3dDevice, 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( 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 );

public:
//-----------------------------------------------------------------------------
// CUniBuffer class for the edit control
//-----------------------------------------------------------------------------
class CUniBuffer
{
friend class CExternalApiInitializer;

// static member

// 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 void InitializeUniscribe();
static void UninitializeUniscribe();

static HINSTANCE s_hDll; // Uniscribe DLL handle

// Instance data
private:
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:
bool Grow( int nNewSize = -1 );

// Uniscribe -- Analyse() analyses the string in the buffer
HRESULT Analyse();

public:
CUniBuffer( int nInitialSize = 1 );
~CUniBuffer();
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();

// Inserts the char at specified index.
// If nIndex == -1, insert to the end.
bool InsertChar( int nIndex, WCHAR wChar );

// Removes the char at specified index.
// If nIndex == -1, remove the last char.
bool RemoveChar( int nIndex );

// 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 InsertString( int nIndex, const WCHAR *pStr, int nCount = -1 );

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 );
};

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.
};


//-----------------------------------------------------------------------------
// IME-enabled EditBox control
//-----------------------------------------------------------------------------
#define IMM32_DLLNAME L"\\imm32.dll"
#define VER_DLLNAME L"\\version.dll"
#define MAX_CANDLIST 10
#define MAX_COMPSTRING_SIZE 256

class CDXUTIMEEditBox : public CDXUTEditBox
{
friend class CExternalApiInitializer;

static void InitializeImm();
static void UninitializeImm();

static HINSTANCE s_hDllImm32; // IMM32 DLL handle
static HINSTANCE s_hDllVer; // Version DLL handle
static HIMC s_hImcDef; // Default input context

protected:
// Empty implementation of the IMM32 API
static INPUTCONTEXT* WINAPI Dummy_ImmLockIMC( HIMC ) { return NULL; }
static BOOL WINAPI Dummy_ImmUnlockIMC( HIMC ) { return FALSE; }
static LPVOID WINAPI Dummy_ImmLockIMCC( HIMCC ) { return NULL; }
static BOOL WINAPI Dummy_ImmUnlockIMCC( HIMCC ) { return FALSE; }
static BOOL WINAPI Dummy_ImmDisableTextFrameService( DWORD ) { return TRUE; }
static LONG WINAPI Dummy_ImmGetCompositionStringW( HIMC, DWORD, LPVOID, DWORD ) { return IMM_ERROR_GENERAL; }
static DWORD WINAPI Dummy_ImmGetCandidateListW( HIMC, DWORD, LPCANDIDATELIST, DWORD ) { return 0; }
static HIMC WINAPI Dummy_ImmGetContext( HWND ) { return NULL; }
static BOOL WINAPI Dummy_ImmReleaseContext( HWND, HIMC ) { return FALSE; }
static HIMC WINAPI Dummy_ImmAssociateContext( HWND, HIMC ) { return NULL; }
static BOOL WINAPI Dummy_ImmGetOpenStatus( HIMC ) { return 0; }
static BOOL WINAPI Dummy_ImmSetOpenStatus( HIMC, BOOL ) { return 0; }
static BOOL WINAPI Dummy_ImmGetConversionStatus( HIMC, LPDWORD, LPDWORD ) { return 0; }
static HWND WINAPI Dummy_ImmGetDefaultIMEWnd( HWND ) { return NULL; }
static UINT WINAPI Dummy_ImmGetIMEFileNameA( HKL, LPSTR, UINT ) { return 0; }
static UINT WINAPI Dummy_ImmGetVirtualKey( HWND ) { return 0; }
static BOOL WINAPI Dummy_ImmNotifyIME( HIMC, DWORD, DWORD, DWORD ) { return FALSE; }
static BOOL WINAPI Dummy_ImmSetConversionStatus( HIMC, DWORD, DWORD ) { return FALSE; }
static BOOL WINAPI Dummy_ImmSimulateHotKey( HWND, DWORD ) { return FALSE; }
static BOOL WINAPI Dummy_ImmIsIME( HKL ) { return FALSE; }

// Traditional Chinese IME
static UINT WINAPI Dummy_GetReadingString( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT ) { return 0; }
static BOOL WINAPI Dummy_ShowReadingWindow( HIMC, BOOL ) { return FALSE; }

// Verion library imports
static BOOL APIENTRY Dummy_VerQueryvalueA( const LPVOID, LPSTR, LPVOID *, PUINT ) { return 0; }
static BOOL APIENTRY Dummy_GetFileVersionInfoA( LPSTR, DWORD, DWORD, LPVOID ) { return 0; }
static DWORD APIENTRY Dummy_GetFileVersionInfoSizeA( LPSTR, LPDWORD ) { return 0; }

// Function pointers: IMM32
static INPUTCONTEXT* (WINAPI * _ImmLockIMC)( HIMC );
static BOOL (WINAPI * _ImmUnlockIMC)( HIMC );
static LPVOID (WINAPI * _ImmLockIMCC)( HIMCC );
static BOOL (WINAPI * _ImmUnlockIMCC)( HIMCC );
static BOOL (WINAPI * _ImmDisableTextFrameService)( DWORD );
static LONG (WINAPI * _ImmGetCompositionStringW)( HIMC, DWORD, LPVOID, DWORD );
static DWORD (WINAPI * _ImmGetCandidateListW)( HIMC, DWORD, LPCANDIDATELIST, DWORD );
static HIMC (WINAPI * _ImmGetContext)( HWND );
static BOOL (WINAPI * _ImmReleaseContext)( HWND, HIMC );
static HIMC (WINAPI * _ImmAssociateContext)( HWND, HIMC );
static BOOL (WINAPI * _ImmGetOpenStatus)( HIMC );
static BOOL (WINAPI * _ImmSetOpenStatus)( HIMC, BOOL );
static BOOL (WINAPI * _ImmGetConversionStatus)( HIMC, LPDWORD, LPDWORD );
static HWND (WINAPI * _ImmGetDefaultIMEWnd)( HWND );
static UINT (WINAPI * _ImmGetIMEFileNameA)( HKL, LPSTR, UINT );
static UINT (WINAPI * _ImmGetVirtualKey)( HWND );
static BOOL (WINAPI * _ImmNotifyIME)( HIMC, DWORD, DWORD, DWORD );
static BOOL (WINAPI * _ImmSetConversionStatus)( HIMC, DWORD, DWORD );
static BOOL (WINAPI * _ImmSimulateHotKey)( HWND, DWORD );
static BOOL (WINAPI * _ImmIsIME)( HKL );

// Function pointers: Traditional Chinese IME
static UINT (WINAPI * _GetReadingString)( HIMC, UINT, LPWSTR, PINT, BOOL*, PUINT );
static BOOL (WINAPI * _ShowReadingWindow)( HIMC, BOOL );

// Function pointers: Verion library imports
static BOOL (APIENTRY * _VerQueryvalueA)( const LPVOID, LPSTR, LPVOID *, PUINT );
static BOOL (APIENTRY * _GetFileVersionInfoA)( LPSTR, DWORD, DWORD, LPVOID );
static DWORD (APIENTRY * _GetFileVersionInfoSizeA)( LPSTR, LPDWORD );

public:
CDXUTIMEEditBox( CDXUTDialog *pDialog = NULL );
virtual ~CDXUTIMEEditBox();

static HRESULT StaticOnCreateDevice();
static bool StaticMsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );

static void EnableImeSystem( bool bEnable );

virtual void Render( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
virtual bool MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
virtual bool HandleMouse( UINT uMsg, POINT pt, WPARAM wParam, LPARAM lParam );
virtual void UpdateRects();
virtual void OnFocusIn();
virtual void OnFocusOut();

void PumpMessage();

virtual void RenderCandidateReadingWindow( IDirect3DDevice9* pd3dDevice, float fElapsedTime, bool bReading );
virtual void RenderComposition( IDirect3DDevice9* pd3dDevice, float fElapsedTime );
virtual void RenderIndicator( IDirect3DDevice9* pd3dDevice, float fElapsedTime );

protected:
static WORD GetLanguage() { return LOWORD( s_hklCurrent ); }
static WORD GetPrimaryLanguage() { return PRIMARYLANGID( LOWORD( s_hklCurrent ) ); }
static WORD GetSubLanguage() { return SUBLANGID( LOWORD( s_hklCurrent ) ); }
static void SendKey( BYTE nVirtKey );
static DWORD GetImeId( UINT uIndex = 0 );
static void CheckInputLocale();
static void CheckToggleState();
static void SetupImeApi();
static void ResetCompositionString();
void TruncateCompString( bool bUseBackSpace = true, int iNewStrLen = 0 );
void FinalizeString( bool bSend );
static void GetReadingWindowOrientation( DWORD dwId );
static void GetPrivateReadingString();

void SendCompString();

protected:
enum { INDICATOR_NON_IME, INDICATOR_CHS, INDICATOR_CHT, INDICATOR_KOREAN, INDICATOR_JAPANESE };
enum IMESTATE { IMEUI_STATE_OFF, IMEUI_STATE_ON, IMEUI_STATE_ENGLISH };

struct CCandList
{
WCHAR awszCandidate[MAX_CANDLIST][256];
CUniBuffer HoriCand; // Candidate list string (for horizontal candidate window)
int nFirstSelected; // First character position of the selected string in HoriCand
int nHoriSelectedLen; // Length of the selected string in HoriCand
DWORD dwCount; // Number of valid entries in the candidate list
DWORD dwSelection; // Currently selected candidate entry relative to page top
DWORD dwPageSize;
int nReadingError; // Index of the error character
bool bShowWindow; // Whether the candidate list window is visible
RECT rcCandidate; // Candidate rectangle computed and filled each time before rendered
};

struct CInputLocale
{
HKL m_hKL; // Keyboard layout
WCHAR m_wszLangAbb[3]; // Language abbreviation
WCHAR m_wszLang[64]; // Localized language name
};

// Application-wide data
static HKL s_hklCurrent; // Current keyboard layout of the process
static bool s_bVerticalCand; // Indicates that the candidates are listed vertically
static LPWSTR s_wszCurrIndicator; // Points to an indicator string that corresponds to current input locale
static WCHAR s_aszIndicator[5][3]; // String to draw to indicate current input locale
static bool s_bInsertOnType; // Insert the character as soon as a key is pressed (Korean behavior)
static HINSTANCE s_hDllIme; // Instance handle of the current IME module
static IMESTATE s_ImeState; // IME global state
static bool s_bEnableImeSystem; // Whether the IME system is active
static POINT s_ptCompString; // Composition string position. Updated every frame.
static int s_nCompCaret; // Caret position of the composition string
static int s_nFirstTargetConv; // Index of the first target converted char in comp string. If none, -1.
static CUniBuffer s_CompString; // Buffer to hold the composition string (we fix its length)
static BYTE s_abCompStringAttr[MAX_COMPSTRING_SIZE];
static DWORD s_adwCompStringClause[MAX_COMPSTRING_SIZE];
static WCHAR s_wszReadingString[32];// Used only with horizontal reading window (why?)
static CCandList s_CandList; // Data relevant to the candidate list
static bool s_bShowReadingWindow; // Indicates whether reading window is visible
static bool s_bHorizontalReading; // Indicates whether the reading window is vertical or horizontal
static bool s_bChineseIME;
static CGrowableArray< CInputLocale > s_Locale; // Array of loaded keyboard layout on system

// Color of various IME elements
D3DCOLOR m_ReadingColor; // Reading string color
D3DCOLOR m_ReadingWinColor; // Reading window color
D3DCOLOR m_ReadingSelColor; // Selected character in reading string
D3DCOLOR m_ReadingSelBkColor; // Background color for selected char in reading str
D3DCOLOR m_CandidateColor; // Candidate string color
D3DCOLOR m_CandidateWinColor; // Candidate window color
D3DCOLOR m_CandidateSelColor; // Selected candidate string color
D3DCOLOR m_CandidateSelBkColor; // Selected candidate background color
D3DCOLOR m_CompColor; // Composition string color
D3DCOLOR m_CompWinColor; // Composition string window color
D3DCOLOR m_CompCaretColor; // Composition string caret color
D3DCOLOR m_CompTargetColor; // Composition string target converted color
D3DCOLOR m_CompTargetBkColor; // Composition string target converted background
D3DCOLOR m_CompTargetNonColor; // Composition string target non-converted color
D3DCOLOR m_CompTargetNonBkColor;// Composition string target non-converted background
D3DCOLOR m_IndicatorImeColor; // Indicator text color for IME
D3DCOLOR m_IndicatorEngColor; // Indicator text color for English
D3DCOLOR m_IndicatorBkColor; // Indicator text background color

// Edit-control-specific data
int m_nIndicatorWidth; // Width of the indicator symbol
RECT m_rcIndicator; // Rectangle for drawing the indicator button
};



#endif // DXUT_GUI_H
≡≡≡≡≡ 评论(共 条)我要评论
 

 Copyright  @  好想~~~~好想 2005.03