📄 dxutgui.cpp
字号:
if( uMsg == WM_KEYDOWN && ( !s_pControlFocus ||
( s_pControlFocus->GetType() != DXUT_CONTROL_EDITBOX
&& s_pControlFocus->GetType() != DXUT_CONTROL_IMEEDITBOX ) ) )
{
for( int i=0; i < m_Controls.GetSize(); i++ )
{
CDXUTControl* pControl = m_Controls.GetAt( i );
if( pControl->GetHotkey() == wParam )
{
pControl->OnHotkey();
return true;
}
}
}
// Not yet handled, check for focus messages
if( uMsg == WM_KEYDOWN )
{
// If keyboard input is not enabled, this message should be ignored
if( !m_bKeyboardInput )
return false;
switch( wParam )
{
case VK_RIGHT:
case VK_DOWN:
if( s_pControlFocus != NULL )
{
return OnCycleFocus( true );
}
break;
case VK_LEFT:
case VK_UP:
if( s_pControlFocus != NULL )
{
return OnCycleFocus( false );
}
break;
case VK_TAB:
{
bool bShiftDown = ((GetKeyState( VK_SHIFT ) & 0x8000) != 0);
return OnCycleFocus( !bShiftDown );
}
}
}
break;
}
// Mouse messages
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_XBUTTONDOWN:
case WM_XBUTTONUP:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_XBUTTONDBLCLK:
case WM_MOUSEWHEEL:
{
// If not accepting mouse input, return false to indicate the message should still
// be handled by the application (usually to move the camera).
if( !m_bMouseInput )
return false;
POINT mousePoint = { short(LOWORD(lParam)), short(HIWORD(lParam)) };
mousePoint.x -= m_x;
mousePoint.y -= m_y;
// If caption is enabled, offset the Y coordinate by the negative of its height.
if( m_bCaption )
mousePoint.y -= m_nCaptionHeight;
// If a control is in focus, it belongs to this dialog, and it's enabled, then give
// it the first chance at handling the message.
if( s_pControlFocus &&
s_pControlFocus->m_pDialog == this &&
s_pControlFocus->GetEnabled() )
{
if( s_pControlFocus->HandleMouse( uMsg, mousePoint, wParam, lParam ) )
return true;
}
// Not yet handled, see if the mouse is over any controls
CDXUTControl* pControl = GetControlAtPoint( mousePoint );
if( pControl != NULL && pControl->GetEnabled() )
{
bHandled = pControl->HandleMouse( uMsg, mousePoint, wParam, lParam );
if( bHandled )
return true;
}
else
{
// Mouse not over any controls in this dialog, if there was a control
// which had focus it just lost it
if( uMsg == WM_LBUTTONDOWN &&
s_pControlFocus &&
s_pControlFocus->m_pDialog == this )
{
s_pControlFocus->OnFocusOut();
s_pControlFocus = NULL;
}
}
// Still not handled, hand this off to the dialog. Return false to indicate the
// message should still be handled by the application (usually to move the camera).
switch( uMsg )
{
case WM_MOUSEMOVE:
OnMouseMove( mousePoint );
return false;
}
break;
}
}
return false;
}
//--------------------------------------------------------------------------------------
CDXUTControl* CDXUTDialog::GetControlAtPoint( POINT pt )
{
// Search through all child controls for the first one which
// contains the mouse point
for( int i=0; i < m_Controls.GetSize(); i++ )
{
CDXUTControl* pControl = m_Controls.GetAt(i);
if( pControl == NULL )
{
continue;
}
// We only return the current control if it is visible
// and enabled. Because GetControlAtPoint() is used to do mouse
// hittest, it makes sense to perform this filtering.
if( pControl->ContainsPoint( pt ) && pControl->GetEnabled() && pControl->GetVisible() )
{
return pControl;
}
}
return NULL;
}
//--------------------------------------------------------------------------------------
bool CDXUTDialog::GetControlEnabled( int ID )
{
CDXUTControl* pControl = GetControl( ID );
if( pControl == NULL )
return false;
return pControl->GetEnabled();
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::SetControlEnabled( int ID, bool bEnabled )
{
CDXUTControl* pControl = GetControl( ID );
if( pControl == NULL )
return;
pControl->SetEnabled( bEnabled );
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::OnMouseUp( POINT pt )
{
s_pControlPressed = NULL;
m_pControlMouseOver = NULL;
}
//--------------------------------------------------------------------------------------
void CDXUTDialog::OnMouseMove( POINT pt )
{
// Figure out which control the mouse is over now
CDXUTControl* pControl = GetControlAtPoint( pt );
// If the mouse is still over the same control, nothing needs to be done
if( pControl == m_pControlMouseOver )
return;
// Handle mouse leaving the old control
if( m_pControlMouseOver )
m_pControlMouseOver->OnMouseLeave();
// Handle mouse entering the new control
m_pControlMouseOver = pControl;
if( pControl != NULL )
m_pControlMouseOver->OnMouseEnter();
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::SetDefaultElement( UINT nControlType, UINT iElement, CDXUTElement* pElement )
{
// If this Element type already exist in the list, simply update the stored Element
for( int i=0; i < m_DefaultElements.GetSize(); i++ )
{
DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
if( pElementHolder->nControlType == nControlType &&
pElementHolder->iElement == iElement )
{
pElementHolder->Element = *pElement;
return S_OK;
}
}
// Otherwise, add a new entry
DXUTElementHolder* pNewHolder;
pNewHolder = new DXUTElementHolder;
if( pNewHolder == NULL )
return E_OUTOFMEMORY;
pNewHolder->nControlType = nControlType;
pNewHolder->iElement = iElement;
pNewHolder->Element = *pElement;
m_DefaultElements.Add( pNewHolder );
return S_OK;
}
//--------------------------------------------------------------------------------------
CDXUTElement* CDXUTDialog::GetDefaultElement( UINT nControlType, UINT iElement )
{
for( int i=0; i < m_DefaultElements.GetSize(); i++ )
{
DXUTElementHolder* pElementHolder = m_DefaultElements.GetAt( i );
if( pElementHolder->nControlType == nControlType &&
pElementHolder->iElement == iElement )
{
return &pElementHolder->Element;
}
}
return NULL;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::AddStatic( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bIsDefault, CDXUTStatic** ppCreated )
{
HRESULT hr = S_OK;
CDXUTStatic* pStatic = new CDXUTStatic( this );
if( ppCreated != NULL )
*ppCreated = pStatic;
if( pStatic == NULL )
return E_OUTOFMEMORY;
hr = AddControl( pStatic );
if( FAILED(hr) )
return hr;
// Set the ID and list index
pStatic->SetID( ID );
pStatic->SetText( strText );
pStatic->SetLocation( x, y );
pStatic->SetSize( width, height );
pStatic->m_bIsDefault = bIsDefault;
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::AddButton( int ID, LPCWSTR strText, int x, int y, int width, int height, UINT nHotkey, bool bIsDefault, CDXUTButton** ppCreated )
{
HRESULT hr = S_OK;
CDXUTButton* pButton = new CDXUTButton( this );
if( ppCreated != NULL )
*ppCreated = pButton;
if( pButton == NULL )
return E_OUTOFMEMORY;
hr = AddControl( pButton );
if( FAILED(hr) )
return hr;
// Set the ID and list index
pButton->SetID( ID );
pButton->SetText( strText );
pButton->SetLocation( x, y );
pButton->SetSize( width, height );
pButton->SetHotkey( nHotkey );
pButton->m_bIsDefault = bIsDefault;
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::AddCheckBox( int ID, LPCWSTR strText, int x, int y, int width, int height, bool bChecked, UINT nHotkey, bool bIsDefault, CDXUTCheckBox** ppCreated )
{
HRESULT hr = S_OK;
CDXUTCheckBox* pCheckBox = new CDXUTCheckBox( this );
if( ppCreated != NULL )
*ppCreated = pCheckBox;
if( pCheckBox == NULL )
return E_OUTOFMEMORY;
hr = AddControl( pCheckBox );
if( FAILED(hr) )
return hr;
// Set the ID and list index
pCheckBox->SetID( ID );
pCheckBox->SetText( strText );
pCheckBox->SetLocation( x, y );
pCheckBox->SetSize( width, height );
pCheckBox->SetHotkey( nHotkey );
pCheckBox->m_bIsDefault = bIsDefault;
pCheckBox->SetChecked( bChecked );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::AddRadioButton( int ID, UINT nButtonGroup, LPCWSTR strText, int x, int y, int width, int height, bool bChecked, UINT nHotkey, bool bIsDefault, CDXUTRadioButton** ppCreated )
{
HRESULT hr = S_OK;
CDXUTRadioButton* pRadioButton = new CDXUTRadioButton( this );
if( ppCreated != NULL )
*ppCreated = pRadioButton;
if( pRadioButton == NULL )
return E_OUTOFMEMORY;
hr = AddControl( pRadioButton );
if( FAILED(hr) )
return hr;
// Set the ID and list index
pRadioButton->SetID( ID );
pRadioButton->SetText( strText );
pRadioButton->SetButtonGroup( nButtonGroup );
pRadioButton->SetLocation( x, y );
pRadioButton->SetSize( width, height );
pRadioButton->SetHotkey( nHotkey );
pRadioButton->SetChecked( bChecked );
pRadioButton->m_bIsDefault = bIsDefault;
pRadioButton->SetChecked( bChecked );
return S_OK;
}
//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog::AddComboBox( int ID, int x, int y, int width, int height, UINT nHotkey, bool bIsDefault, CDXUTComboBox** ppCreated )
{
HRESULT hr = S_OK;
CDXUTComboBox* pComboBox = new CDXUTComboBox( this );
if( ppCreated != NULL )
*ppCreated = pComboBox;
if( pComboBox == NULL )
return E_OUTOFMEMORY;
hr = AddControl( pComboBox );
if( FAILED(hr) )
return hr;
// Set the ID and list index
pComboBox->SetID( ID );
pComboBox->SetLocation( x, y );
pComboBox->SetSize( width, height );
pComboBox->SetHotkey( nHotkey );
pComboBox->m_bIsDefault = bIsDefault;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -