|
|
//
// cuiobj.cpp
// = ui object library =
//
#include "private.h"
#include "delay.h"
#include "cuiobj.h"
#include "cuiwnd.h"
#include "cuitip.h"
#include "cmydc.h"
#include "cuiutil.h"
#include "cuitheme.h"
#define SCROLLTHUMBHEIGHT_MIN 6
/* G E T S C R O L L D E L A Y */ /*------------------------------------------------------------------------------
Get delay time to start auto scroll (while the scroll button down) The time is in milli-second
------------------------------------------------------------------------------*/ __inline UINT GetScrollDelay( void ) { return (GetDoubleClickTime() * 4 / 5); }
/* G E T S C R O L L S P E E D */ /*------------------------------------------------------------------------------
Get repeat time in auto scroll (while the scroll button down) The time is in milli-second
------------------------------------------------------------------------------*/ __inline UINT GetScrollSpeed( void ) { return (GetScrollDelay() / 8); }
/*=============================================================================*/ /* */ /* C U I F O B J E C T */ /* */ /*=============================================================================*/
/* C U I F O B J E C T */ /*------------------------------------------------------------------------------
Constructor of CUIFObject
------------------------------------------------------------------------------*/ CUIFObject::CUIFObject( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) { m_pParent = pParent; m_dwID = dwID; m_dwStyle = dwStyle;
::SetRect( &m_rc, 0, 0, 0, 0 ); if (prc != NULL) { m_rc = *prc; }
m_pUIWnd = NULL; if (m_pParent != NULL) { m_pUIWnd = pParent->GetUIWnd(); }
m_pUIFScheme = NULL; if (m_pParent != NULL) { m_pUIFScheme = pParent->GetUIFScheme(); }
m_fEnabled = TRUE; m_fVisible = TRUE; m_hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); m_fUseCustomFont = FALSE; m_pwchToolTip = NULL;
m_pointPreferredSize.x=m_pointPreferredSize.y=-1;
#if defined(_DEBUG) || defined(DEBUG)
m_fInitialized = FALSE; #endif /* DEBUG */
}
/* ~ C U I F O B J E C T */ /*------------------------------------------------------------------------------
Destructor of CUIFObject
------------------------------------------------------------------------------*/ CUIFObject::~CUIFObject( void ) { CUIFObject *pUIObj;
#if defined(_DEBUG) || defined(DEBUG)
Assert( m_fInitialized ); #endif /* DEBUG */
// dispose buffer
if (m_pUIWnd != NULL) { CUIFToolTip *pTipWnd = m_pUIWnd->GetToolTipWnd(); if (pTipWnd && (this == pTipWnd->GetCurrentObj())) pTipWnd->ClearCurrentObj(); }
if (m_pwchToolTip != NULL) { delete m_pwchToolTip; }
// delete children
while (pUIObj = m_ChildList.GetLast()) { m_ChildList.Remove( pUIObj ); delete pUIObj; }
// to clear capture/timer/pointed status call RemoveUIObj of UIFrameWindow
if (m_pUIWnd != NULL) { m_pUIWnd->RemoveUIObj( this ); } }
/* I N I T I A L I Z E */ /*------------------------------------------------------------------------------
Inititalize the object Returns TRUE when succeed to initialize, FALSE when failed. This function MUST be called when create a object.
------------------------------------------------------------------------------*/ CUIFObject *CUIFObject::Initialize( void ) { #if defined(_DEBUG) || defined(DEBUG)
Assert( !m_fInitialized ); m_fInitialized = TRUE; #endif /* DEBUG */
return this; }
/* C A L L O N P A I N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::CallOnPaint( void ) { if (m_pUIWnd != NULL) { m_pUIWnd->UpdateUI(&GetRectRef()); } }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of button object
------------------------------------------------------------------------------*/ void CUIFObject::OnPaint( HDC hDC ) { BOOL fDefault = TRUE;
if ((GetUIWnd()->GetStyle() & UIWINDOW_WHISTLERLOOK) != 0) { fDefault = !OnPaintTheme( hDC ); }
if (fDefault) { OnPaintNoTheme( hDC ); } }
/* S T A R T C A P T U R E */ /*------------------------------------------------------------------------------
Start capturing mouse
------------------------------------------------------------------------------*/ void CUIFObject::StartCapture( void ) { if (m_pUIWnd != NULL) { m_pUIWnd->SetCaptureObject( this ); } }
/* E N D C A P T U R E */ /*------------------------------------------------------------------------------
End capturing mouse
------------------------------------------------------------------------------*/ void CUIFObject::EndCapture( void ) { if (m_pUIWnd != NULL) { m_pUIWnd->SetCaptureObject( NULL ); } }
/* S T A R T T I M E R */ /*------------------------------------------------------------------------------
Make timer
------------------------------------------------------------------------------*/ void CUIFObject::StartTimer( UINT uElapse ) { if (m_pUIWnd != NULL) { m_pUIWnd->SetTimerObject( this, uElapse ); } }
/* E N D T I M E R */ /*------------------------------------------------------------------------------
Kill timer
------------------------------------------------------------------------------*/ void CUIFObject::EndTimer( void ) { if (m_pUIWnd != NULL) { m_pUIWnd->SetTimerObject( NULL ); } }
/* I S C A P T U R E */ /*------------------------------------------------------------------------------
Check if the object is capturing mouse
------------------------------------------------------------------------------*/ BOOL CUIFObject::IsCapture( void ) { if (m_pUIWnd != NULL) { return (m_pUIWnd->GetCaptureObject() == this); }
return FALSE; }
/* I S T I M E R */ /*------------------------------------------------------------------------------
Check if the object has timer
------------------------------------------------------------------------------*/ BOOL CUIFObject::IsTimer( void ) { if (m_pUIWnd != NULL) { return (m_pUIWnd->GetTimerObject() == this); }
return FALSE; }
/* G E T R E C T */ /*------------------------------------------------------------------------------
Get rectangle of object
------------------------------------------------------------------------------*/ void CUIFObject::GetRect( RECT *prc ) { *prc = GetRectRef(); }
/* S E T R E C T */ /*------------------------------------------------------------------------------
Set rectangle of object
------------------------------------------------------------------------------*/ void CUIFObject::SetRect( const RECT *prc ) { Assert(PtrToInt(prc)); m_rc = *prc;
if (m_pUIWnd != NULL) { m_pUIWnd->OnObjectMoved( this ); }
CallOnPaint(); }
/* P T I N O B J E C T */ /*------------------------------------------------------------------------------
Check if point is in the object
------------------------------------------------------------------------------*/ BOOL CUIFObject::PtInObject( POINT pt ) { return m_fVisible && PtInRect( &GetRectRef(), pt ); }
/* E N A B L E */ /*------------------------------------------------------------------------------
Enable/disable object
------------------------------------------------------------------------------*/ void CUIFObject::Enable( BOOL fEnable ) { if (m_fEnabled != fEnable) { int nChild; int i;
m_fEnabled = fEnable; // enable/disable all children
nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i );
Assert( pUIObj != NULL ); pUIObj->Enable( fEnable ); }
CallOnPaint(); } }
/* S H O W */ /*------------------------------------------------------------------------------
Show/hide object
------------------------------------------------------------------------------*/ void CUIFObject::Show( BOOL fShow ) { if (m_fVisible != fShow) { int nChild; int i;
m_fVisible = fShow;
// show/hide all children
nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i );
Assert( pUIObj != NULL ); pUIObj->Show( fShow ); }
// let parent paint the object when it's hidden
if (!m_fVisible) { if (m_pParent != NULL) { m_pParent->CallOnPaint(); } } else { CallOnPaint(); } } }
/* S E T F O N T */ /*------------------------------------------------------------------------------
Set font
------------------------------------------------------------------------------*/ void CUIFObject::SetFontToThis( HFONT hFont ) { if (hFont == NULL) { hFont = (HFONT)GetStockObject( DEFAULT_GUI_FONT ); m_fUseCustomFont = FALSE; } else { m_fUseCustomFont = TRUE; } m_hFont = hFont; }
/* S E T F O N T */ /*------------------------------------------------------------------------------
Set font
------------------------------------------------------------------------------*/ void CUIFObject::SetFont( HFONT hFont ) { int nChild; int i;
SetFontToThis(hFont);
// set font to all children
nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i );
Assert( pUIObj != NULL ); pUIObj->SetFont( hFont ); }
CallOnPaint(); }
/* S E T S T Y L E */ /*------------------------------------------------------------------------------
Set the style of object
------------------------------------------------------------------------------*/ void CUIFObject::SetStyle( DWORD dwStyle ) { m_dwStyle = dwStyle; }
/* P A I N T O B J E C T */ /*------------------------------------------------------------------------------
Paint object NOTE: Paint itself at first (actual paint is done in OnPaint()), and then paint all children if exist.
------------------------------------------------------------------------------*/ void CUIFObject::PaintObject( HDC hDC, const RECT *prcUpdate ) { int nChild; int i;
if (prcUpdate == NULL) { prcUpdate = &GetRectRef(); }
if (m_fVisible) { // paint itself at first
OnPaint( hDC );
// paint all children
nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i ); RECT rcDest;
Assert( pUIObj != NULL ); if (IntersectRect( &rcDest, prcUpdate, &pUIObj->GetRectRef() )) { pUIObj->PaintObject( hDC, &rcDest ); } } } }
/* A D D U I O B J */ /*------------------------------------------------------------------------------
Add child UI object
------------------------------------------------------------------------------*/ void CUIFObject::AddUIObj( CUIFObject *pUIObj ) { Assert( pUIObj != NULL ); Assert( pUIObj->FInitialized() );
if (m_ChildList.Add( pUIObj )) { CallOnPaint(); } }
/* R E M O V E U I O B J */ /*------------------------------------------------------------------------------
Remove child UI object
------------------------------------------------------------------------------*/ void CUIFObject::RemoveUIObj( CUIFObject *pUIObj ) { Assert( pUIObj != NULL );
if (m_ChildList.Remove( pUIObj )) { CallOnPaint(); } }
/* O B J E C T F R O M P O I N T */ /*------------------------------------------------------------------------------
Get UI object from point Returns UI object which is under of the point. If no UI object found, returns NULL.
------------------------------------------------------------------------------*/ CUIFObject *CUIFObject::ObjectFromPoint( POINT pt ) { CUIFObject *pUIObjFromPoint = NULL;
if (PtInObject( pt )) { int nChild; int i;
pUIObjFromPoint = this;
nChild = m_ChildList.GetCount(); for (i = 0; i < nChild; i++) { CUIFObject *pUIObj = m_ChildList.Get( i ); CUIFObject *pUIObjFromPointChild = NULL;
Assert( pUIObj != NULL ); pUIObjFromPointChild = pUIObj->ObjectFromPoint( pt ); if (pUIObjFromPointChild != NULL) { pUIObjFromPoint = pUIObjFromPointChild; } } }
return pUIObjFromPoint; }
/* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------
Default handler: Send notification to the parent object This allows for heirarchies of objects administrated from the top.
------------------------------------------------------------------------------*/ LRESULT CUIFObject::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCode, LPARAM lParam ) { LRESULT lResult = 0;
if (m_pParent != NULL) { lResult = m_pParent->OnObjectNotify( pUIObj, dwCode, lParam ); }
return lResult; }
/* S E T T O O L T I P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::SetToolTip( LPCWSTR pwchToolTip ) { if (m_pwchToolTip != NULL) { delete m_pwchToolTip; m_pwchToolTip = NULL; }
if (pwchToolTip != NULL) { m_pwchToolTip = new WCHAR[ StrLenW( pwchToolTip ) + 1 ]; if (m_pwchToolTip) StrCpyW( m_pwchToolTip, pwchToolTip ); } }
/* G E T T O O L T I P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ LPCWSTR CUIFObject::GetToolTip( void ) { return m_pwchToolTip; }
/* N O T I F Y C O M M A N D */ /*------------------------------------------------------------------------------
Send notification to the parent object
------------------------------------------------------------------------------*/ LRESULT CUIFObject::NotifyCommand( DWORD dwCode, LPARAM lParam ) { LRESULT lResult = 0;
if (m_pParent != NULL) { lResult = m_pParent->OnObjectNotify( this, dwCode, lParam ); }
return lResult; }
/* G E T F O N T H E I G H T */ /*------------------------------------------------------------------------------
Get the height of font set to the object
------------------------------------------------------------------------------*/ int CUIFObject::GetFontHeight( void ) { HDC hDC; HFONT hFontOld; TEXTMETRIC tm;
hDC = GetDC( m_pUIWnd->GetWnd() ); hFontOld = (HFONT)SelectObject( hDC, m_hFont );
GetTextMetrics( hDC, &tm );
SelectObject( hDC, hFontOld ); ReleaseDC( m_pUIWnd->GetWnd(), hDC );
return tm.tmHeight + tm.tmExternalLeading; }
/* G E T U I F C O L O R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ COLORREF CUIFObject::GetUIFColor( UIFCOLOR iCol ) { return (m_pUIFScheme != NULL) ? m_pUIFScheme->GetColor( iCol ) : RGB( 0, 0, 0 ); }
/* G E T U I F B R U S H */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ HBRUSH CUIFObject::GetUIFBrush( UIFCOLOR iCol ) { return (m_pUIFScheme != NULL) ? m_pUIFScheme->GetBrush( iCol ) : NULL; }
/* D E T A C H W N D O B J */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::DetachWndObj( void ) { if (m_pUIWnd != NULL) { CUIFToolTip *pTipWnd = m_pUIWnd->GetToolTipWnd(); if (pTipWnd && (this == pTipWnd->GetCurrentObj())) pTipWnd->ClearCurrentObj(); m_pUIWnd->RemoveUIObj( this ); } m_pUIWnd = NULL; }
/* C L E A R W N D O B J */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::ClearWndObj( void ) { int i;
m_pUIWnd = NULL;
for (i = 0; i < m_ChildList.GetCount(); i ++) { CUIFObject *pObj; pObj = m_ChildList.Get(i); if (pObj) pObj->ClearWndObj(); } }
/* O N T H E M E C H A N G E D
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::ClearTheme( void ) { int i; CloseThemeData();
for (i = 0; i < m_ChildList.GetCount(); i ++) { CUIFObject *pObj; pObj = m_ChildList.Get(i); if (pObj) pObj->ClearTheme(); } }
/* O N T H E M E C H A N G E D
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFObject::SetScheme(CUIFScheme *pUIFScheme) { int i; m_pUIFScheme = pUIFScheme;;
for (i = 0; i < m_ChildList.GetCount(); i ++) { CUIFObject *pObj; pObj = m_ChildList.Get(i); if (pObj) pObj->SetScheme(pUIFScheme); } }
/* I S R T L */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFObject::IsRTL() { if (!m_pUIWnd) return FALSE;
if (!m_pUIWnd->FHasStyle( UIWINDOW_LAYOUTRTL )) return FALSE;
return TRUE; }
/*=============================================================================*/ /* */ /* C U I F B O R D E R */ /* */ /*=============================================================================*/
/* C U I F B O R D E R */ /*------------------------------------------------------------------------------
Constructor of CUIFBorder
------------------------------------------------------------------------------*/ CUIFBorder::CUIFBorder( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { }
/* ~ C U I F B O R D E R */ /*------------------------------------------------------------------------------
Destructor of CUIFBorder
------------------------------------------------------------------------------*/ CUIFBorder::~CUIFBorder( void ) { }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of border object
------------------------------------------------------------------------------*/ void CUIFBorder::OnPaint( HDC hDC ) { RECT rc = GetRectRef();
switch (m_dwStyle & UIBORDER_DIRMASK) { default: case UIBORDER_HORZ: { DrawEdge( hDC, &rc, EDGE_ETCHED, BF_TOP ); break; }
case UIBORDER_VERT: { DrawEdge( hDC, &rc, EDGE_ETCHED, BF_LEFT ); break; } } }
/*=============================================================================*/ /* */ /* C U I F S T A T I C */ /* */ /*=============================================================================*/
/* C U I F S T A T I C */ /*------------------------------------------------------------------------------
Constructor of CUIFStatic
------------------------------------------------------------------------------*/ CUIFStatic::CUIFStatic( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_pwchText = NULL; }
/* ~ C U I F S T A T I C */ /*------------------------------------------------------------------------------
Destructor of CUIFStatic
------------------------------------------------------------------------------*/ CUIFStatic::~CUIFStatic( void ) { if (m_pwchText != NULL) { delete m_pwchText; } }
/* S E T T E X T */ /*------------------------------------------------------------------------------
Set text to display
------------------------------------------------------------------------------*/ void CUIFStatic::SetText( LPCWSTR pwchText ) { if (m_pwchText != NULL) { delete m_pwchText; m_pwchText = NULL; }
if (pwchText != NULL) { int cwch = StrLenW( pwchText ) + 1;
m_pwchText = new WCHAR[ cwch ]; if (m_pwchText) MemCopy( m_pwchText, pwchText, cwch * sizeof(WCHAR) ); }
// update window
CallOnPaint(); }
/* G E T T E X T */ /*------------------------------------------------------------------------------
Get text
------------------------------------------------------------------------------*/ int CUIFStatic::GetText( LPWSTR pwchBuf, int cwchBuf ) { int cwchText = (m_pwchText == NULL) ? 0 : StrLenW(m_pwchText);
if (cwchBuf <= 0) { // return text length in cwch (not including null-terminater)
return cwchText; } else if (pwchBuf == NULL) { // return error code
return (-1); }
if (0 < cwchText) { cwchText = min( cwchText, cwchBuf-1 ); MemCopy( pwchBuf, m_pwchText, cwchText * sizeof(WCHAR) ); *(pwchBuf + cwchText) = L'\0'; // always null terminate
}
return cwchText; }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of static object
------------------------------------------------------------------------------*/ void CUIFStatic::OnPaint( HDC hDC ) { HFONT hFontOld; int xAlign; int yAlign; SIZE size; int cwch;
if (m_pwchText == NULL) { return; }
cwch = StrLenW(m_pwchText);
// prepare objects
hFontOld= (HFONT)SelectObject( hDC, GetFont() );
// calc alignment
GetTextExtentPointW( hDC, m_pwchText, cwch, &size ); switch (m_dwStyle & UISTATIC_HALIGNMASK) { case UISTATIC_LEFT: default: { xAlign = 0; break; }
case UISTATIC_CENTER: { xAlign = (GetRectRef().right - GetRectRef().left - size.cx) / 2; break; }
case UISTATIC_RIGHT: { xAlign = GetRectRef().right - GetRectRef().left - size.cx; break; } }
switch (m_dwStyle & UISTATIC_VALIGNMASK) { case UISTATIC_TOP: default: { yAlign = 0; break; }
case UISTATIC_VCENTER: { yAlign = (GetRectRef().bottom - GetRectRef().top - size.cy) / 2; break; }
case UISTATIC_BOTTOM: { yAlign = GetRectRef().bottom - GetRectRef().top - size.cy; break; } }
// draw
SetBkMode( hDC, TRANSPARENT ); if (IsEnabled()) { SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); CUIExtTextOut( hDC, GetRectRef().left + xAlign, GetRectRef().top + yAlign, ETO_CLIPPED, &GetRectRef(), m_pwchText, cwch, NULL ); } else { SetTextColor( hDC, GetSysColor(COLOR_3DHIGHLIGHT) ); CUIExtTextOut( hDC, GetRectRef().left + xAlign + 1, GetRectRef().top + yAlign + 1, ETO_CLIPPED, &GetRectRef(), m_pwchText, cwch, NULL );
SetTextColor( hDC, GetSysColor(COLOR_3DSHADOW) ); CUIExtTextOut( hDC, GetRectRef().left + xAlign, GetRectRef().top + yAlign, ETO_CLIPPED, &GetRectRef(), m_pwchText, cwch, NULL ); }
// restore objects
SelectObject( hDC, hFontOld); }
/*=============================================================================*/ /* */ /* C U I F B U T T O N */ /* */ /*=============================================================================*/
/* C U I F B U T T O N */ /*------------------------------------------------------------------------------
Constructor of CUIFButton
------------------------------------------------------------------------------*/ CUIFButton::CUIFButton( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_dwStatus = UIBUTTON_NORMAL; m_fToggled = FALSE;
m_hIcon = NULL; m_hBmp = NULL; m_hBmpMask = NULL; m_pwchText = NULL; }
/* ~ C U I F B U T T O N */ /*------------------------------------------------------------------------------
Destructor of CUIFButton
------------------------------------------------------------------------------*/ CUIFButton::~CUIFButton( void ) { if (m_pwchText != NULL) { delete m_pwchText; } }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of button object
------------------------------------------------------------------------------*/ void CUIFButton::OnPaintNoTheme( HDC hDC ) { BOOL fDownFace;
// erase face at first
FillRect( hDC, &GetRectRef(), (HBRUSH)(COLOR_3DFACE + 1) ); #ifndef UNDER_CE
if (m_fToggled && (m_dwStatus == UIBUTTON_NORMAL || m_dwStatus == UIBUTTON_DOWNOUT)) { RECT rc; HBRUSH hBrush; COLORREF colTextOld; COLORREF colBackOld;
hBrush = CreateDitherBrush(); if (hBrush) { colTextOld = SetTextColor( hDC, GetSysColor(COLOR_3DFACE) ); colBackOld = SetBkColor( hDC, GetSysColor(COLOR_3DHILIGHT) );
rc = GetRectRef(); InflateRect( &rc, -2, -2 ); FillRect( hDC, &rc, hBrush );
SetTextColor( hDC, colTextOld ); SetBkColor( hDC, colBackOld ); DeleteObject( hBrush ); } } #endif /* !UNDER_CE */
// draw face
fDownFace = m_fToggled || (m_dwStatus == UIBUTTON_DOWN);
if (m_hBmp != NULL) { DrawBitmapProc( hDC, &GetRectRef(), fDownFace ); } else if (m_hIcon != NULL) { DrawIconProc( hDC, &GetRectRef(), fDownFace ); } else { DrawTextProc( hDC, &GetRectRef(), fDownFace ); }
// draw button edge
if (m_fToggled) { DrawEdgeProc( hDC, &GetRectRef(), TRUE ); } else { switch (m_dwStatus) { case UIBUTTON_DOWN: { DrawEdgeProc( hDC, &GetRectRef(), TRUE ); break; }
case UIBUTTON_HOVER: case UIBUTTON_DOWNOUT: { DrawEdgeProc( hDC, &GetRectRef(), FALSE ); break; } } } }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFButton::OnLButtonDown( POINT pt ) { SetStatus( UIBUTTON_DOWN ); StartCapture();
switch (m_dwStyle & UIBUTTON_TYPEMASK) { default: case UIBUTTON_PUSH: { break; }
case UIBUTTON_TOGGLE: { break; }
case UIBUTTON_PUSHDOWN: { NotifyCommand( UIBUTTON_PRESSED, 0 ); break; } } }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFButton::OnLButtonUp( POINT pt ) { BOOL fCaptured = IsCapture();
if (fCaptured) { EndCapture(); }
switch (m_dwStyle & UIBUTTON_TYPEMASK) { default: case UIBUTTON_PUSH: { if (PtInObject( pt )) { SetStatus( UIBUTTON_HOVER ); NotifyCommand( UIBUTTON_PRESSED, 0 ); } else { SetStatus( UIBUTTON_NORMAL ); } break; }
case UIBUTTON_TOGGLE: { if (PtInObject( pt )) { SetStatus( UIBUTTON_HOVER );
if (fCaptured) { m_fToggled = !m_fToggled; NotifyCommand( UIBUTTON_PRESSED, 0 ); } } else { SetStatus( UIBUTTON_NORMAL ); } break; }
case UIBUTTON_PUSHDOWN: { SetStatus( UIBUTTON_NORMAL ); break; } } }
/* O N M O U S E I N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFButton::OnMouseIn( POINT pt ) { switch (m_dwStyle & UIBUTTON_TYPEMASK) { default: case UIBUTTON_PUSH: { SetStatus( IsCapture() ? UIBUTTON_DOWN : UIBUTTON_HOVER ); break; }
case UIBUTTON_TOGGLE: { SetStatus( IsCapture() ? UIBUTTON_DOWN : UIBUTTON_HOVER ); break; }
case UIBUTTON_PUSHDOWN: { SetStatus( IsCapture() ? UIBUTTON_NORMAL : UIBUTTON_HOVER ); break; } } }
/* O N M O U S E O U T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFButton::OnMouseOut( POINT pt ) { switch (m_dwStyle & UIBUTTON_TYPEMASK) { default: case UIBUTTON_PUSH: { SetStatus( IsCapture() ? UIBUTTON_DOWNOUT : UIBUTTON_NORMAL ); break; }
case UIBUTTON_TOGGLE: { SetStatus( IsCapture() ? UIBUTTON_DOWNOUT : UIBUTTON_NORMAL ); break; }
case UIBUTTON_PUSHDOWN: { SetStatus( UIBUTTON_NORMAL ); break; } } }
/* E N A B L E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFButton::Enable( BOOL fEnable ) { CUIFObject::Enable( fEnable ); if (!IsEnabled()) { SetStatus( UIBUTTON_NORMAL );
if (IsCapture()) { EndCapture(); } } }
/* D R A W E D G E P R O C */ /*------------------------------------------------------------------------------
Draw button edge
------------------------------------------------------------------------------*/ void CUIFButton::DrawEdgeProc( HDC hDC, const RECT *prc, BOOL fDown ) { RECT rc = *prc; DrawEdge( hDC, &rc, fDown ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT ); }
/* S E T T E X T */ /*------------------------------------------------------------------------------
Set text of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetText( LPCWSTR psz ) { if (m_pwchText != NULL) { delete m_pwchText; m_pwchText = NULL; }
//
// init size;
//
MemSet(&m_sizeText, 0, sizeof(SIZE));
if (psz != NULL) { int cwch = StrLenW( psz ) + 1;
m_pwchText = new WCHAR[ cwch ]; if (!m_pwchText) return;
MemCopy( m_pwchText, psz, cwch * sizeof(WCHAR) ); GetTextSize( m_pwchText, &m_sizeText ); }
// update window
CallOnPaint(); }
/* S E T I C O N */ /*------------------------------------------------------------------------------
Set icon of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetIcon( HICON hIcon ) { m_hIcon = hIcon; if (m_hIcon) GetIconSize(m_hIcon, &m_sizeIcon); else MemSet(&m_sizeIcon, 0, sizeof(SIZE)); CallOnPaint(); }
/* S E T I C O N */ /*------------------------------------------------------------------------------
Set icon of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetIcon( LPCTSTR lpszResName ) { SetIcon( LoadIcon( m_pUIWnd->GetInstance(), lpszResName ) ); }
/* S E T B I T M A P */ /*------------------------------------------------------------------------------
Set bitmap of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetBitmap( HBITMAP hBmp ) { m_hBmp = hBmp; if (m_hBmp) GetBitmapSize(m_hBmp, &m_sizeBmp); else MemSet(&m_sizeBmp, 0, sizeof(SIZE)); CallOnPaint(); }
/* S E T B I T M A P */ /*------------------------------------------------------------------------------
Set bitmap of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetBitmap( LPCTSTR lpszResName ) { SetBitmap( LoadBitmap( m_pUIWnd->GetInstance(), lpszResName ) ); }
/* S E T B I T M A P M A S K */ /*------------------------------------------------------------------------------
Set bitmap of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetBitmapMask( HBITMAP hBmp ) { m_hBmpMask = hBmp;
CallOnPaint(); }
/* S E T B I T M A P */ /*------------------------------------------------------------------------------
Set bitmap of button face
------------------------------------------------------------------------------*/ void CUIFButton::SetBitmapMask( LPCTSTR lpszResName ) { SetBitmapMask( LoadBitmap( m_pUIWnd->GetInstance(), lpszResName ) ); }
/* D R A W T E X T P R O C */ /*------------------------------------------------------------------------------
Draw text on button face
------------------------------------------------------------------------------*/ void CUIFButton::DrawTextProc( HDC hDC, const RECT *prc, BOOL fDown ) { int nDownPad = fDown ? 1 : 0; int xAlign; int yAlign; SIZE size; HFONT hFontOld;
//
if (m_pwchText == NULL) { return; }
//
hFontOld = (HFONT)SelectObject( hDC, GetFont() );
// calc text width
CUIGetTextExtentPoint32( hDC, m_pwchText, StrLenW(m_pwchText), &size ); switch (m_dwStyle & UIBUTTON_HALIGNMASK) { case UIBUTTON_LEFT: default: { xAlign = 0; break; }
case UIBUTTON_CENTER: { xAlign = (GetRectRef().right - GetRectRef().left - size.cx) / 2; break; }
case UIBUTTON_RIGHT: { xAlign = GetRectRef().right - GetRectRef().left - size.cx; break; } }
switch (m_dwStyle & UIBUTTON_VALIGNMASK) { case UIBUTTON_TOP: default: { yAlign = 0; break; }
case UIBUTTON_VCENTER: { yAlign = (GetRectRef().bottom - GetRectRef().top - size.cy) / 2; break; }
case UIBUTTON_BOTTOM: { yAlign = GetRectRef().bottom - GetRectRef().top - size.cy; break; } }
//
SetBkMode( hDC, TRANSPARENT ); if (IsEnabled()) { SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); CUIExtTextOut( hDC, prc->left + xAlign + nDownPad, prc->top + yAlign + nDownPad, ETO_CLIPPED, prc, m_pwchText, StrLenW(m_pwchText), NULL ); } else { SetTextColor( hDC, GetSysColor(COLOR_3DHIGHLIGHT) ); CUIExtTextOut( hDC, prc->left + xAlign + nDownPad + 1, prc->top + yAlign + nDownPad + 1, ETO_CLIPPED, prc, m_pwchText, StrLenW(m_pwchText), NULL );
SetTextColor( hDC, GetSysColor(COLOR_3DSHADOW) ); CUIExtTextOut( hDC, prc->left + xAlign + nDownPad, prc->top + yAlign + nDownPad, ETO_CLIPPED, prc, m_pwchText, StrLenW(m_pwchText), NULL ); }
SelectObject( hDC, hFontOld ); }
/* D R A W I C O N P R O C */ /*------------------------------------------------------------------------------
Draw icon on button face
------------------------------------------------------------------------------*/ void CUIFButton::DrawIconProc( HDC hDC, const RECT *prc, BOOL fDown ) { Assert(hDC && prc && m_hIcon); const int nDownPad = fDown ? 1 : 0; const int nWidth = prc->right - prc->left; const int nHeight= prc->bottom - prc->top; const RECT rc = {0, 0, nWidth, nHeight}; HDC hDCMem = NULL; HBITMAP hBmpOld; HBITMAP hBmp = NULL;
// prepare memory dc
hDCMem = CreateCompatibleDC( hDC ); if (!hDCMem) goto Exit; hBmp = CreateCompatibleBitmap( hDC, nWidth, nHeight ); if (!hBmp) goto Exit; hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmp );
// clear background
if (IsEnabled()) { BitBlt( hDCMem, rc.left, rc.top, nWidth, nHeight, hDC, prc->left, prc->top, SRCCOPY ); } else { FillRect( hDCMem, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH) ); }
// paint icon into memory dc
if (m_dwStyle & UIBUTTON_FITIMAGE) { DrawIconEx( hDCMem, 2 + nDownPad, 2 + nDownPad, m_hIcon, nWidth - 4, nHeight - 4, 0, NULL, DI_NORMAL ); } else { DrawIconEx( hDCMem, (nWidth - 16) / 2 + nDownPad, (nHeight - 16) / 2 + nDownPad, m_hIcon, 16, 16, 0, NULL, DI_NORMAL ); }
SelectObject( hDCMem, hBmpOld);
CUIDrawState( hDC, NULL, NULL, (LPARAM)hBmp, 0, // we don't pass a WPARAM in this case.
prc->left, prc->top, nWidth, nHeight, DST_BITMAP | (IsEnabled() ? 0 : (DSS_DISABLED | DSS_MONO)) );
Exit: if (hBmp) DeleteObject( hBmp ); if (hDCMem) DeleteDC( hDCMem ); }
/* D R A W B I T M A P P R O C */ /*------------------------------------------------------------------------------
Draw bitmap on button face
------------------------------------------------------------------------------*/ void CUIFButton::DrawBitmapProc( HDC hDC, const RECT *prc, BOOL fDown ) { const int nDownPad = fDown ? 1 : 0; const int nWidth = GetRectRef().right - GetRectRef().left; const int nHeight= GetRectRef().bottom - GetRectRef().top;
if (!m_hBmpMask) { CUIDrawState( hDC, NULL, NULL, (LPARAM)m_hBmp, 0, prc->left + nDownPad, prc->top + nDownPad, nWidth - nDownPad, nHeight - nDownPad, DST_BITMAP | (IsEnabled() ? 0 : DSS_DISABLED | DSS_MONO) ); } else { HBITMAP hBmp = CreateMaskBmp(&GetRectRef(), m_hBmp, m_hBmpMask, (HBRUSH)(COLOR_3DFACE + 1) , 0, 0); CUIDrawState( hDC, NULL, NULL, (LPARAM)hBmp, 0, prc->left + nDownPad, prc->top + nDownPad, nWidth - nDownPad, nHeight - nDownPad, DST_BITMAP | (IsEnabled() ? 0 : DSS_DISABLED | DSS_MONO) );
DeleteObject(hBmp); } }
/* S E T S T A T U S */ /*------------------------------------------------------------------------------
Set button status
------------------------------------------------------------------------------*/ void CUIFButton::SetStatus( DWORD dwStatus ) { if (dwStatus != m_dwStatus) { m_dwStatus = dwStatus; CallOnPaint(); } }
/* G E T T O G G L E S T A T E */ /*------------------------------------------------------------------------------
Get toggle status Returns TRUE when the button has been toggled.
------------------------------------------------------------------------------*/ BOOL CUIFButton::GetToggleState( void ) { return m_fToggled; }
/* S E T T O G G L E S T A T E */ /*------------------------------------------------------------------------------
Set toggle status
------------------------------------------------------------------------------*/ void CUIFButton::SetToggleState( BOOL fToggle ) { if ((m_dwStyle & UIBUTTON_TYPEMASK) == UIBUTTON_TOGGLE && m_fToggled != fToggle) { m_fToggled = fToggle; CallOnPaint(); } }
/* G E T T E X T S I Z E */ /*------------------------------------------------------------------------------
calc text width
------------------------------------------------------------------------------*/ void CUIFButton::GetTextSize( LPCWSTR pwch, SIZE *psize ) { HDC hDC = GetDC( NULL ); HFONT hFontOld = (HFONT)SelectObject( hDC, GetFont() );
Assert( pwch != NULL ); if (!m_fUseCustomFont && SUCCEEDED(EnsureThemeData(m_pUIWnd->GetWnd()))) { RECT rcText; GetThemeTextExtent( hDC,0 , pwch, StrLenW(pwch),0, NULL, &rcText); psize->cx = rcText.right; psize->cy = rcText.bottom;
} else { CUIGetTextExtentPoint32( hDC, pwch, StrLenW(pwch), psize ); }
//
// swap width and height
//
if (IsVertical()) { int nTemp = psize->cx; psize->cx = psize->cy; psize->cy = nTemp; }
SelectObject( hDC, hFontOld ); ReleaseDC( NULL, hDC ); }
/* G E T I C O N S I Z E */ /*------------------------------------------------------------------------------
get icon size
------------------------------------------------------------------------------*/ void CUIFButton::GetIconSize( HICON hIcon, SIZE *psize ) { ICONINFO IconInfo; BITMAP bmp; Assert( hIcon != NULL );
if (GetIconInfo( hIcon, &IconInfo )) { GetObject( IconInfo.hbmColor, sizeof(bmp), &bmp ); DeleteObject( IconInfo.hbmColor ); DeleteObject( IconInfo.hbmMask ); psize->cx = bmp.bmWidth; psize->cy = bmp.bmHeight; } else { psize->cx = GetSystemMetrics(SM_CXSMICON); psize->cy = GetSystemMetrics(SM_CYSMICON); } }
/* G E T B I T M A P S I Z E */ /*------------------------------------------------------------------------------
get bitmap size
------------------------------------------------------------------------------*/ void CUIFButton::GetBitmapSize( HBITMAP hBmp, SIZE *psize ) { BITMAP bmp; Assert( hBmp != NULL );
GetObject( hBmp, sizeof(bmp), &bmp ); psize->cx = bmp.bmWidth; psize->cy = bmp.bmHeight; }
/*=============================================================================*/ /* */ /* C U I F B U T T O N 2 */ /* */ /*=============================================================================*/
/* C U I F B U T T O N 2 */ /*------------------------------------------------------------------------------
Constructor of CUIFButton2
------------------------------------------------------------------------------*/ CUIFButton2::CUIFButton2( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFButton( pParent, dwID, prc, dwStyle ) { SetActiveTheme(L"TOOLBAR", TP_BUTTON, 0); }
/* ~ C U I F B U T T O N 2 */ /*------------------------------------------------------------------------------
Destructor of CUIFButton2
------------------------------------------------------------------------------*/ CUIFButton2::~CUIFButton2( void ) { CloseThemeData(); }
/*------------------------------------------------------------------------------
MakeDrawFlag
------------------------------------------------------------------------------*/ DWORD CUIFButton2::MakeDrawFlag() { DWORD dwState = 0; // make draw flag
dwState |= (m_fToggled) ? UIFDCS_SELECTED : 0; switch (m_dwStatus) { case UIBUTTON_DOWN: { dwState |= UIFDCS_MOUSEDOWN; break; }
case UIBUTTON_HOVER: case UIBUTTON_DOWNOUT: { dwState |= UIFDCS_MOUSEOVER; break; } } dwState |= IsEnabled() ? 0 : UIFDCS_DISABLED;
return dwState; }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of button object
------------------------------------------------------------------------------*/ BOOL CUIFButton2::OnPaintTheme( HDC hDC ) { DWORD dwState = 0; BOOL fRet = FALSE; SIZE sizeText = {0}; SIZE sizeImage = {0}; SIZE sizeFace = {0}; SIZE offset = {0}; RECT rcText = {0}; RECT rcImage = {0}; RECT rcFace = {0}; RECT rcContent = {0}; HFONT hFontOld = NULL; DWORD dwTextFlag = 0;
// make draw flag
dwState = MakeDrawFlag();
if (!CUIIsThemeActive()) { goto Exit; }
if (FAILED(EnsureThemeData( GetUIWnd()->GetWnd()))) goto Exit;
hFontOld = (HFONT)SelectObject( hDC, GetFont() );
int iStateID;
if (!IsEnabled()) { iStateID = TS_DISABLED; } else if (GetToggleState()) { iStateID = TS_CHECKED; } else if (m_dwStatus == UIBUTTON_DOWN) { iStateID = TS_PRESSED; } else if (m_dwStatus == UIBUTTON_HOVER) { iStateID = TS_HOT; } else { iStateID = TS_NORMAL; }
// if (FAILED(GetThemeBackgroundContentRect(hDC, iStateID, &GetRectRef(), &rcContent )))
// goto Exit;
rcContent = GetRectRef();
// calc face size
if (m_pwchText != NULL) { sizeText = m_sizeText; } if (m_hIcon != NULL) { sizeImage = m_sizeIcon; } else if (m_hBmp != NULL ) { sizeImage = m_sizeBmp; }
// alignment
if (!IsVertical()) { sizeFace.cx = sizeText.cx + sizeImage.cx + ((sizeText.cx != 0 && sizeImage.cx != 0) ? 2 : 0); sizeFace.cy = max( sizeText.cy, sizeImage.cy ); } else { sizeFace.cy = sizeText.cy + sizeImage.cy + ((sizeText.cy != 0 && sizeImage.cy != 0) ? 2 : 0); sizeFace.cx = max( sizeText.cx, sizeImage.cx ); }
switch (GetStyleBits( UIBUTTON_HALIGNMASK )) { case UIBUTTON_LEFT: default: { rcFace.left = rcContent.left + 2; rcFace.right = rcFace.left + sizeFace.cx; dwTextFlag = DT_LEFT; break; }
case UIBUTTON_CENTER: { rcFace.left = (rcContent.right + rcContent.left - sizeFace.cx) / 2; rcFace.right = rcFace.left + sizeFace.cx; dwTextFlag = DT_CENTER; break; }
case UIBUTTON_RIGHT: { rcFace.left = rcContent.right - 2 - sizeText.cx; rcFace.right = rcFace.left + sizeFace.cx; dwTextFlag = DT_RIGHT; break; } }
switch (GetStyleBits( UIBUTTON_VALIGNMASK )) { case UIBUTTON_TOP: default: { rcFace.top = rcContent.top + 2; rcFace.bottom = rcFace.top + sizeFace.cy; dwTextFlag = DT_TOP; break; }
case UIBUTTON_VCENTER: { rcFace.top = (rcContent.bottom + rcContent.top - sizeFace.cy) / 2; rcFace.bottom = rcFace.top + sizeFace.cy; dwTextFlag = DT_VCENTER; break; }
case UIBUTTON_BOTTOM: { rcFace.top = rcContent.bottom - 2 - sizeFace.cy; rcFace.bottom = rcFace.top + sizeFace.cy; dwTextFlag = DT_BOTTOM; break; } }
if (!IsVertical()) { rcImage.left = rcFace.left; rcImage.top = (rcFace.bottom + rcFace.top - sizeImage.cy) / 2; rcImage.right = rcImage.left + sizeImage.cx; rcImage.bottom = rcImage.top + sizeImage.cy;
rcText.left = rcFace.right - sizeText.cx; rcText.top = (rcFace.bottom + rcFace.top - sizeText.cy) / 2; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; } else { rcImage.left = (rcFace.right + rcFace.left - sizeImage.cx) / 2; rcImage.top = rcFace.top; rcImage.right = rcImage.left + sizeImage.cx; rcImage.bottom = rcImage.top + sizeImage.cy;
rcText.left = (rcFace.right + rcFace.left - sizeText.cx) / 2; rcText.top = rcFace.bottom - sizeText.cy; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; }
if (FAILED(DrawThemeBackground(hDC, iStateID, &GetRectRef(), 0 ))) goto Exit;
if (m_pwchText != NULL) { int cwch = StrLenW(m_pwchText); //
// DrawtThemeText() uses the font from theme so
// marlett font won't be used....
// We need to draw the text when a font is set.
//
if (m_fUseCustomFont) { COLORREF col; int xText; int yText;
if (FAILED(GetThemeColor(iStateID, TMT_TEXTCOLOR, &col))) { col = GetSysColor(COLOR_WINDOWTEXT); }
COLORREF colTextOld = GetTextColor( hDC ); int iBkModeOld = SetBkMode( hDC, TRANSPARENT );
xText = IsVertical() ? rcText.right : rcText.left; yText = rcText.top;
//
// we want to calc the marging correctly for theme.
// but somehow MSUTB's langbar is corrupted.
//
if (IsRTL()) xText -= 2;
#if 0
MARGINS marginsItem = {0}; GetThemeMargins(NULL, iStateID, TMT_CONTENTMARGINS, NULL, &marginsItem); xText += marginsItem.cxLeftWidth; yText += marginsItem.cxRightWidth; #endif
SetTextColor( hDC, col); CUIExtTextOut( hDC, xText, yText, ETO_CLIPPED, &rcText, m_pwchText, cwch, NULL );
SetTextColor( hDC, colTextOld ); SetBkMode( hDC, iBkModeOld ); } else { if (FAILED(DrawThemeText(hDC, iStateID, m_pwchText, cwch, dwTextFlag, 0, &rcText))) goto Exit; } }
if (m_hIcon != NULL) { if (FAILED(DrawThemeIcon(hDC, iStateID, &rcImage, m_hIcon.GetImageList(IsRTL()), m_hIcon.GetImageListId() ))) goto Exit;
} else if (m_hBmp != NULL) { //
// Draw Bitmap by ourselves.
//
DrawMaskBmpOnDC(hDC, &rcImage, m_hBmp, m_hBmpMask);
}
if (hFontOld) SelectObject( hDC, hFontOld );
fRet = TRUE;
Exit: return fRet; }
/* O N P A I N T D E F */ /*------------------------------------------------------------------------------
Paint procedure of button object
------------------------------------------------------------------------------*/ void CUIFButton2::OnPaintNoTheme( HDC hDC ) { DWORD dwState = 0; HDC hDCMem = NULL; HBITMAP hBmpMem = NULL; HBITMAP hBmpOld; SIZE size; RECT rc; SIZE sizeText = {0}; SIZE sizeImage = {0}; SIZE sizeFace = {0}; SIZE offset = {0}; RECT rcText = {0}; RECT rcImage = {0}; RECT rcFace = {0}; HFONT hFontOld;
if (!m_pUIFScheme) return;
// make draw flag
dwState = MakeDrawFlag();
// prepare memory dc
size.cx = GetRectRef().right - GetRectRef().left; size.cy = GetRectRef().bottom - GetRectRef().top;
hDCMem = CreateCompatibleDC( hDC ); if (!hDCMem) goto Exit;
hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy ); if (!hBmpMem) goto Exit;
hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem );
::SetRect( &rc, 0, 0, size.cx, size.cy ); hFontOld = (HFONT)SelectObject( hDCMem, GetFont() );
// calc face size
if (m_pwchText != NULL) { sizeText = m_sizeText; } if (m_hIcon != NULL) { sizeImage = m_sizeIcon; } else if (m_hBmp != NULL ) { sizeImage = m_sizeBmp; }
// alignment
if (!IsVertical()) { sizeFace.cx = sizeText.cx + sizeImage.cx + ((sizeText.cx != 0 && sizeImage.cx != 0) ? 2 : 0); sizeFace.cy = max( sizeText.cy, sizeImage.cy ); } else { sizeFace.cy = sizeText.cy + sizeImage.cy + ((sizeText.cy != 0 && sizeImage.cy != 0) ? 2 : 0); sizeFace.cx = max( sizeText.cx, sizeImage.cx ); }
switch (GetStyleBits( UIBUTTON_HALIGNMASK )) { case UIBUTTON_LEFT: default: { rcFace.left = rc.left + 2; rcFace.right = rcFace.left + sizeFace.cx; break; }
case UIBUTTON_CENTER: { rcFace.left = (rc.right + rc.left - sizeFace.cx) / 2; rcFace.right = rcFace.left + sizeFace.cx; break; }
case UIBUTTON_RIGHT: { rcFace.left = rc.right - 2 - sizeText.cx; rcFace.right = rcFace.left + sizeFace.cx; break; } }
switch (GetStyleBits( UIBUTTON_VALIGNMASK )) { case UIBUTTON_TOP: default: { rcFace.top = rc.top + 2; rcFace.bottom = rcFace.top + sizeFace.cy; break; }
case UIBUTTON_VCENTER: { rcFace.top = (rc.bottom + rc.top - sizeFace.cy) / 2; rcFace.bottom = rcFace.top + sizeFace.cy; break; }
case UIBUTTON_BOTTOM: { rcFace.top = rc.bottom - 2 - sizeFace.cy; rcFace.bottom = rcFace.top + sizeFace.cy; break; } }
m_pUIFScheme->GetCtrlFaceOffset( GetDCF(), dwState, &offset ); OffsetRect( &rcFace, offset.cx, offset.cy );
if (!IsVertical()) { rcImage.left = rcFace.left; rcImage.top = (rcFace.bottom + rcFace.top - sizeImage.cy) / 2; rcImage.right = rcImage.left + sizeImage.cx; rcImage.bottom = rcImage.top + sizeImage.cy;
rcText.left = rcFace.right - sizeText.cx; rcText.top = (rcFace.bottom + rcFace.top - sizeText.cy) / 2; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; } else { rcImage.left = (rcFace.right + rcFace.left - sizeImage.cx) / 2; rcImage.top = rcFace.top; rcImage.right = rcImage.left + sizeImage.cx; rcImage.bottom = rcImage.top + sizeImage.cy;
rcText.left = (rcFace.right + rcFace.left - sizeText.cx) / 2; rcText.top = rcFace.bottom - sizeText.cy; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; }
if (IsRTL()) m_pUIFScheme->SetLayout(LAYOUT_RTL);
// paint background
m_pUIFScheme->DrawCtrlBkgd( hDCMem, &rc, GetDCF(), dwState );
// paint face
if (m_pwchText != NULL) { m_pUIFScheme->DrawCtrlText( hDCMem, &rcText, m_pwchText, -1, dwState , IsVertical()); }
if (m_hIcon!= NULL) { m_pUIFScheme->DrawCtrlIcon( hDCMem, &rcImage, m_hIcon, dwState, &m_sizeIcon ); } else if (m_hBmp != NULL) { m_pUIFScheme->DrawCtrlBitmap( hDCMem, &rcImage, m_hBmp, m_hBmpMask, dwState ); }
if (IsRTL()) m_pUIFScheme->SetLayout(0);
// draw button edge
m_pUIFScheme->DrawCtrlEdge( hDCMem, &rc, GetDCF(), dwState );
//
BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, 0, 0, SRCCOPY );
SelectObject( hDCMem, hFontOld ); SelectObject( hDCMem, hBmpOld );
Exit: if (hBmpMem) DeleteObject( hBmpMem ); if (hDCMem) DeleteDC( hDCMem );
}
/*=============================================================================*/ /* */ /* C U I F S C R O L L */ /* */ /*=============================================================================*/
//
// CUIFScrollButton
//
/* C U I F S C R O L L B U T T O N */ /*------------------------------------------------------------------------------
Constructor of CUIFScrollButton
------------------------------------------------------------------------------*/ CUIFScrollButton::CUIFScrollButton( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFButton( pUIScroll, 0, prc, dwStyle ) { }
/* ~ C U I F S C R O L L B U T T O N */ /*------------------------------------------------------------------------------
Destructor of CUIFScrollButton
------------------------------------------------------------------------------*/ CUIFScrollButton::~CUIFScrollButton( void ) { }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnLButtonDown( POINT pt ) { CUIFButton::OnLButtonDown( pt );
// scroll one item
NotifyCommand( UISCROLLBUTTON_PRESSED, 0 );
// create time to auto-repeat
StartTimer( GetScrollDelay() ); }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnLButtonUp( POINT pt ) { CUIFButton::OnLButtonUp( pt );
// stop auto-repeat
if (IsTimer()) { EndTimer(); } }
/* O N M O U S E I N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnMouseIn( POINT pt ) { CUIFButton::OnMouseIn( pt );
if (IsCapture()) { // scroll one item when mouse is in
NotifyCommand( UISCROLLBUTTON_PRESSED, 0 );
// create timer to auto-repeat again
StartTimer( GetScrollSpeed() ); } }
/* O N M O U S E O U T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnMouseOut( POINT pt ) { CUIFButton::OnMouseOut( pt );
// kill timer to prevent from auto-repeat
if (IsTimer()) { EndTimer(); } }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of scroll button object
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnPaint( HDC hDC ) { RECT rc = GetRectRef(); UINT uState = 0;
switch (m_dwStyle & UISCROLLBUTTON_DIRMASK) { case UISCROLLBUTTON_LEFT: { uState = DFCS_SCROLLLEFT; break; }
case UISCROLLBUTTON_UP: { uState = DFCS_SCROLLUP; break; }
case UISCROLLBUTTON_RIGHT: { uState = DFCS_SCROLLRIGHT; break; }
case UISCROLLBUTTON_DOWN: { uState = DFCS_SCROLLDOWN; break; } }
uState |= ((m_dwStatus == UIBUTTON_DOWN) ? DFCS_PUSHED | DFCS_FLAT : 0); uState |= ((!IsEnabled()) ? DFCS_INACTIVE : 0);
DrawFrameControl( hDC, &rc, DFC_SCROLL, uState ); }
/* O N T I M E R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollButton::OnTimer( void ) { POINT pt;
StartTimer( GetScrollSpeed() );
GetCursorPos( &pt ); ScreenToClient( m_pUIWnd->GetWnd(), &pt );
if (PtInObject( pt )) { NotifyCommand( UISCROLLBUTTON_PRESSED, 0 ); } }
//
// CUIFScrollThumb
//
/* C U I F S C R O L L T H U M B */ /*------------------------------------------------------------------------------
Constructor of CUIFScrollThumb
------------------------------------------------------------------------------*/ CUIFScrollThumb::CUIFScrollThumb( CUIFScroll *pUIScroll, const RECT *prc, DWORD dwStyle ) : CUIFObject( pUIScroll, 0 /* no id */, prc, dwStyle ) { }
/* ~ C U I F S C R O L L T H U M B */ /*------------------------------------------------------------------------------
Destructor of CUIFScrollThumb
------------------------------------------------------------------------------*/ CUIFScrollThumb::~CUIFScrollThumb( void ) { }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of scroll thumb object
------------------------------------------------------------------------------*/ void CUIFScrollThumb::OnPaint(HDC hDC) { RECT rc = GetRectRef();
if (!IsEnabled()) { return; }
FillRect( hDC, &rc, (HBRUSH)(COLOR_3DFACE + 1) ); DrawEdge( hDC, &rc, EDGE_RAISED, BF_RECT ); }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollThumb::OnLButtonDown( POINT pt ) { if (IsEnabled()) { StartCapture();
m_ptDragOrg = pt; m_ptDrag.x = pt.x - GetRectRef().left; m_ptDrag.y = pt.y - GetRectRef().top; } }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollThumb::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); DragProc( pt, TRUE /* end of dragging */ ); } }
/* O N M O U S E M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScrollThumb::OnMouseMove( POINT pt ) { if (IsCapture()) { DragProc( pt, FALSE /* still dragging */ ); } }
/* S E T S C R O L L A R E A */ /*------------------------------------------------------------------------------
Set scroll area
------------------------------------------------------------------------------*/ void CUIFScrollThumb::SetScrollArea( RECT *prc ) { m_rcScrollArea = *prc; }
/* D R A G P R O C */ /*------------------------------------------------------------------------------
Handle mouse message while dragging Move the thumb and notify to the parent object (Scroll).
------------------------------------------------------------------------------*/ void CUIFScrollThumb::DragProc( POINT pt, BOOL fEndDrag ) { RECT rcValid;
// get valid drag area (TEMP code)
m_pParent->GetRect( &rcValid ); InflateRect( &rcValid, 64, 64 );
// check if drag point is valid
if (!PtInRect( &rcValid, pt )) { RECT rc;
// back to original position
rc.left = m_ptDragOrg.x - m_ptDrag.x; rc.top = m_ptDragOrg.y - m_ptDrag.y; rc.right = rc.left + (GetRectRef().right - GetRectRef().left); rc.bottom = rc.top + (GetRectRef().bottom - GetRectRef().top);
// move myself and notify to parent
SetRect( &rc ); NotifyCommand( UISCROLLTHUMB_MOVED, 0 ); } else { RECT rc;
// calc new thumb position
rc.left = pt.x - m_ptDrag.x; rc.top = pt.y - m_ptDrag.y; rc.right = rc.left + (GetRectRef().right - GetRectRef().left); rc.bottom = rc.top + (GetRectRef().bottom - GetRectRef().top); // adjust thumb position
if (rc.top < m_rcScrollArea.top) { rc.bottom += (m_rcScrollArea.top - rc.top); rc.top += (m_rcScrollArea.top - rc.top); } else if (m_rcScrollArea.bottom < rc.bottom) { rc.top += (m_rcScrollArea.bottom - rc.bottom); rc.bottom += (m_rcScrollArea.bottom - rc.bottom); } if (rc.left < m_rcScrollArea.left) { rc.right += (m_rcScrollArea.left - rc.left); rc.left += (m_rcScrollArea.left - rc.left); } else if (m_rcScrollArea.right < rc.right) { rc.left += (m_rcScrollArea.right - rc.right); rc.right += (m_rcScrollArea.right - rc.right); } // move myself and notify to parent
SetRect( &rc ); NotifyCommand( fEndDrag ? UISCROLLTHUMB_MOVED : UISCROLLTHUMB_MOVING, 0 ); } }
//
// CUIFScroll
//
/* C U I F S C R O L L */ /*------------------------------------------------------------------------------
Constructor of CUIFScroll
------------------------------------------------------------------------------*/ CUIFScroll::CUIFScroll( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_ScrollInfo.nMax = 0; m_ScrollInfo.nPage = 0; m_ScrollInfo.nPos = 0; m_fScrollPage = FALSE; m_dwScrollDir = UISCROLL_NONE;
// get metrics
GetMetrics(); }
/* ~ C U I F S C R O L L */ /*------------------------------------------------------------------------------
Destructor of CUIFScroll
------------------------------------------------------------------------------*/ CUIFScroll::~CUIFScroll( void ) { }
/* I N I T I A L I Z E */ /*------------------------------------------------------------------------------
Intialize scroll object
------------------------------------------------------------------------------*/ CUIFObject *CUIFScroll::Initialize( void ) { RECT rc;
// create child objects
GetBtnUpRect( &rc ); m_pBtnUp = new CUIFScrollButton( this, &rc, GetScrollUpBtnStyle() ); if (m_pBtnUp) { m_pBtnUp->Initialize(); AddUIObj( m_pBtnUp ); }
GetBtnDnRect( &rc ); m_pBtnDn = new CUIFScrollButton( this, &rc, GetScrollDnBtnStyle() ); if (m_pBtnDn) { m_pBtnDn->Initialize(); AddUIObj( m_pBtnDn ); }
GetThumbRect( &rc ); m_pThumb = new CUIFScrollThumb( this, &rc, GetScrollThumbStyle() ); if (m_pThumb) { m_pThumb->Initialize(); AddUIObj( m_pThumb ); //
GetScrollArea( &rc ); m_pThumb->SetScrollArea( &rc ); }
//
return CUIFObject::Initialize(); }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of scroll object
------------------------------------------------------------------------------*/ void CUIFScroll::OnPaint( HDC hDC ) { HBRUSH hBrush;
// paint scroll bar back
hBrush = (HBRUSH)DefWindowProc( m_pUIWnd->GetWnd(), WM_CTLCOLORSCROLLBAR, (WPARAM)hDC, (LPARAM)m_pUIWnd->GetWnd() ); if (hBrush == NULL) { // never happen? just in case...
hBrush = GetSysColorBrush(COLOR_SCROLLBAR); }
FillRect( hDC, &GetRectRef(), hBrush ); DeleteObject( hBrush );
// paint scroll area
if (m_fScrollPage) { RECT rc;
switch (m_dwScrollDir) { case UISCROLL_PAGEUP: { GetPageUpArea( &rc ); break; }
case UISCROLL_PAGEDOWN: { GetPageDnArea( &rc ); break; } } InvertRect( hDC, &rc ); } }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::OnLButtonDown( POINT pt ) { if (!m_pThumb->IsVisible()) { return; }
StartCapture(); if (PtInPageUpArea( pt )) { StartTimer( GetScrollDelay() ); m_fScrollPage = TRUE; m_dwScrollDir = UISCROLL_PAGEUP;
ShiftPage( -1 ); } else if (PtInPageDnArea( pt )) { StartTimer( GetScrollDelay() ); m_fScrollPage = TRUE; m_dwScrollDir = UISCROLL_PAGEDOWN;
ShiftPage( +1 ); } else { Assert( FALSE ); }
CallOnPaint(); }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); }
if (IsTimer()) { EndTimer(); }
m_fScrollPage = FALSE; m_dwScrollDir = UISCROLL_NONE; CallOnPaint(); }
/* O N M O U S E I N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::OnMouseIn( POINT pt ) { if (IsCapture()) { switch (m_dwScrollDir) { case UISCROLL_PAGEUP: { if (PtInPageUpArea( pt )) { StartTimer( GetScrollSpeed() ); m_fScrollPage = TRUE;
ShiftPage( -1 ); CallOnPaint(); } break; }
case UISCROLL_PAGEDOWN: { if (PtInPageDnArea( pt )) { StartTimer( GetScrollSpeed() ); m_fScrollPage = TRUE;
ShiftPage( +1 ); CallOnPaint(); } break; } } } }
/* O N M O U S E O U T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::OnMouseOut( POINT pt ) { m_fScrollPage = FALSE; if (IsTimer()) { EndTimer(); }
CallOnPaint(); }
/* S E T R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::SetRect( const RECT *prc ) { RECT rc; BOOL fThumbVisible;
CUIFObject::SetRect( prc );
// adjist child object poisition
GetBtnUpRect( &rc ); m_pBtnUp->SetRect( &rc );
GetBtnDnRect( &rc ); m_pBtnDn->SetRect( &rc );
GetScrollArea( &rc ); m_pThumb->SetScrollArea( &rc );
fThumbVisible = GetThumbRect( &rc ); m_pThumb->SetRect( &rc ); m_pThumb->Show( IsVisible() && fThumbVisible ); }
/* S E T S T Y L E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::SetStyle( DWORD dwStyle ) { RECT rc; BOOL fThumbVisible;
CUIFObject::SetStyle( dwStyle );
//
GetMetrics();
// update child object style
m_pBtnUp->SetStyle( GetScrollUpBtnStyle() ); m_pBtnDn->SetStyle( GetScrollDnBtnStyle() ); m_pThumb->SetStyle( GetScrollThumbStyle() );
// update child object poisition
GetBtnUpRect( &rc ); m_pBtnUp->SetRect( &rc );
GetBtnDnRect( &rc ); m_pBtnDn->SetRect( &rc );
GetScrollArea( &rc ); m_pThumb->SetScrollArea( &rc );
fThumbVisible = GetThumbRect( &rc ); m_pThumb->SetRect( &rc ); m_pThumb->Show( IsVisible() && fThumbVisible ); }
/* S H O W */ /*------------------------------------------------------------------------------
show/hide scroll bar
------------------------------------------------------------------------------*/ void CUIFScroll::Show( BOOL fShow ) { if (m_fVisible != fShow) { RECT rcThumb; BOOL fThumbVisible;
m_fVisible = fShow; fThumbVisible = GetThumbRect( &rcThumb );
m_pBtnUp->Show( fShow ); m_pBtnDn->Show( fShow ); m_pThumb->Show( fShow && fThumbVisible );
// let parent paint the object when it's hidden
if (!m_fVisible) { if (m_pParent != NULL) { m_pParent->CallOnPaint(); } } else { CallOnPaint(); } } }
/* O N T I M E R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::OnTimer( void ) { POINT pt;
StartTimer( GetScrollSpeed() );
GetCursorPos( &pt ); ScreenToClient( m_pUIWnd->GetWnd(), &pt );
switch (m_dwScrollDir) { case UISCROLL_PAGEUP: { if (PtInPageUpArea( pt )) { ShiftPage( -1 ); } break; }
case UISCROLL_PAGEDOWN: { if (PtInPageDnArea( pt )) { ShiftPage( +1 ); } break; } } }
/* S E T S C R O L L I N F O */ /*------------------------------------------------------------------------------
Set scrollbar info
------------------------------------------------------------------------------*/ void CUIFScroll::SetScrollInfo( UIFSCROLLINFO *pScrollInfo ) { BOOL fEnable;
Assert( pScrollInfo != NULL );
m_ScrollInfo.nMax = pScrollInfo->nMax; m_ScrollInfo.nPage = pScrollInfo->nPage;
// disable when cannot scroll
fEnable = (m_ScrollInfo.nMax > m_ScrollInfo.nPage);
Enable( fEnable ); m_pBtnUp->Enable( fEnable ); m_pBtnDn->Enable( fEnable ); m_pThumb->Enable( fEnable );
// clear scrolling page info
m_fScrollPage = FALSE; m_dwScrollDir = UISCROLL_NONE;
//
SetCurPos( pScrollInfo->nPos, TRUE /* adjust thumb position */ ); }
/* G E T S C R O L L I N F O */ /*------------------------------------------------------------------------------
Get scrollbar info
------------------------------------------------------------------------------*/ void CUIFScroll::GetScrollInfo( UIFSCROLLINFO *pScrollInfo ) { Assert( pScrollInfo != NULL );
*pScrollInfo = m_ScrollInfo; }
/* G E T T H U M B R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFScroll::GetThumbRect( RECT *prc ) { RECT rcScroll; BOOL fVisible;
// return FALSE when thumb is invisible
if (m_ScrollInfo.nMax <= 0 || m_ScrollInfo.nPage <= 0 || m_ScrollInfo.nMax <= m_ScrollInfo.nPage) { ::SetRect( prc, 0, 0, 0, 0 ); return FALSE; }
// calc thumb rect from current position
GetScrollArea( &rcScroll ); switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { int nThumbHeight = (rcScroll.bottom - rcScroll.top) * m_ScrollInfo.nPage / m_ScrollInfo.nMax; nThumbHeight = max( SCROLLTHUMBHEIGHT_MIN, nThumbHeight );
fVisible = (nThumbHeight <= (rcScroll.bottom - rcScroll.top));
prc->left = GetRectRef().left; prc->top = rcScroll.top + (rcScroll.bottom - rcScroll.top - nThumbHeight) * m_ScrollInfo.nPos / (m_ScrollInfo.nMax - m_ScrollInfo.nPage); prc->right = GetRectRef().right; prc->bottom = prc->top + nThumbHeight; break; }
case UISCROLL_VERTBT: { int nThumbHeight = (rcScroll.bottom - rcScroll.top) * m_ScrollInfo.nPage / m_ScrollInfo.nMax; nThumbHeight = max( SCROLLTHUMBHEIGHT_MIN, nThumbHeight );
fVisible = (nThumbHeight <= (rcScroll.bottom - rcScroll.top));
prc->left = GetRectRef().left; prc->top = rcScroll.bottom - (rcScroll.bottom - rcScroll.top - nThumbHeight) * m_ScrollInfo.nPos / (m_ScrollInfo.nMax - m_ScrollInfo.nPage) - nThumbHeight; prc->right = GetRectRef().right; prc->bottom = prc->top + nThumbHeight; break; }
case UISCROLL_HORZLR: { int nThumbWidth = (rcScroll.right - rcScroll.left) * m_ScrollInfo.nPage / m_ScrollInfo.nMax; nThumbWidth = max( SCROLLTHUMBHEIGHT_MIN, nThumbWidth );
fVisible = (nThumbWidth <= (rcScroll.right - rcScroll.left));
prc->left = rcScroll.left + (rcScroll.right - rcScroll.left - nThumbWidth) * m_ScrollInfo.nPos / (m_ScrollInfo.nMax - m_ScrollInfo.nPage); prc->top = GetRectRef().top; prc->right = prc->left + nThumbWidth; prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_HORZRL: { int nThumbWidth = (rcScroll.right - rcScroll.left) * m_ScrollInfo.nPage / m_ScrollInfo.nMax; nThumbWidth = max( SCROLLTHUMBHEIGHT_MIN, nThumbWidth );
fVisible = (nThumbWidth <= (rcScroll.right - rcScroll.left));
prc->left = rcScroll.right - (rcScroll.right - rcScroll.left - nThumbWidth) * m_ScrollInfo.nPos / (m_ScrollInfo.nMax - m_ScrollInfo.nPage) - nThumbWidth; prc->top = GetRectRef().top; prc->right = prc->left + nThumbWidth; prc->bottom = GetRectRef().bottom; break; } }
return fVisible; }
/* G E T B T N U P R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFScroll::GetBtnUpRect( RECT *prc ) { switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { prc->left = GetRectRef().left; prc->top = GetRectRef().top; prc->right = GetRectRef().right; prc->bottom = GetRectRef().top + min( m_sizeScrollBtn.cy, (GetRectRef().bottom - GetRectRef().top)/2 ); break; }
case UISCROLL_VERTBT: { prc->left = GetRectRef().left; prc->top = GetRectRef().bottom - min( m_sizeScrollBtn.cy, (GetRectRef().bottom - GetRectRef().top)/2 ); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_HORZLR: { prc->left = GetRectRef().left; prc->top = GetRectRef().top; prc->right = GetRectRef().left + min( m_sizeScrollBtn.cx, (GetRectRef().right - GetRectRef().left)/2 ); prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_HORZRL: { prc->left = GetRectRef().right - min( m_sizeScrollBtn.cx, (GetRectRef().right - GetRectRef().left)/2 ); prc->top = GetRectRef().top; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; } }
return TRUE; }
/* G E T B T N D N R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFScroll::GetBtnDnRect( RECT *prc ) { switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { prc->left = GetRectRef().left; prc->top = GetRectRef().bottom - min( m_sizeScrollBtn.cy, (GetRectRef().bottom - GetRectRef().top)/2 ); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_VERTBT: { prc->left = GetRectRef().left; prc->top = GetRectRef().top; prc->right = GetRectRef().right; prc->bottom = GetRectRef().top + min( m_sizeScrollBtn.cy, (GetRectRef().bottom - GetRectRef().top)/2 ); break; }
case UISCROLL_HORZLR: { prc->left = GetRectRef().right - min( m_sizeScrollBtn.cx, (GetRectRef().right - GetRectRef().left)/2 ); prc->top = GetRectRef().top; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_HORZRL: { prc->left = GetRectRef().left; prc->top = GetRectRef().top; prc->right = GetRectRef().left + min( m_sizeScrollBtn.cx, (GetRectRef().right - GetRectRef().left)/2 ); prc->bottom = GetRectRef().bottom; break; } }
return TRUE; }
/* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ LRESULT CUIFScroll::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { if (pUIObj == m_pBtnUp) { switch (dwCommand) { case UISCROLLBUTTON_PRESSED: { if (NotifyCommand( UISCROLLNOTIFY_SCROLLLN, -1 ) == 0) { ShiftLine( -1 ); } break; } } } else if (pUIObj == m_pBtnDn) { switch (dwCommand) { case UISCROLLBUTTON_PRESSED: { if (NotifyCommand( UISCROLLNOTIFY_SCROLLLN, +1 ) == 0) { ShiftLine( +1 ); } break; } } } else if (pUIObj == m_pThumb) { switch (dwCommand) { case UISCROLLTHUMB_MOVING: case UISCROLLTHUMB_MOVED: { RECT rcThumb; RECT rcScroll; int nPos; int nPosMax; int ptThumb; int ptMax;
m_pThumb->GetRect( &rcThumb ); GetScrollArea( &rcScroll );
nPosMax = m_ScrollInfo.nMax - m_ScrollInfo.nPage; switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { ptThumb = rcThumb.top - rcScroll.top; ptMax = (rcScroll.bottom - rcScroll.top) - (rcThumb.bottom - rcThumb.top); break; } case UISCROLL_VERTBT: { ptThumb = rcScroll.bottom - rcThumb.bottom; ptMax = (rcScroll.bottom - rcScroll.top) - (rcThumb.bottom - rcThumb.top); break; } case UISCROLL_HORZLR: { ptThumb = rcThumb.left - rcScroll.left; ptMax = (rcScroll.right - rcScroll.left) - (rcThumb.right - rcThumb.left); break; } case UISCROLL_HORZRL: { ptThumb = rcScroll.right - rcThumb.right; ptMax = (rcScroll.right - rcScroll.left) - (rcThumb.right - rcThumb.left); break; } }
Assert( (0 <= ptThumb) && (ptThumb <= ptMax) ); if (ptMax == 0) { nPos = 0; } else { nPos = (ptThumb * nPosMax + ptMax/2) / ptMax; nPos = max( nPos, 0 ); nPos = min( nPos, nPosMax ); }
SetCurPos( nPos, (dwCommand == UISCROLLTHUMB_MOVED) /* adjust thumb position */ ); break; } } /* of switch */ }
return 0; }
/* S E T C U R P O S */ /*------------------------------------------------------------------------------
Set current page position
------------------------------------------------------------------------------*/ void CUIFScroll::SetCurPos( int nPos, BOOL fAdjustThumbPos ) { int nPosMax = (m_ScrollInfo.nMax <= m_ScrollInfo.nPage) ? 0 : m_ScrollInfo.nMax - m_ScrollInfo.nPage;
// set position
nPosMax = m_ScrollInfo.nMax - m_ScrollInfo.nPage; nPos = min( nPos, nPosMax ); nPos = max( nPos, 0 );
m_ScrollInfo.nPos = nPos;
// set thumb position
if (fAdjustThumbPos) { RECT rcThumb; BOOL fThumbVisible;
fThumbVisible = GetThumbRect( &rcThumb ); m_pThumb->SetRect( &rcThumb ); m_pThumb->Show( IsVisible() && fThumbVisible ); }
if (IsVisible()) { CallOnPaint(); }
// notify scroll to parent
NotifyCommand( UISCROLLNOTIFY_SCROLLED, m_ScrollInfo.nPos ); }
/* G E T S C R O L L A R E A */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::GetScrollArea( RECT *prc ) { RECT rcBtnUp; RECT rcBtnDn;
Assert( prc != NULL );
GetBtnUpRect( &rcBtnUp ); GetBtnDnRect( &rcBtnDn ); switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { prc->left = GetRectRef().left; prc->top = GetRectRef().top + (rcBtnUp.bottom - rcBtnUp.top); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - (rcBtnDn.bottom - rcBtnDn.top); break; }
case UISCROLL_VERTBT: { prc->left = GetRectRef().left; prc->top = GetRectRef().top + (rcBtnDn.bottom - rcBtnDn.top); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - (rcBtnUp.bottom - rcBtnUp.top); break; }
case UISCROLL_HORZLR: { prc->left = GetRectRef().left + (rcBtnUp.bottom - rcBtnUp.top); prc->top = GetRectRef().top; prc->right = GetRectRef().right - (rcBtnDn.bottom - rcBtnDn.top); prc->bottom = GetRectRef().bottom; break; }
case UISCROLL_HORZRL: { prc->left = GetRectRef().left + (rcBtnDn.bottom - rcBtnDn.top); prc->top = GetRectRef().top; prc->right = GetRectRef().right - (rcBtnUp.bottom - rcBtnUp.top); prc->bottom = GetRectRef().bottom; break; } } }
/* G E T P A G E U P A R E A */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::GetPageUpArea( RECT *prc ) { RECT rcThumb; RECT rcBtnUp;
Assert( prc != NULL );
m_pThumb->GetRect( &rcThumb ); GetBtnUpRect( &rcBtnUp ); switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { prc->left = GetRectRef().left; prc->top = GetRectRef().top + (rcBtnUp.bottom - rcBtnUp.top); prc->right = GetRectRef().right; prc->bottom = rcThumb.top; break; }
case UISCROLL_VERTBT: { prc->left = GetRectRef().left; prc->top = rcThumb.bottom; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - (rcBtnUp.bottom - rcBtnUp.top); break; }
case UISCROLL_HORZLR: { prc->left = GetRectRef().left + (rcBtnUp.bottom - rcBtnUp.top); prc->top = GetRectRef().top;; prc->right = rcThumb.left; prc->bottom = GetRectRef().bottom;; break; }
case UISCROLL_HORZRL: { prc->left = rcThumb.right; prc->top = GetRectRef().top; prc->right = GetRectRef().right - (rcBtnUp.bottom - rcBtnUp.top); prc->bottom = GetRectRef().bottom;; break; } } }
/* G E T P A G E D N A R E A */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::GetPageDnArea( RECT *prc ) { RECT rcThumb; RECT rcBtnDn;
Assert( prc != NULL );
m_pThumb->GetRect( &rcThumb ); GetBtnDnRect( &rcBtnDn ); switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { prc->left = GetRectRef().left; prc->top = rcThumb.bottom; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - (rcBtnDn.bottom - rcBtnDn.top); break; }
case UISCROLL_VERTBT: { prc->left = GetRectRef().left; prc->top = GetRectRef().top + (rcBtnDn.bottom - rcBtnDn.top); prc->right = GetRectRef().right; prc->bottom = rcThumb.top; break; }
case UISCROLL_HORZLR: { prc->left = rcThumb.right; prc->top = GetRectRef().top; prc->right = GetRectRef().right - (rcBtnDn.bottom - rcBtnDn.top); prc->bottom = GetRectRef().bottom;; break; }
case UISCROLL_HORZRL: { prc->left = GetRectRef().left + (rcBtnDn.bottom - rcBtnDn.top) ; prc->top = GetRectRef().top; prc->right = rcThumb.left; prc->bottom = GetRectRef().bottom;; break; } } }
/* G E T S C R O L L T H U M B S T Y L E */ /*------------------------------------------------------------------------------
Get style of scroll thumb
------------------------------------------------------------------------------*/ DWORD CUIFScroll::GetScrollThumbStyle( void ) { return 0; }
/* G E T S C R O L L U P B T N S T Y L E */ /*------------------------------------------------------------------------------
Get style of scroll up button
------------------------------------------------------------------------------*/ DWORD CUIFScroll::GetScrollUpBtnStyle( void ) { DWORD dwStyle = 0;
switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { dwStyle = UISCROLLBUTTON_UP; break; }
case UISCROLL_VERTBT: { dwStyle = UISCROLLBUTTON_DOWN; break; }
case UISCROLL_HORZLR: { dwStyle = UISCROLLBUTTON_LEFT; break; }
case UISCROLL_HORZRL: { dwStyle = UISCROLLBUTTON_RIGHT; break; } }
return dwStyle; }
/* G E T S C R O L L D N B T N S T Y L E */ /*------------------------------------------------------------------------------
Get style of scroll down button
------------------------------------------------------------------------------*/ DWORD CUIFScroll::GetScrollDnBtnStyle( void ) { DWORD dwStyle = 0;
switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: { dwStyle = UISCROLLBUTTON_DOWN; break; }
case UISCROLL_VERTBT: { dwStyle = UISCROLLBUTTON_UP; break; }
case UISCROLL_HORZLR: { dwStyle = UISCROLLBUTTON_RIGHT; break; }
case UISCROLL_HORZRL: { dwStyle = UISCROLLBUTTON_LEFT; break; } }
return dwStyle; }
/* G E T M E T R I C S */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFScroll::GetMetrics( void ) { switch (m_dwStyle & UISCROLL_DIRMASK) { default: case UISCROLL_VERTTB: case UISCROLL_VERTBT: { m_sizeScrollBtn.cx = GetSystemMetrics( SM_CXVSCROLL ); m_sizeScrollBtn.cy = GetSystemMetrics( SM_CYVSCROLL ); break; }
case UISCROLL_HORZLR: case UISCROLL_HORZRL: { m_sizeScrollBtn.cx = GetSystemMetrics( SM_CXHSCROLL ); m_sizeScrollBtn.cy = GetSystemMetrics( SM_CYHSCROLL ); break; } } }
/*=============================================================================*/ /* */ /* C U I F L I S T B A S E */ /* */ /*=============================================================================*/
//
// CUIFListBase
//
/* C U I F L I S T B A S E */ /*------------------------------------------------------------------------------
Constructor of CUIFListBase
------------------------------------------------------------------------------*/ CUIFListBase::CUIFListBase( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, dwID, prc, dwStyle ) { m_nItem = 0; m_nLineHeight = GetFontHeight(); m_nItemVisible = 0; m_iItemTop = 0; m_iItemSelect = 0; }
/* ~ C U I F L I S T B A S E */ /*------------------------------------------------------------------------------
Destructor of CUIFListBase
------------------------------------------------------------------------------*/ CUIFListBase::~CUIFListBase( void ) { CListItemBase *pItem;
while ((pItem = m_listItem.GetFirst()) != NULL) { m_listItem.Remove(pItem); delete pItem; m_nItem--; }
Assert( m_nItem == 0 ); }
/* I N I T I A L I Z E */ /*------------------------------------------------------------------------------
Initialize list object
------------------------------------------------------------------------------*/ CUIFObject *CUIFListBase::Initialize( void ) { RECT rcScroll;
// create scrollbar
GetScrollBarRect( &rcScroll ); m_pUIScroll = CreateScrollBarObj( this, 0, &rcScroll, GetScrollBarStyle() ); m_pUIScroll->Initialize(); AddUIObj( m_pUIScroll );
// calc visible item count
CalcVisibleCount();
// initialize scrollbar
UpdateScrollBar();
//
return CUIFObject::Initialize(); }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of list object
------------------------------------------------------------------------------*/ void CUIFListBase::OnPaint( HDC hDC ) { int iLine; HFONT hFontOld = (HFONT)SelectObject( hDC, m_hFont );
for (iLine = 0; iLine < m_nItemVisible + 1; iLine++) { CListItemBase *pItem; int iItem = m_iItemTop + iLine; RECT rc;
pItem = GetItem( iItem ); if (pItem != NULL) { GetLineRect( iLine, &rc ); if (!IsRectEmpty( &rc )) { PaintItemProc( hDC, &rc, pItem, (iItem == m_iItemSelect) ); } } }
SelectObject( hDC, hFontOld ); }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::OnLButtonDown( POINT pt ) { int iItemSelNew = ListItemFromPoint( pt );
if (iItemSelNew != -1) { SetSelection( iItemSelNew, TRUE ); }
StartCapture(); StartTimer( 100 ); // TEMP
}
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::OnLButtonUp( POINT pt ) { BOOL fSelected = FALSE;
if (IsCapture()) { int iItemSelNew = ListItemFromPoint( pt );
if (iItemSelNew != -1) { SetSelection( iItemSelNew, TRUE ); } EndCapture();
fSelected = (PtInObject( pt ) && iItemSelNew != -1); }
if (IsTimer()) { EndTimer(); }
// notify
if (fSelected) { NotifyCommand( UILIST_SELECTED, m_iItemSelect ); } }
/* O N M O U S E M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::OnMouseMove( POINT pt ) { if (IsCapture()) { int iItemSelNew = ListItemFromPoint( pt );
if (iItemSelNew != -1) { SetSelection( iItemSelNew, TRUE ); } } }
/* O N T I M E R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::OnTimer( void ) { POINT pt;
if (!IsCapture()) { return; }
GetCursorPos( &pt ); ScreenToClient( m_pUIWnd->GetWnd(), &pt );
if (!PtInObject( pt )) { switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { if (pt.y < GetRectRef().top) { // scroll up
SetSelection( m_iItemSelect - 1, TRUE ); } else if (GetRectRef().bottom <= pt.y) { // scroll down
SetSelection( m_iItemSelect + 1, TRUE ); } break; }
case UILIST_HORZBT: { if (pt.y < GetRectRef().top) { // scroll down
SetSelection( m_iItemSelect + 1, TRUE ); } else if (GetRectRef().bottom <= pt.y) { // scroll up
SetSelection( m_iItemSelect - 1, TRUE ); } break; }
case UILIST_VERTLR: { if (GetRectRef().right <= pt.x) { // scroll down
SetSelection( m_iItemSelect + 1, TRUE ); } else if (pt.x < GetRectRef().left) { // scroll up
SetSelection( m_iItemSelect - 1, TRUE ); } break; }
case UILIST_VERTRL: { if (GetRectRef().right <= pt.x) { // scroll up
SetSelection( m_iItemSelect - 1, TRUE ); } else if (pt.x < GetRectRef().left) { // scroll down
SetSelection( m_iItemSelect + 1, TRUE ); } break; } } } }
/* S E T R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::SetRect( const RECT *prc ) { RECT rcScroll;
CUIFObject::SetRect( prc );
// set scrollbar position
GetScrollBarRect( &rcScroll ); m_pUIScroll->SetRect( &rcScroll );
// calc visible item count
CalcVisibleCount();
// update scrollbar
UpdateScrollBar(); }
/* S E T S T Y L E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::SetStyle( DWORD dwStyle ) { RECT rcScroll;
CUIFObject::SetStyle( dwStyle );
// change scroll bar style either
m_pUIScroll->SetStyle( GetScrollBarStyle() );
// set scrollbar position
GetScrollBarRect( &rcScroll ); m_pUIScroll->SetRect( &rcScroll );
// calc visible item count
CalcVisibleCount();
// update scrollbar
UpdateScrollBar(); }
/* O N O B J E C T N O T I F Y */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ LRESULT CUIFListBase::OnObjectNotify( CUIFObject *pUIObj, DWORD dwCommand, LPARAM lParam ) { LRESULT lResult = 0; if (pUIObj == m_pUIScroll) { switch (dwCommand) { case UISCROLLNOTIFY_SCROLLED: { int nCur = (int)lParam; int iItemTop;
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) == 0) { // fixed height
iItemTop = nCur; } else { int nItemPos = 0; int nItemHeight;
// variable height
for (iItemTop = 0; iItemTop < m_nItem; iItemTop++) { nItemHeight = GetItemHeight( iItemTop );
if (nCur < nItemPos + nItemHeight/2) { break; } nItemPos += nItemHeight; }
}
SetTop( iItemTop, FALSE ); break; }
case UISCROLLNOTIFY_SCROLLLN: { SetTop((int)(GetTop() + lParam), TRUE );
lResult = 1; /* processed */ break; } } }
return lResult; }
/* A D D I T E M */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::AddItem( CListItemBase *pItem ) { int iItem = m_nItem;
// add to list
//
// -1 is error code for CUIFList::AddString()
//
if (!m_listItem.Add( pItem )) return -1;
m_nItem++;
// calc visible item count
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) != 0) { CalcVisibleCount(); }
// update scrollbar
UpdateScrollBar();
// update window
CallOnPaint();
return iItem; }
/* G E T C O U N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetCount( void ) { return m_nItem; }
/* G E T I T E M */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CListItemBase *CUIFListBase::GetItem( int iItem ) { if (0 <= iItem && iItem < m_nItem) { return m_listItem.Get( iItem ); }
return NULL; }
/* D E L I T E M */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::DelItem( int iItem ) { CListItemBase *pItem;
pItem = GetItem( iItem ); if (pItem != NULL) { // delete item
m_listItem.Remove(pItem); delete pItem; m_nItem--;
// calc visible item count
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) != 0) { CalcVisibleCount(); }
// update scrollbar
UpdateScrollBar();
// update window
CallOnPaint(); } }
/* D E L A L L I T E M */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::DelAllItem( void ) { CListItemBase *pItem;
while ((pItem = m_listItem.GetFirst()) != NULL) { m_listItem.Remove(pItem); delete pItem; m_nItem--; } Assert( m_nItem == 0 );
m_iItemTop = 0; m_iItemSelect = 0;
// calc visible item count
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) != 0) { CalcVisibleCount(); }
// update scrollbar
UpdateScrollBar();
// update window
CallOnPaint(); }
/* S E T S E L E C T I O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::SetSelection( int iSelection, BOOL fRedraw ) { BOOL fNotify;
if (iSelection < -1 || m_nItem <= iSelection) { return; }
fNotify = (iSelection != m_iItemSelect) && iSelection != -1 && m_iItemSelect != -1; m_iItemSelect = iSelection;
// make the selection visible always
int iItemTop = GetTop(); int iItemBottom = GetBottom();
if (m_iItemSelect < iItemTop) { SetTop( m_iItemSelect, TRUE ); } else if (iItemBottom < m_iItemSelect) { if ((m_dwStyle & UILIST_VARIABLEHEIGHT) == 0) { // fixed height
SetTop( m_iItemSelect - m_nItemVisible + 1, TRUE ); } else { int nHeight = GetListHeight(); int nItemShift; int ptBottom; int i;
// variable height
ptBottom = 0; for (i = iItemTop; i <= m_iItemSelect; i++) { ptBottom += GetItemHeight( i ); }
// find number of items to shift
nItemShift = 0; while (nHeight < ptBottom && (iItemTop + nItemShift) < m_iItemSelect) { ptBottom -= GetItemHeight( iItemTop + nItemShift ); nItemShift++; }
// set new top
SetTop( iItemTop + nItemShift, TRUE ); } }
if (fRedraw) { CallOnPaint(); }
if (fNotify) { NotifyCommand( UILIST_SELCHANGED, m_iItemSelect ); } }
/* C L E A R S E L E C T I O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::ClearSelection( BOOL fRedraw ) { if (m_iItemSelect != -1) { m_iItemSelect = -1;
if (fRedraw) { CallOnPaint(); }
NotifyCommand( UILIST_SELCHANGED, m_iItemSelect ); } }
/* S E T L I N E H E I G H T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::SetLineHeight( int nLineHeight ) { m_nLineHeight = nLineHeight;
// calc visible item count
CalcVisibleCount();
// update scrollbar
UpdateScrollBar();
// update window
CallOnPaint(); }
/* S E T T O P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::SetTop( int nTop, BOOL fSetScrollPos ) { nTop = min( nTop, m_nItem ); nTop = max( nTop, 0 );
if (m_iItemTop != nTop) { m_iItemTop = nTop;
// calc visible count
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) != 0) { CalcVisibleCount(); }
CallOnPaint();
if (fSetScrollPos) { // update scrollbar
UpdateScrollBar(); } } }
/* G E T S E L E C T I O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetSelection( void ) { return m_iItemSelect; }
/* G E T L I N E H E I G H T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetLineHeight( void ) { return m_nLineHeight; }
/* G E T T O P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetTop( void ) { return m_iItemTop; }
/* G E T B O T T O M */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetBottom( void ) { return m_iItemTop + m_nItemVisible - 1; }
/* G E T V I S I B L E C O U N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetVisibleCount( void ) { return m_nItemVisible; }
/* G E T I T E M H E I G H T */ /*------------------------------------------------------------------------------
(only called in UILIST_VARIABLEHEIGHT)
------------------------------------------------------------------------------*/ int CUIFListBase::GetItemHeight( int iItem ) { return m_nLineHeight; }
/* G E T L I S T H E I G H T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::GetListHeight( void ) { int nHeight;
switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { nHeight = GetRectRef().bottom - GetRectRef().top; break; }
case UILIST_VERTLR: case UILIST_VERTRL: { nHeight = GetRectRef().right - GetRectRef().left; break; } }
return nHeight; }
/* G E T L I N E R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::GetLineRect( int iLine, RECT *prc ) { int pxyItem = 0; int cxyItem = 0;
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) == 0) { // fixed height
cxyItem = GetLineHeight(); pxyItem = iLine * cxyItem; } else { int i;
// variable height
for (i = 0; i <= iLine; i++) { pxyItem += cxyItem; cxyItem = GetItemHeight( m_iItemTop + i ); } }
switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { prc->left = GetRectRef().left; prc->top = GetRectRef().top + pxyItem; prc->right = GetRectRef().right; prc->bottom = GetRectRef().top + (pxyItem + cxyItem); break; }
case UILIST_HORZBT: { prc->left = GetRectRef().left; prc->top = GetRectRef().bottom - (pxyItem + cxyItem); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom - pxyItem; break; }
case UILIST_VERTLR: { prc->left = GetRectRef().left + pxyItem; prc->top = GetRectRef().top; prc->right = GetRectRef().left + (pxyItem + cxyItem); prc->bottom = GetRectRef().bottom; break; }
case UILIST_VERTRL: { prc->left = GetRectRef().right - (pxyItem + cxyItem); prc->top = GetRectRef().top; prc->right = GetRectRef().right - pxyItem; prc->bottom = GetRectRef().bottom; break; } }
// exclude scrollbar
if (m_pUIScroll != NULL && m_pUIScroll->IsVisible()) { RECT rcScroll;
m_pUIScroll->GetRect( &rcScroll );
switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { prc->right = min( prc->right, rcScroll.left ); break; }
case UILIST_VERTLR: case UILIST_VERTRL: { prc->bottom = max( prc->bottom, rcScroll.top ); break; } } }
// clip
IntersectRect( prc, prc, &GetRectRef() ); }
/* G E T S C R O L L B A R R E C T */ /*------------------------------------------------------------------------------
Get scrollbar position
------------------------------------------------------------------------------*/ void CUIFListBase::GetScrollBarRect( RECT *prc ) { Assert( prc != NULL );
switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: case UILIST_HORZBT: { prc->left = GetRectRef().right - GetSystemMetrics(SM_CXVSCROLL); prc->top = GetRectRef().top; prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; }
case UILIST_VERTLR: case UILIST_VERTRL: { prc->left = GetRectRef().left; prc->top = GetRectRef().bottom - GetSystemMetrics(SM_CYHSCROLL); prc->right = GetRectRef().right; prc->bottom = GetRectRef().bottom; break; } } }
/* G E T S C R O L L B A R S T Y L E */ /*------------------------------------------------------------------------------
Get scrollbar style
------------------------------------------------------------------------------*/ DWORD CUIFListBase::GetScrollBarStyle( void ) { DWORD dwScrollStyle;
switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { dwScrollStyle = UISCROLL_VERTTB; break; }
case UILIST_HORZBT: { dwScrollStyle = UISCROLL_VERTBT; break; }
case UILIST_VERTLR: { dwScrollStyle = UISCROLL_HORZLR; break; }
case UILIST_VERTRL: { dwScrollStyle = UISCROLL_HORZRL; break; } } return dwScrollStyle; }
/* C R E A T E S C R O L L B A R O B J */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CUIFScroll *CUIFListBase::CreateScrollBarObj( CUIFObject *pParent, DWORD dwID, RECT *prc, DWORD dwStyle ) { return new CUIFScroll( pParent, dwID, prc, dwStyle ); }
/* P A I N T I T E M P R O C */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFListBase::PaintItemProc( HDC hDC, RECT *prc, CListItemBase *pItem, BOOL fSelected ) { COLORREF colText; COLORREF colBack;
Assert( pItem != NULL );
// set color
if (fSelected) { colText = GetSysColor(COLOR_HIGHLIGHTTEXT); colBack = GetSysColor(COLOR_HIGHLIGHT); } else { colText = GetSysColor(COLOR_WINDOWTEXT); colBack = GetSysColor(COLOR_3DFACE); }
SetTextColor( hDC, colText ); SetBkColor( hDC, colBack );
//
CUIExtTextOut( hDC, prc->left, prc->top, ETO_OPAQUE | ETO_CLIPPED, prc, L"", 0, NULL ); }
/* L I S T I T E M F R O M P O I N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFListBase::ListItemFromPoint( POINT pt ) { if (PtInObject( pt )) { int iLine; RECT rc;
for (iLine = 0; iLine < m_nItemVisible + 1; iLine++) { if (m_nItem <= m_iItemTop + iLine) { break; }
GetLineRect( iLine, &rc ); if (PtInRect( &rc, pt )) { return iLine + m_iItemTop; } } }
return (-1); }
/* C A L C V I S I B L E C O U N T */ /*------------------------------------------------------------------------------
Calculate number of visible item
------------------------------------------------------------------------------*/ void CUIFListBase::CalcVisibleCount( void ) { int nHeight = GetListHeight();
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) == 0) { // fixed height
if (m_nLineHeight <= 0) { m_nItemVisible = 0; } else { m_nItemVisible = nHeight / m_nLineHeight; } } else { // variable height
if (0 < m_nItem) { int i = m_iItemTop;
// count visible item
m_nItemVisible = 0; while (0 < nHeight && i < m_nItem) { nHeight -= GetItemHeight( i ); m_nItemVisible++; i++; }
// adjustment
if (0 < nHeight && m_nItemVisible == 0) { // at least, one item is visible
m_nItemVisible = 1; } else if (nHeight < 0 && 1 < m_nItemVisible) { // exclude last item if clipped
m_nItemVisible--; } } else { m_nItemVisible = 0; } } }
/* U P D A T E S C R O L L B A R */ /*------------------------------------------------------------------------------
Update scrollbar range and visible status
------------------------------------------------------------------------------*/ void CUIFListBase::UpdateScrollBar( void ) { UIFSCROLLINFO ScrollInfo;
Assert( m_pUIScroll != NULL );
// set scroll range/current pos
if ((m_dwStyle & UILIST_VARIABLEHEIGHT) == 0) { // fixed height
ScrollInfo.nMax = m_nItem; ScrollInfo.nPage = m_nItemVisible; ScrollInfo.nPos = m_iItemTop; } else { int nTotal = 0; int nTop = 0; int nVisible = 0; int i;
// variable height
nVisible = GetListHeight(); for (i = 0; i < m_nItem; i++) { int nItemHeight = GetItemHeight( i );
if (i < m_iItemTop) { nTop += nItemHeight; }
nTotal += nItemHeight; }
// adjust gap at the end of list
if (nVisible < nTotal) { int nLastPage = 0;
for (i = m_nItem-1; 0 <= i; i--) { int nItemHeight = GetItemHeight( i );
if (nVisible < nLastPage + nItemHeight) { break; } nLastPage += nItemHeight; }
if (0 < nLastPage && nLastPage < nVisible) { nTotal += (nVisible - nLastPage); } }
ScrollInfo.nMax = nTotal; ScrollInfo.nPage = nVisible; ScrollInfo.nPos = nTop; } m_pUIScroll->SetScrollInfo( &ScrollInfo );
// show/hide scroll bar
if ((m_dwStyle & UILIST_DISABLENOSCROLL) == 0) { m_pUIScroll->Show( ScrollInfo.nPage < ScrollInfo.nMax ); } }
/*=============================================================================*/ /* */ /* C U I F L I S T */ /* */ /*=============================================================================*/
//
// CListItem
//
class CListItem : public CListItemBase { public: CListItem( WCHAR *psz, int nId ) { m_pwch = NULL; m_nId = nId; m_dwData = 0;
if (psz != NULL) { m_pwch = new WCHAR[ StrLenW(psz) + 1 ]; if (m_pwch != NULL) { StrCpyW( m_pwch, psz ); } } }
virtual ~CListItem( void ) { if (m_pwch != NULL) { delete m_pwch; } }
__inline LPCWSTR GetString( void ) { return m_pwch; }
__inline int GetID( void ) { return m_nId; }
__inline void SetData( DWORD dwData ) { m_dwData = dwData; }
__inline DWORD GetData( void ) { return m_dwData; }
protected: WCHAR *m_pwch; int m_nId; DWORD m_dwData; };
//
// CUIFList
//
/* C U I F L I S T */ /*------------------------------------------------------------------------------
Constructor of CUIFList
------------------------------------------------------------------------------*/ CUIFList::CUIFList( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFListBase( pParent, dwID, prc, dwStyle ) { }
/* ~ C U I F L I S T */ /*------------------------------------------------------------------------------
Destructor of CUIFList
------------------------------------------------------------------------------*/ CUIFList::~CUIFList( void ) { }
/* A D D S T R I N G */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFList::AddString( WCHAR *psz ) { CListItem *pItem = new CListItem( psz, GetCount() ); if (!pItem) { //
// is it ok to return -1?
//
return -1; }
return AddItem( pItem ); }
/* G E T S T R I N G */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ LPCWSTR CUIFList::GetString( int nID ) { int iItem = ItemFromID( nID ); CListItem *pItem;
pItem = (CListItem *)GetItem( iItem ); if (pItem != NULL) { return pItem->GetString(); }
return NULL; }
/* D E L E T E S T R I N G */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFList::DeleteString( int nID ) { int iItem = ItemFromID( nID );
if (iItem != -1) { DelItem( iItem ); } }
/* D E L E T E A L L S T R I N G */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFList::DeleteAllString( void ) { DelAllItem(); }
/* S E T P R I V A T E D A T A */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFList::SetPrivateData( int nID, DWORD dw ) { int iItem = ItemFromID( nID ); CListItem *pItem;
pItem = (CListItem *)GetItem( iItem ); if (pItem != NULL) { pItem->SetData( dw ); } }
/* G E T P R I V A T E D A T A */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ DWORD CUIFList::GetPrivateData( int nID ) { int iItem = ItemFromID( nID ); CListItem *pItem;
pItem = (CListItem *)GetItem( iItem ); if (pItem != NULL) { return pItem->GetData(); }
return 0; }
/* I T E M F R O M I D */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ int CUIFList::ItemFromID( int iID ) { int nItem; int i;
nItem = GetCount(); for (i = 0; i < nItem; i++) { CListItem *pItem = (CListItem *)GetItem( i );
if (iID == pItem->GetID()) { return i; } }
return -1; }
/* P A I N T I T E M P R O C */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFList::PaintItemProc( HDC hDC, RECT *prc, CListItemBase *pItem, BOOL fSelected ) { CListItem *pListItem = (CListItem *)pItem; COLORREF colText; COLORREF colBack; LPCWSTR pwch; SIZE size; POINT ptOrg;
Assert( pListItem != NULL ); pwch = pListItem->GetString(); if (pwch == NULL) { return; }
// set color
if (fSelected) { colText = GetSysColor(COLOR_HIGHLIGHTTEXT); colBack = GetSysColor(COLOR_HIGHLIGHT); } else { colText = GetSysColor(COLOR_WINDOWTEXT); colBack = GetSysColor(COLOR_3DFACE); }
SetTextColor( hDC, colText ); SetBkColor( hDC, colBack );
// calc origin
GetTextExtentPointW( hDC, pwch, StrLenW(pwch), &size ); switch (m_dwStyle & UILIST_DIRMASK) { default: case UILIST_HORZTB: { ptOrg.x = prc->left; ptOrg.y = (prc->bottom + prc->top - size.cy) / 2; break; }
case UILIST_HORZBT: { ptOrg.x = prc->right; ptOrg.y = (prc->bottom + prc->top + size.cy) / 2; break; }
case UILIST_VERTLR: { ptOrg.x = (prc->right + prc->left - size.cy) / 2; ptOrg.y = prc->bottom; break; }
case UILIST_VERTRL: { ptOrg.x = (prc->right + prc->left + size.cy) / 2; ptOrg.y = prc->top; break; } }
CUIExtTextOut( hDC, ptOrg.x, ptOrg.y, ETO_OPAQUE | ETO_CLIPPED, prc, pwch, StrLenW(pwch), NULL ); }
/*=============================================================================*/ /* */ /* C U I F G R I P P E R */ /* */ /*=============================================================================*/
/* C U I F G R I P P E R */ /*------------------------------------------------------------------------------
Constructor of CUIFGripper
------------------------------------------------------------------------------*/ CUIFGripper::CUIFGripper( CUIFObject *pParent, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, 0, prc, dwStyle ) { if (IsVertical()) SetActiveTheme(L"REBAR", RP_GRIPPERVERT); else SetActiveTheme(L"REBAR", RP_GRIPPER); }
/* ~ C U I F G R I P P E R */ /*------------------------------------------------------------------------------
Destructor of CUIFGripper
------------------------------------------------------------------------------*/ CUIFGripper::~CUIFGripper( void ) { }
/* O N P A I N T T H E M E */ /*------------------------------------------------------------------------------
Paint procedure of gripper object
------------------------------------------------------------------------------*/ void CUIFGripper::SetStyle( DWORD dwStyle ) { CUIFObject::SetStyle(dwStyle); if (IsVertical()) SetActiveTheme(L"REBAR", RP_GRIPPERVERT); else SetActiveTheme(L"REBAR", RP_GRIPPER); }
/* O N P A I N T T H E M E */ /*------------------------------------------------------------------------------
Paint procedure of gripper object
------------------------------------------------------------------------------*/ BOOL CUIFGripper::OnPaintTheme( HDC hDC ) { BOOL fRet = FALSE; int iStateID; RECT rc;
iStateID = TS_NORMAL;
if (FAILED(EnsureThemeData( GetUIWnd()->GetWnd()))) goto Exit;
rc = GetRectRef(); if (!IsVertical()) { rc.left += CUI_GRIPPER_THEME_MARGIN; rc.right -= CUI_GRIPPER_THEME_MARGIN; } else { rc.top += CUI_GRIPPER_THEME_MARGIN; rc.bottom -= CUI_GRIPPER_THEME_MARGIN; }
if (FAILED(DrawThemeBackground(hDC, iStateID, &rc, 0 ))) goto Exit;
fRet = TRUE; Exit: return fRet; }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of gripper object
------------------------------------------------------------------------------*/ void CUIFGripper::OnPaintNoTheme( HDC hDC ) { CUIFWindow *pWnd = GetUIWnd(); CUIFScheme *pUIFScheme = pWnd->GetUIFScheme(); if (pUIFScheme) { pUIFScheme->DrawDragHandle(hDC, &GetRectRef(), IsVertical()); } else { RECT rc; if (!IsVertical()) { ::SetRect(&rc, GetRectRef().left + 1, GetRectRef().top, GetRectRef().left + 4, GetRectRef().bottom); } else { ::SetRect(&rc, GetRectRef().left, GetRectRef().top + 1, GetRectRef().right, GetRectRef().top + 4); }
DrawEdge(hDC, &rc, BDR_RAISEDINNER, BF_RECT); }
}
/* O N S E T C U R S O R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFGripper::OnSetCursor( UINT uMsg, POINT pt ) { SetCursor(LoadCursor(NULL, IDC_SIZEALL)); return TRUE; }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFGripper::OnLButtonDown( POINT pt ) { RECT rc; StartCapture(); _ptCur = pt; ClientToScreen(m_pUIWnd->GetWnd(), &_ptCur); GetWindowRect(m_pUIWnd->GetWnd(), &rc); _ptCur.x -= rc.left; _ptCur.y -= rc.top; }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFGripper::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); } }
/* O N M O U S E M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFGripper::OnMouseMove( POINT pt ) { if (IsCapture()) { POINT ptCursor; GetCursorPos(&ptCursor); m_pUIWnd->Move(ptCursor.x - _ptCur.x, ptCursor.y - _ptCur.y, -1, -1); } }
/*=============================================================================*/ /* */ /* C U I F W N D F R A M E */ /* */ /*=============================================================================*/
/* C U I F W N D F R A M E */ /*------------------------------------------------------------------------------
Constructor of CUIFWndFrame
------------------------------------------------------------------------------*/ CUIFWndFrame::CUIFWndFrame( CUIFObject *pParent, const RECT *prc, DWORD dwStyle ) : CUIFObject( pParent, 0, prc, dwStyle ) { SetActiveTheme(L"WINDOW", WP_FRAMELEFT);
m_dwHTResizing = 0;
m_cxFrame = 0; m_cyFrame = 0; if (GetUIFScheme()) { switch (GetStyle() & UIWNDFRAME_STYLEMASK) { default: case UIWNDFRAME_THIN: { m_cxFrame = GetUIFScheme()->CxWndBorder(); m_cyFrame = GetUIFScheme()->CxWndBorder(); break; }
case UIWNDFRAME_THICK: case UIWNDFRAME_ROUNDTHICK: { m_cxFrame = GetUIFScheme()->CxSizeFrame(); m_cyFrame = GetUIFScheme()->CySizeFrame(); break; } } }
m_cxMin = GetSystemMetrics( SM_CXMIN ); m_cyMin = GetSystemMetrics( SM_CYMIN ); }
/* ~ C U I F W N D F R A M E */ /*------------------------------------------------------------------------------
Destructor of CUIFWndFrame
------------------------------------------------------------------------------*/ CUIFWndFrame::~CUIFWndFrame( void ) { }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of wnd frame object
------------------------------------------------------------------------------*/ BOOL CUIFWndFrame::OnPaintTheme( HDC hDC ) { BOOL fRet = FALSE;
if (FAILED(EnsureThemeData(m_pUIWnd->GetWnd()))) goto Exit;
//
// DrawThemebackground() does not draw caption.
// so we draw the frame with 4 lines by DrawThemeLine().
//
// if (FAILED(DrawThemeBackground(hDC, FS_ACTIVE, &GetRectRef(), 0 )))
// goto Exit;
RECT rc;
//
// draw left side
//
rc = GetRectRef(); rc.right = m_cxFrame; if (FAILED(DrawThemeEdge(hDC, 0, &rc, EDGE_RAISED, BF_LEFT ))) goto Exit;
//
// draw right side
//
rc = GetRectRef(); rc.left = rc.right - m_cxFrame; if (FAILED(DrawThemeEdge(hDC, 0, &rc, EDGE_SUNKEN, BF_RIGHT ))) goto Exit;
//
// draw top side
//
rc = GetRectRef(); rc.bottom = m_cyFrame; if (FAILED(DrawThemeEdge(hDC, 0, &rc, EDGE_RAISED, BF_TOP ))) goto Exit;
//
// draw bottom side
//
rc = GetRectRef(); rc.top = rc.bottom - m_cyFrame; if (FAILED(DrawThemeEdge(hDC, 0, &rc, EDGE_SUNKEN, BF_BOTTOM ))) goto Exit;
fRet = TRUE; Exit: return fRet; }
/* O N P A I N T */ /*------------------------------------------------------------------------------
Paint procedure of wnd frame object
------------------------------------------------------------------------------*/ void CUIFWndFrame::OnPaintNoTheme( HDC hDC ) { if (!GetUIFScheme()) return;
DWORD dwFlag = 0;
switch (GetStyle() & UIWNDFRAME_STYLEMASK) { default: case UIWNDFRAME_THIN: { dwFlag = UIFDWF_THIN; break; }
case UIWNDFRAME_THICK: { dwFlag = UIFDWF_THICK; break; }
case UIWNDFRAME_ROUNDTHICK: { dwFlag = UIFDWF_ROUNDTHICK; break; } }
GetUIFScheme()->DrawWndFrame( hDC, &GetRectRef(), dwFlag, m_cxFrame, m_cyFrame ); }
/* O N S E T C U R S O R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFWndFrame::OnSetCursor( UINT uMsg, POINT pt ) { DWORD dw; LPCTSTR idc = NULL;
if (IsCapture()) { dw = m_dwHTResizing; } else { dw = HitTest( pt ) & GetStyle(); }
if (dw == (UIWNDFRAME_RESIZELEFT | UIWNDFRAME_RESIZETOP)) { idc = IDC_SIZENWSE; } else if (dw == (UIWNDFRAME_RESIZELEFT | UIWNDFRAME_RESIZEBOTTOM)) { idc = IDC_SIZENESW; } else if (dw == (UIWNDFRAME_RESIZERIGHT | UIWNDFRAME_RESIZETOP)) { idc = IDC_SIZENESW; } else if (dw == (UIWNDFRAME_RESIZERIGHT | UIWNDFRAME_RESIZEBOTTOM)) { idc = IDC_SIZENWSE; } else if (dw == UIWNDFRAME_RESIZELEFT) { idc = IDC_SIZEWE; } else if (dw == UIWNDFRAME_RESIZETOP) { idc = IDC_SIZENS; } else if (dw == UIWNDFRAME_RESIZERIGHT) { idc = IDC_SIZEWE; } else if (dw == UIWNDFRAME_RESIZEBOTTOM) { idc = IDC_SIZENS; }
if (idc != NULL) { SetCursor( LoadCursor( NULL, idc ) ); return TRUE; }
return FALSE; }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::OnLButtonDown( POINT pt ) { DWORD dwHT;
dwHT = HitTest( pt ) & GetStyle();
if (dwHT != 0) { ClientToScreen( m_pUIWnd->GetWnd(), &pt );
m_ptDrag = pt; m_dwHTResizing = dwHT; GetWindowRect( m_pUIWnd->GetWnd(), &m_rcOrg );
StartCapture(); } }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); } }
/* O N M O U S E M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::OnMouseMove( POINT pt ) { if (IsCapture()) { RECT rc = m_rcOrg;
ClientToScreen( m_pUIWnd->GetWnd(), &pt );
if (m_dwHTResizing & UIWNDFRAME_RESIZELEFT) { rc.left = m_rcOrg.left + (pt.x - m_ptDrag.x); } if (m_dwHTResizing & UIWNDFRAME_RESIZETOP) { rc.top = m_rcOrg.top + (pt.y - m_ptDrag.y); } if (m_dwHTResizing & UIWNDFRAME_RESIZERIGHT) { rc.right = m_rcOrg.right + (pt.x - m_ptDrag.x); rc.right = max( rc.right, rc.left + m_cxMin ); } if (m_dwHTResizing & UIWNDFRAME_RESIZEBOTTOM) { rc.bottom = m_rcOrg.bottom + (pt.y - m_ptDrag.y); rc.bottom = max( rc.bottom, rc.top + m_cyMin ); }
m_pUIWnd->Move( rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top ); } }
/* G E T I N T E R N A L R E C T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::GetInternalRect( RECT *prc ) { Assert( prc != NULL );
*prc = GetRectRef(); prc->left = prc->left + m_cxFrame; prc->top = prc->top + m_cyFrame; prc->right = prc->right - m_cxFrame; prc->bottom = prc->bottom - m_cyFrame; }
/* H I T T E S T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ DWORD CUIFWndFrame::HitTest( POINT pt ) { DWORD dwHT = 0;
dwHT |= (GetRectRef().left <= pt.x && pt.x < GetRectRef().left + m_cxFrame) ? UIWNDFRAME_RESIZELEFT : 0; dwHT |= (GetRectRef().top <= pt.y && pt.y < GetRectRef().top + m_cyFrame) ? UIWNDFRAME_RESIZETOP : 0; dwHT |= (GetRectRef().right - m_cxFrame <= pt.x && pt.x < GetRectRef().right ) ? UIWNDFRAME_RESIZERIGHT : 0; dwHT |= (GetRectRef().bottom - m_cyFrame <= pt.y && pt.y < GetRectRef().bottom) ? UIWNDFRAME_RESIZEBOTTOM : 0;
return dwHT; }
/* G E T F R A M E S I Z E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::GetFrameSize( SIZE *psize ) { Assert( psize != NULL );
psize->cx = m_cxFrame; psize->cy = m_cyFrame; }
/* S E T F R A M E S I Z E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::SetFrameSize( SIZE *psize ) { Assert( psize != NULL );
m_cxFrame = psize->cx; m_cyFrame = psize->cy;
CallOnPaint(); }
/* G E T M I N I M U M S I Z E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::GetMinimumSize( SIZE *psize ) { Assert( psize != NULL );
psize->cx = m_cxMin; psize->cy = m_cyMin; }
/* S E T M I N I M U M S I Z E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndFrame::SetMinimumSize( SIZE *psize ) { Assert( psize != NULL );
if (psize->cx != -1) { m_cxMin = psize->cx; } if (psize->cy != -1) { m_cyMin = psize->cy; } }
/*=============================================================================*/ /* */ /* C U I F W N D C A P T I O N */ /* */ /*=============================================================================*/
/* C U I F W N D C A P T I O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CUIFWndCaption::CUIFWndCaption( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFStatic( pParent, dwID, prc, dwStyle ) { }
/* ~ C U I F W N D C A P T I O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CUIFWndCaption::~CUIFWndCaption( void ) { }
/* O N P A I N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndCaption::OnPaint( HDC hDC ) { HFONT hFontOld; COLORREF colTextOld; int iBkModeOld; int xAlign; int yAlign; SIZE size; int cwch; UIFCOLOR colBkgnd; UIFCOLOR colText;
//
if (FHasStyle( UIWNDCAPTION_ACTIVE )) { colBkgnd = UIFCOLOR_ACTIVECAPTIONBKGND; colText = UIFCOLOR_ACTIVECAPTIONTEXT; } else { colBkgnd = UIFCOLOR_INACTIVECAPTIONBKGND; colText = UIFCOLOR_INACTIVECAPTIONTEXT; }
// background
FillRect( hDC, &GetRectRef(), GetUIFBrush( colBkgnd ) );
// caption text
if (m_pwchText == NULL) { return; }
// prepare objects
hFontOld= (HFONT)SelectObject( hDC, GetFont() ); colTextOld = SetTextColor( hDC, GetUIFColor( colText ) ); iBkModeOld = SetBkMode( hDC, TRANSPARENT );
// calc alignment
cwch = StrLenW(m_pwchText); GetTextExtentPointW( hDC, m_pwchText, cwch, &size );
xAlign = 8; yAlign = (GetRectRef().bottom - GetRectRef().top - size.cy) / 2;
// draw
CUIExtTextOut( hDC, GetRectRef().left + xAlign, GetRectRef().top + yAlign, ETO_CLIPPED, &GetRectRef(), m_pwchText, cwch, NULL );
// restore objects
SelectObject( hDC, hFontOld ); SetTextColor( hDC, colTextOld ); SetBkMode( hDC, iBkModeOld ); }
/* O N L B U T T O N D O W N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndCaption::OnLButtonDown( POINT pt ) { RECT rc;
if (!FHasStyle( UIWNDCAPTION_MOVABLE )) { return; }
StartCapture(); SetCursor( LoadCursor( NULL, IDC_SIZEALL ) );
m_ptDrag = pt; ClientToScreen( m_pUIWnd->GetWnd(), &m_ptDrag ); GetWindowRect( m_pUIWnd->GetWnd(), &rc ); m_ptDrag.x -= rc.left; m_ptDrag.y -= rc.top; }
/* O N L B U T T O N U P */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndCaption::OnLButtonUp( POINT pt ) { if (IsCapture()) { EndCapture(); SetCursor( LoadCursor( NULL, IDC_ARROW ) ); } }
/* O N M O U S E M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWndCaption::OnMouseMove( POINT pt ) { if (IsCapture()) { POINT ptCursor;
GetCursorPos( &ptCursor ); m_pUIWnd->Move( ptCursor.x - m_ptDrag.x, ptCursor.y - m_ptDrag.y, -1, -1 ); } }
/* O N S E T C U R S O R */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFWndCaption::OnSetCursor( UINT uMsg, POINT pt ) { if (IsCapture()) { SetCursor( LoadCursor( NULL, IDC_SIZEALL ) ); } else { SetCursor( LoadCursor( NULL, IDC_ARROW ) ); } return TRUE; }
/*=============================================================================*/ /* */ /* C U I F C A P T I O N B U T T O N */ /* */ /*=============================================================================*/
/* C U I F C A P T I O N B U T T O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CUIFCaptionButton::CUIFCaptionButton( CUIFObject *pParent, DWORD dwID, const RECT *prc, DWORD dwStyle ) : CUIFButton2( pParent, dwID, prc, dwStyle ) { }
/* ~ C U I F C A P T I O N B U T T O N */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ CUIFCaptionButton::~CUIFCaptionButton( void ) { }
/* O N P A I N T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFCaptionButton::OnPaint( HDC hDC ) { DWORD dwState = 0; HDC hDCMem; HBITMAP hBmpMem; HBITMAP hBmpOld; SIZE size; RECT rc; SIZE sizeText = {0}; SIZE sizeImage = {0}; SIZE sizeFace = {0}; SIZE offset = {0}; RECT rcText = {0}; RECT rcImage = {0}; RECT rcFace = {0}; HFONT hFontOld;
if (!m_pUIFScheme) return;
// make draw flag
dwState |= (m_fToggled) ? UIFDCS_SELECTED : 0; switch (m_dwStatus) { case UIBUTTON_DOWN: { dwState |= UIFDCS_MOUSEDOWN; break; }
case UIBUTTON_HOVER: case UIBUTTON_DOWNOUT: { dwState |= UIFDCS_MOUSEOVER; break; } } dwState |= IsEnabled() ? 0 : UIFDCS_DISABLED; dwState |= (FHasStyle( UICAPTIONBUTTON_ACTIVE ) ? UIFDCS_ACTIVE : UIFDCS_INACTIVE);
// prepare memory dc
size.cx = GetRectRef().right - GetRectRef().left; size.cy = GetRectRef().bottom - GetRectRef().top;
hDCMem = CreateCompatibleDC( hDC ); hBmpMem = CreateCompatibleBitmap( hDC, size.cx, size.cy ); hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem );
BitBlt( hDCMem, 0, 0, size.cx, size.cy, hDC, GetRectRef().left, GetRectRef().top, SRCCOPY );
::SetRect( &rc, 0, 0, size.cx, size.cy ); hFontOld = (HFONT)SelectObject( hDCMem, GetFont() );
// calc face size
if (m_pwchText != NULL) { sizeText = m_sizeText; } if (m_hIcon != NULL) { sizeImage = m_sizeIcon; } else if (m_hBmp != NULL ) { sizeImage = m_sizeBmp; }
// alignment
sizeFace.cx = sizeText.cx + sizeImage.cx + ((sizeText.cx != 0 && sizeImage.cx != 0) ? 2 : 0); sizeFace.cy = max( sizeText.cy, sizeImage.cy );
switch (GetStyleBits( UIBUTTON_HALIGNMASK )) { case UIBUTTON_LEFT: default: { rcFace.left = rc.left + 2; rcFace.right = rcFace.left + sizeFace.cx; break; }
case UIBUTTON_CENTER: { rcFace.left = (rc.right + rc.left - sizeFace.cx) / 2; rcFace.right = rcFace.left + sizeFace.cx; break; }
case UIBUTTON_RIGHT: { rcFace.left = rc.right - 2 - sizeText.cx; rcFace.right = rcFace.left + sizeFace.cx; break; } }
switch (GetStyleBits( UIBUTTON_VALIGNMASK )) { case UIBUTTON_TOP: default: { rcFace.top = rc.top + 2; rcFace.bottom = rcFace.top + sizeFace.cy; break; }
case UIBUTTON_VCENTER: { rcFace.top = (rc.bottom + rc.top - sizeFace.cy) / 2; rcFace.bottom = rcFace.top + sizeFace.cy; break; }
case UIBUTTON_BOTTOM: { rcFace.top = rc.bottom - 2 - sizeFace.cy; rcFace.bottom = rcFace.top + sizeFace.cy; break; } }
m_pUIFScheme->GetCtrlFaceOffset( UIFDCF_CAPTIONBUTTON, dwState, &offset ); OffsetRect( &rcFace, offset.cx, offset.cy );
rcImage.left = rcFace.left; rcImage.top = (rcFace.bottom + rcFace.top - sizeImage.cy) / 2; rcImage.right = rcImage.left + sizeImage.cx; rcImage.bottom = rcImage.top + sizeImage.cy;
rcText.left = rcFace.right - sizeText.cx; rcText.top = (rcFace.bottom + rcFace.top - sizeText.cy) / 2; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy;
// paint background
m_pUIFScheme->DrawFrameCtrlBkgd( hDCMem, &rc, UIFDCF_CAPTIONBUTTON, dwState );
// paint face
if (m_hIcon!= NULL) { m_pUIFScheme->DrawFrameCtrlIcon( hDCMem, &rcImage, m_hIcon, dwState, &m_sizeIcon); } else if (m_hBmp != NULL) { m_pUIFScheme->DrawFrameCtrlBitmap( hDCMem, &rcImage, m_hBmp, m_hBmpMask, dwState ); }
// draw button edge
m_pUIFScheme->DrawFrameCtrlEdge( hDCMem, &rc, UIFDCF_CAPTIONBUTTON, dwState );
//
BitBlt( hDC, GetRectRef().left, GetRectRef().top, size.cx, size.cy, hDCMem, 0, 0, SRCCOPY );
SelectObject( hDCMem, hFontOld ); SelectObject( hDCMem, hBmpOld ); DeleteObject( hBmpMem ); DeleteDC( hDCMem ); }
|