|
|
//
// cuiwnd.cpp
//
#include "private.h"
#include "cuiwnd.h"
#include "cuiobj.h"
#include "cuitip.h"
#include "cuishadw.h"
#include "cuischem.h"
#include "cuisys.h"
#include "cuiutil.h"
#define UIWINDOW_CLASSNAME "CiceroUIWndFrame"
#define UIWINDOW_TITLE "CiceroUIWndFrame"
// TIMER IDs
#define idTimer_UIObject 0x5461
#define idTimer_MonitorMouse 0x7982
// if this is too small like 100ms, tooltip does not work correctly.
#define iElapse_MonitorMouse 1000
/*=============================================================================*/ /* */ /* C U I F W I N D O W */ /* */ /*=============================================================================*/
/* C U I F W I N D O W */ /*------------------------------------------------------------------------------
Constructor of CUIFWindow
------------------------------------------------------------------------------*/ CUIFWindow::CUIFWindow( HINSTANCE hInst, DWORD dwStyle ) : CUIFObject( NULL /* no parent */, 0 /* no ID */, NULL /* no rectangle */, dwStyle ) {
m_hInstance = hInst; _xWnd = WND_DEF_X; _yWnd = WND_DEF_Y; _nWidth = WND_WIDTH; _nHeight = WND_HEIGHT; m_hWnd = NULL; m_pUIWnd = this; m_pUIObjCapture = NULL; m_pTimerUIObj = NULL; m_pUIObjPointed = NULL; m_fCheckingMouse = FALSE; m_pWndToolTip = NULL; m_pWndShadow = NULL; m_fShadowEnabled = TRUE; m_pBehindModalUIWnd = NULL;
CreateScheme(); }
void CUIFWindow::CreateScheme() { if (m_pUIFScheme) delete m_pUIFScheme;
// create scheme
UIFSCHEME scheme; scheme = UIFSCHEME_DEFAULT; if (FHasStyle( UIWINDOW_OFC10MENU )) { scheme = UIFSCHEME_OFC10MENU; } else if (FHasStyle( UIWINDOW_OFC10TOOLBAR )) { scheme = UIFSCHEME_OFC10TOOLBAR; } else if (FHasStyle( UIWINDOW_OFC10WORKPANE )) { scheme = UIFSCHEME_OFC10WORKPANE; } m_pUIFScheme = CreateUIFScheme( scheme ); Assert( m_pUIFScheme != NULL );
SetScheme(m_pUIFScheme); }
/* ~ C U I F W I N D O W */ /*------------------------------------------------------------------------------
Destructor of CUIFWindow
------------------------------------------------------------------------------*/ CUIFWindow::~CUIFWindow( void ) { CUIFObject *pUIObj;
Assert( !m_hWnd || !GetThis(m_hWnd) );
// delete tooltip/shadow
if (m_pWndToolTip != NULL) { delete m_pWndToolTip; }
if (m_pWndShadow != NULL) { delete m_pWndShadow; }
// delete all childlen
while (pUIObj = m_ChildList.GetLast()) { m_ChildList.Remove( pUIObj ); delete pUIObj; }
// dispose scheme
if (m_pUIFScheme) delete m_pUIFScheme; }
/* I N I T I A L I Z E */ /*------------------------------------------------------------------------------
Initialize UI window object (UIFObject method)
------------------------------------------------------------------------------*/ CUIFObject *CUIFWindow::Initialize( void ) { LPCTSTR pszClassName = GetClassName(); WNDCLASSEX WndClass; // register window class
MemSet( &WndClass, 0, sizeof(WndClass)); WndClass.cbSize = sizeof( WndClass );
if (!GetClassInfoEx( m_hInstance, pszClassName, &WndClass )) { MemSet( &WndClass, 0, sizeof(WndClass));
WndClass.cbSize = sizeof( WndClass ); WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; WndClass.lpfnWndProc = WindowProcedure; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 8; WndClass.hInstance = m_hInstance; WndClass.hIcon = NULL; WndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); WndClass.hbrBackground = NULL; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = pszClassName; WndClass.hIconSm = NULL;
RegisterClassEx( &WndClass ); }
// update scheme
UpdateUIFSys(); UpdateUIFScheme();
// create tooltip
if (FHasStyle( UIWINDOW_HASTOOLTIP )) { m_pWndToolTip = new CUIFToolTip( m_hInstance, UIWINDOW_TOPMOST | UIWINDOW_WSBORDER | (FHasStyle( UIWINDOW_LAYOUTRTL ) ? UIWINDOW_LAYOUTRTL : 0), this); if (m_pWndToolTip) m_pWndToolTip->Initialize(); }
// create shadow
if (FHasStyle( UIWINDOW_HASSHADOW )) { m_pWndShadow = new CUIFShadow( m_hInstance, UIWINDOW_TOPMOST, this ); if (m_pWndShadow) m_pWndShadow->Initialize(); }
return CUIFObject::Initialize(); }
/* P A I N T O B J E C T */ /*------------------------------------------------------------------------------
Paint window object (UIFObject method)
------------------------------------------------------------------------------*/ void CUIFWindow::PaintObject( HDC hDC, const RECT *prcUpdate ) { BOOL fReleaseDC = FALSE; HDC hDCMem; HBITMAP hBmpMem; HBITMAP hBmpOld;
if (hDC == NULL) { hDC = GetDC( m_hWnd ); fReleaseDC = TRUE; }
if (prcUpdate == NULL) { prcUpdate = &GetRectRef(); }
// prepare memory dc
hDCMem = CreateCompatibleDC( hDC ); if (!hDCMem) { return; }
hBmpMem = CreateCompatibleBitmap( hDC, prcUpdate->right - prcUpdate->left, prcUpdate->bottom - prcUpdate->top ); if (hBmpMem) { hBmpOld = (HBITMAP)SelectObject( hDCMem, hBmpMem );
// paint to memory dc
BOOL fRetVal = SetViewportOrgEx( hDCMem, -prcUpdate->left, -prcUpdate->top, NULL ); Assert( fRetVal );
//
// theme support
//
BOOL fDefault = TRUE; if (SUCCEEDED(EnsureThemeData(GetWnd()))) { if (FHasStyle( UIWINDOW_CHILDWND ) && SUCCEEDED(DrawThemeParentBackground(GetWnd(), hDCMem, &GetRectRef()))) { fDefault = FALSE; } else if (SUCCEEDED(DrawThemeBackground(hDCMem, GetDefThemeStateID(), &GetRectRef(), 0 ))) fDefault = FALSE; }
if (fDefault) { if (m_pUIFScheme) m_pUIFScheme->FillRect( hDCMem, prcUpdate, UIFCOLOR_WINDOW ); }
//
CUIFObject::PaintObject( hDCMem, prcUpdate );
// transfer image to screen
BitBlt( hDC, prcUpdate->left, prcUpdate->top, prcUpdate->right - prcUpdate->left, prcUpdate->bottom - prcUpdate->top, hDCMem, prcUpdate->left, prcUpdate->top, SRCCOPY );
SelectObject( hDCMem, hBmpOld ); DeleteObject( hBmpMem ); } DeleteDC( hDCMem ); if (fReleaseDC) { ReleaseDC( m_hWnd, hDC ); } }
/* G E T C L A S S N A M E */ /*------------------------------------------------------------------------------
Get class name
------------------------------------------------------------------------------*/ LPCTSTR CUIFWindow::GetClassName( void ) { return TEXT( UIWINDOW_CLASSNAME ); }
/* G E T W I N D O W T I T L E */ /*------------------------------------------------------------------------------
Get window title
------------------------------------------------------------------------------*/ LPCTSTR CUIFWindow::GetWndTitle( void ) { return TEXT( UIWINDOW_TITLE ); }
/* G E T W N D S T Y L E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ DWORD CUIFWindow::GetWndStyle( void ) { DWORD dwWndStyle = 0;
// determine style
if (FHasStyle( UIWINDOW_CHILDWND )) { dwWndStyle |= WS_CHILD | WS_CLIPSIBLINGS; } else { dwWndStyle |= WS_POPUP | WS_DISABLED; }
if (FHasStyle( UIWINDOW_OFC10MENU )) { dwWndStyle |= WS_BORDER; } else if (FHasStyle( UIWINDOW_WSDLGFRAME )) { dwWndStyle |= WS_DLGFRAME; } else if (FHasStyle( UIWINDOW_OFC10TOOLBAR )) { dwWndStyle |= WS_BORDER; } else if (FHasStyle( UIWINDOW_WSBORDER )) { dwWndStyle |= WS_BORDER; }
return dwWndStyle; }
/* G E T W N D S T Y L E E X */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ DWORD CUIFWindow::GetWndStyleEx( void ) { DWORD dwWndStyleEx = 0;
// determine ex style
if (FHasStyle( UIWINDOW_TOPMOST )) { dwWndStyleEx |= WS_EX_TOPMOST; }
if (FHasStyle( UIWINDOW_TOOLWINDOW )) { dwWndStyleEx |= WS_EX_TOOLWINDOW; }
if (FHasStyle( UIWINDOW_LAYOUTRTL )) { dwWndStyleEx |= WS_EX_LAYOUTRTL; }
return dwWndStyleEx; }
/* C R E A T E W N D */ /*------------------------------------------------------------------------------
Create window
------------------------------------------------------------------------------*/ HWND CUIFWindow::CreateWnd( HWND hWndParent ) { HWND hWnd;
// create window
hWnd = CreateWindowEx( GetWndStyleEx(), /* ex style */ GetClassName(), /* class name */ GetWndTitle(), /* window title */ GetWndStyle(), /* window style */ _xWnd, /* initial position (x) */ _yWnd, /* initial position (y) */ _nWidth, /* initial width */ _nHeight, /* initial height */ hWndParent, /* parent winodw */ NULL, /* menu handle */ m_hInstance, /* instance */ this ); /* lpParam */
// create tooltip window
if (m_pWndToolTip != NULL) { m_pWndToolTip->CreateWnd( hWnd ); }
// create shadow window
if (m_pWndShadow != NULL) { m_pWndShadow->CreateWnd( hWnd ); }
return hWnd; }
/* S H O W */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWindow::Show( BOOL fShow ) { if (IsWindow( m_hWnd )) {
if (fShow && FHasStyle( UIWINDOW_TOPMOST )) SetWindowPos(m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
m_fVisible = fShow; ShowWindow( m_hWnd, fShow ? SW_SHOWNOACTIVATE : SW_HIDE ); } }
/* M O V E */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWindow::Move(int x, int y, int nWidth, int nHeight) { _xWnd = x; _yWnd = y;
if (nWidth >= 0) _nWidth = nWidth;
if (nHeight >= 0) _nHeight = nHeight;
if (IsWindow(m_hWnd)) { AdjustWindowPosition(); MoveWindow(m_hWnd, _xWnd, _yWnd, _nWidth, _nHeight, TRUE); } }
/* A N I M A T E W N D */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ BOOL CUIFWindow::AnimateWnd( DWORD dwTime, DWORD dwFlags ) { BOOL fRet = FALSE; if (!IsWindow( GetWnd() )) { return FALSE; }
if (CUIIsAnimateWindowAvail()) { BOOL fVisibleOrg = m_fVisible;
// HACK!
// AnimateWindow never send WM_SHOWWINDOW message.
// Need to set visible state before call AnimateWindow because
// it need to be turned on in OnPaint() to handle WM_PRINTCLIENT
// message. If animate window failed, restore it to original state.
if ((dwFlags & AW_HIDE) == 0) { m_fVisible = TRUE; } else { m_fVisible = FALSE; }
OnAnimationStart();
// get system settings about animation
fRet = CUIAnimateWindow( GetWnd(), dwTime, dwFlags );
if (!fRet) { m_fVisible = fVisibleOrg; }
OnAnimationEnd(); }
return fRet; }
/* R E M O V E U I O B J */ /*------------------------------------------------------------------------------
Remove child UI object
------------------------------------------------------------------------------*/ void CUIFWindow::RemoveUIObj( CUIFObject *pUIObj ) { if (pUIObj == m_pUIObjCapture) { // release capture before remove
SetCaptureObject( NULL ); } if (pUIObj == m_pTimerUIObj) { // kill timer before remove
SetTimerObject( NULL ); } if (pUIObj == m_pUIObjPointed) { // no object pointed...
m_pUIObjPointed = NULL; }
CUIFObject::RemoveUIObj( pUIObj ); }
/* S E T C A P T U R E O B J E C T */ /*------------------------------------------------------------------------------
Set capture object Start/end capturing mouse
------------------------------------------------------------------------------*/ void CUIFWindow::SetCaptureObject( CUIFObject *pUIObj ) { if (pUIObj != NULL) { // start capture
m_pUIObjCapture = pUIObj; SetCapture( TRUE ); } else { // end capture
m_pUIObjCapture = NULL; SetCapture( FALSE ); } }
/* S E T C A P T U R E O B J E C T */ /*------------------------------------------------------------------------------
Set capture Start/end capturing mouse
------------------------------------------------------------------------------*/ void CUIFWindow::SetCapture(BOOL fSet) { if (fSet) { ::SetCapture( m_hWnd ); } else { ::ReleaseCapture(); } }
/* S E T C A P T U R E O B J E C T */ /*------------------------------------------------------------------------------
Set capture object Start/end capturing mouse
------------------------------------------------------------------------------*/ void CUIFWindow::SetBehindModal(CUIFWindow *pModalUIWnd) { m_pBehindModalUIWnd = pModalUIWnd; }
/* S E T T I M E R O B J E C T */ /*------------------------------------------------------------------------------
Set timer object Make/kill timer
------------------------------------------------------------------------------*/ void CUIFWindow::SetTimerObject( CUIFObject *pUIObj, UINT uElapse ) { if (pUIObj != NULL) { // make timer
Assert( uElapse != 0 ); m_pTimerUIObj = pUIObj; SetTimer( m_hWnd, idTimer_UIObject, uElapse, NULL ); } else { // kill timer
Assert( uElapse == 0 ); m_pTimerUIObj = NULL; KillTimer( m_hWnd, idTimer_UIObject ); } }
/* H A N D L E M O U S E M S G */ /*------------------------------------------------------------------------------
Mouse message handler Pass mouse message to appropriate UI object (capturing/monitoring/under the cursor)
------------------------------------------------------------------------------*/ void CUIFWindow::HandleMouseMsg( UINT uMsg, POINT pt ) { CUIFObject *pUIObj = ObjectFromPoint( pt );
// check mouse in/out
SetObjectPointed( pUIObj, pt );
// find UI object to handle mouse message
if (m_pUIObjCapture != NULL) { pUIObj = m_pUIObjCapture; }
// set cursor
if (pUIObj == NULL || !pUIObj->OnSetCursor( uMsg, pt )) { SetCursor( LoadCursor( NULL, IDC_ARROW ) ); }
// handle mouse message
if (pUIObj != NULL && pUIObj->IsEnabled()) { switch (uMsg) { case WM_MOUSEMOVE: { pUIObj->OnMouseMove( pt ); break; }
case WM_LBUTTONDOWN: { pUIObj->OnLButtonDown( pt ); break; }
case WM_MBUTTONDOWN: { pUIObj->OnMButtonDown( pt ); break; }
case WM_RBUTTONDOWN: { pUIObj->OnRButtonDown( pt ); break; }
case WM_LBUTTONUP: { pUIObj->OnLButtonUp( pt ); break; }
case WM_MBUTTONUP: { pUIObj->OnMButtonUp( pt ); break; } case WM_RBUTTONUP: { pUIObj->OnRButtonUp( pt ); break; } } /* of switch */ } }
/* S E T O B J E C T P O I N T E D */ /*------------------------------------------------------------------------------
Set UI object pointed (the UI object under cursor) Notify MouseIn/Out to the object when changed
------------------------------------------------------------------------------*/ void CUIFWindow::SetObjectPointed( CUIFObject *pUIObj, POINT pt ) { if (pUIObj != m_pUIObjPointed) { // notify mouse out
if (m_pUIObjCapture != NULL) { // notify only to capturing object
if (m_pUIObjCapture == m_pUIObjPointed && m_pUIObjPointed->IsEnabled()) { m_pUIObjPointed->OnMouseOut( pt ); } } else { if (m_pUIObjPointed != NULL && m_pUIObjPointed->IsEnabled()) { m_pUIObjPointed->OnMouseOut( pt ); } }
// set object pointed (object under the cursor)
m_pUIObjPointed = pUIObj;
// notify mouse in
if (m_pUIObjCapture != NULL) { // notify only to capturing object
if (m_pUIObjCapture == m_pUIObjPointed && m_pUIObjPointed->IsEnabled()) { m_pUIObjPointed->OnMouseIn( pt ); } } else { if (m_pUIObjPointed != NULL && m_pUIObjPointed->IsEnabled()) { m_pUIObjPointed->OnMouseIn( pt ); } } } }
/* O N O B J E C T M O V E D */ /*------------------------------------------------------------------------------
Called when the UI object has been moved Check mouse in/out for the object
------------------------------------------------------------------------------*/ void CUIFWindow::OnObjectMoved( CUIFObject *pUIObj ) { POINT pt;
if (IsWindow( m_hWnd )) { // set object pointed to check mouse in/out
GetCursorPos( &pt ); ScreenToClient( m_hWnd, &pt );
SetObjectPointed( ObjectFromPoint( pt ), pt ); } }
/* S E T R E C T */ /*------------------------------------------------------------------------------
Set rect of object (CUIFObject method)
------------------------------------------------------------------------------*/ void CUIFWindow::SetRect( const RECT * /*prc*/ ) { RECT rc = { 0, 0, 0, 0 };
if (IsWindow( GetWnd() )) { GetClientRect( GetWnd(), &rc ); }
CUIFObject::SetRect( &rc ); }
/* C L I E N T R E C T T O W I N D O W R E C T */ /*------------------------------------------------------------------------------
Get window rect from client rect
------------------------------------------------------------------------------*/ void CUIFWindow::ClientRectToWindowRect( RECT *prc ) { DWORD dwWndStyle; DWORD dwWndStyleEx;
if (IsWindow( m_hWnd )) { dwWndStyle = GetWindowLong( m_hWnd, GWL_STYLE ); dwWndStyleEx = GetWindowLong( m_hWnd, GWL_EXSTYLE ); } else { dwWndStyle = GetWndStyle(); dwWndStyleEx = GetWndStyleEx(); }
Assert( prc != NULL ); AdjustWindowRectEx( prc, dwWndStyle, FALSE, dwWndStyleEx ); }
/* G E T W I N D O W F R A M E S I Z E */ /*------------------------------------------------------------------------------
Get window frame size
------------------------------------------------------------------------------*/ void CUIFWindow::GetWindowFrameSize( SIZE *psize ) { RECT rc = { 0, 0, 0, 0 };
Assert( psize != NULL );
ClientRectToWindowRect( &rc ); psize->cx = (rc.right - rc.left) / 2; psize->cy = (rc.bottom - rc.top) / 2; }
/* O N A N I M A T I O N S T A R T */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWindow::OnAnimationStart( void ) {
}
/* O N A N I M A T I O N E N D */ /*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWindow::OnAnimationEnd( void ) { // show/hide shadow
if (m_pWndShadow && m_fShadowEnabled) { m_pWndShadow->Show( m_fVisible ); } }
/* O N T H E M E C H A N G E D
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/ void CUIFWindow::OnThemeChanged(HWND hwnd, WPARAM wParam, LPARAM lParam) { ClearTheme(); }
/* W I N D O W P R O C */ /*------------------------------------------------------------------------------
Window procedure of the object This function is called from WindowProcedure which is actual callback function to handle message.
------------------------------------------------------------------------------*/ LRESULT CUIFWindow::WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_CREATE: { // store rects
SetRect( NULL );
OnCreate(hWnd); break; }
case WM_SETFOCUS: { OnSetFocus(hWnd); break; }
case WM_KILLFOCUS: { OnKillFocus(hWnd); break; }
case WM_SIZE: { // store rects
SetRect( NULL ); break; }
case WM_SETCURSOR: { POINT pt;
// get current cursor pos
GetCursorPos( &pt ); ScreenToClient( m_hWnd, &pt );
if (m_pBehindModalUIWnd) { m_pBehindModalUIWnd->ModalMouseNotify( HIWORD(lParam), pt ); return TRUE; }
// start checking mouse in/out
if (!m_fCheckingMouse) { SetTimer( m_hWnd, idTimer_MonitorMouse, iElapse_MonitorMouse, NULL ); m_fCheckingMouse = TRUE; }
// tooltip
if (m_pWndToolTip != NULL) { MSG msg;
msg.hwnd = GetWnd(); msg.message = HIWORD(lParam); msg.wParam = 0; msg.lParam = MAKELPARAM( pt.x, pt.y ); m_pWndToolTip->RelayEvent( &msg ); }
// handle mouse message
if (!FHasStyle( UIWINDOW_NOMOUSEMSGFROMSETCURSOR )) HandleMouseMsg( HIWORD(lParam), pt ); return TRUE; }
case WM_MOUSEACTIVATE: { return MA_NOACTIVATE; }
case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { POINT pt; POINTSTOPOINT( pt, MAKEPOINTS( lParam ) );
if (m_pBehindModalUIWnd) { m_pBehindModalUIWnd->ModalMouseNotify( uMsg, pt ); break; }
// handle mouse message
HandleMouseMsg( uMsg, pt ); break; }
case WM_NOTIFY: { OnNotify(hWnd, (int)wParam, (NMHDR *)lParam); break; }
case WM_NOTIFYFORMAT: { return OnNotifyFormat(hWnd, (HWND)wParam, lParam); break; }
case WM_KEYDOWN: { OnKeyDown(hWnd, wParam, lParam); return 0; }
case WM_KEYUP: { OnKeyUp(hWnd, wParam, lParam); return 0; }
case WM_PAINT: { HDC hDC; PAINTSTRUCT ps;
hDC = BeginPaint( hWnd, &ps ); PaintObject( hDC, &ps.rcPaint ); EndPaint( hWnd, &ps ); break; }
case WM_PRINTCLIENT: { HDC hDC = (HDC)wParam;
PaintObject( hDC, NULL ); break; }
case WM_DESTROY: { if (m_pWndToolTip) { if (IsWindow( m_pWndToolTip->GetWnd() )) { DestroyWindow( m_pWndToolTip->GetWnd() ); } }
if (m_pWndShadow) { if (IsWindow( m_pWndShadow->GetWnd() )) { DestroyWindow( m_pWndShadow->GetWnd() ); } }
OnDestroy(hWnd); break; }
case WM_NCDESTROY: { OnNCDestroy(hWnd); break; }
case WM_COMMAND: { break; }
case WM_TIMER: { switch (wParam) { case idTimer_MonitorMouse: { POINT pt; POINT ptClient; RECT rc; BOOL fMouseOut;
// get current cursor pos
GetCursorPos( &pt ); ptClient = pt; ScreenToClient( m_hWnd, &ptClient );
// check if mouse is outside of the window
GetWindowRect( m_hWnd, &rc ); fMouseOut = (!PtInRect( &rc, pt ) || WindowFromPoint( pt ) != m_hWnd);
// stop monitoring mouse when mouseout
if (fMouseOut) { ::KillTimer( m_hWnd, idTimer_MonitorMouse ); m_fCheckingMouse = FALSE;
SetObjectPointed( NULL, ptClient ); OnMouseOutFromWindow( ptClient ); }
// notify mouse movement
if (!fMouseOut && m_pBehindModalUIWnd) { m_pBehindModalUIWnd->ModalMouseNotify( WM_MOUSEMOVE, ptClient ); }
// tooltip
if (m_pWndToolTip != NULL) { MSG msg;
msg.hwnd = GetWnd(); msg.message = WM_MOUSEMOVE; msg.wParam = 0; msg.lParam = MAKELPARAM( ptClient.x, ptClient.y ); m_pWndToolTip->RelayEvent( &msg ); }
// handle mouse movement
if (!fMouseOut) { HandleMouseMsg( WM_MOUSEMOVE, ptClient ); } break; }
case idTimer_UIObject: { if (m_pTimerUIObj != NULL) m_pTimerUIObj->OnTimer(); break; }
default: { OnTimer((UINT)wParam ); break; } } break; }
case WM_ACTIVATE: { return OnActivate(hWnd, uMsg, wParam, lParam); break; }
case WM_WINDOWPOSCHANGED: { // move shadow
if (m_pWndShadow) { WINDOWPOS *pWndPos = (WINDOWPOS*)lParam;
m_pWndShadow->OnOwnerWndMoved( (pWndPos->flags & SWP_NOSIZE) == 0 ); } return OnWindowPosChanged(hWnd, uMsg, wParam, lParam); break; }
case WM_WINDOWPOSCHANGING: { // show/hide shadow
if (m_pWndShadow) { WINDOWPOS *pWndPos = (WINDOWPOS*)lParam;
if ((pWndPos->flags & SWP_HIDEWINDOW) != 0) { m_pWndShadow->Show( FALSE ); }
// don't go behaind of shadow
if (((pWndPos->flags & SWP_NOZORDER) == 0) && (pWndPos->hwndInsertAfter == m_pWndShadow->GetWnd())) { pWndPos->flags |= SWP_NOZORDER; }
m_pWndShadow->OnOwnerWndMoved( (pWndPos->flags & SWP_NOSIZE) == 0 ); }
return OnWindowPosChanging(hWnd, uMsg, wParam, lParam); break; }
case WM_SYSCOLORCHANGE: { UpdateUIFScheme(); OnSysColorChange(); break; }
case WM_SHOWWINDOW: { // show/hide shadow
if (m_pWndShadow && m_fShadowEnabled) { m_pWndShadow->Show( (BOOL)wParam ); }
return OnShowWindow( hWnd, uMsg, wParam, lParam ); break; }
case WM_SETTINGCHANGE: { UpdateUIFSys(); UpdateUIFScheme();
return OnSettingChange( hWnd, uMsg, wParam, lParam ); break; }
case WM_DISPLAYCHANGE: { UpdateUIFSys(); UpdateUIFScheme(); return OnDisplayChange( hWnd, uMsg, wParam, lParam ); break; }
case WM_ERASEBKGND: { return OnEraseBkGnd(hWnd, uMsg, wParam, lParam); }
case WM_ENDSESSION: { OnEndSession(hWnd, wParam, lParam); return 0; }
case WM_THEMECHANGED: { OnThemeChanged(hWnd, wParam, lParam); return 0; }
case WM_GETOBJECT: { return OnGetObject( hWnd, uMsg, wParam, lParam ); break; }
default: { if (uMsg >= WM_USER) { Assert( GetThis(hWnd) != NULL ); GetThis(hWnd)->OnUser(hWnd, uMsg, wParam, lParam); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } } /* of switch */
return 0; }
/* W I N D O W P R O C E D U R E */ /*------------------------------------------------------------------------------
Window procedure of the class
------------------------------------------------------------------------------*/ LRESULT CALLBACK CUIFWindow::WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; CUIFWindow *pUIWindow = NULL;
// preprcess
switch (uMsg) { #ifdef UNDER_CE
case WM_CREATE: { CREATESTRUCT *pCreateStruct = (CREATESTRUCT *)lParam;
pUIWindow = (CUIFWindow *)pCreateStruct->lpCreateParams;
SetThis( hWnd, pUIWindow ); pUIWindow->m_hWnd = hWnd; break; } #else /* !UNDER_CE */
case WM_NCCREATE: { CREATESTRUCT *pCreateStruct = (CREATESTRUCT *)lParam;
pUIWindow = (CUIFWindow *)pCreateStruct->lpCreateParams;
SetThis( hWnd, pUIWindow ); pUIWindow->m_hWnd = hWnd; break; }
case WM_GETMINMAXINFO: { pUIWindow = GetThis( hWnd ); if (pUIWindow == NULL) { // we may be able to ignore this message since the default position
// has been set in initializing WWindow object.
return DefWindowProc( hWnd, uMsg, wParam, lParam ); } break; } #endif /* !UNDER_CE */
default: { pUIWindow = GetThis( hWnd ); break; } }
// call window procedure
Assert( pUIWindow != NULL );
if (pUIWindow != NULL) { Assert(pUIWindow->FInitialized());
switch (uMsg) { #ifdef UNDER_CE
case WM_DESTROY: { #else /* !UNDER_CE */
case WM_NCDESTROY: { #endif /* !UNDER_CE */
pUIWindow->m_hWnd = NULL; SetThis( hWnd, NULL ); break; } }
lResult = pUIWindow->WindowProc( hWnd, uMsg, wParam, lParam ); }
return lResult; }
/* Adjust Window Pos
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
typedef HMONITOR (*MONITORFROMRECT)(LPRECT prc, DWORD dwFlags); typedef BOOL (*GETMONITORINFO)(HMONITOR hMonitor, LPMONITORINFO lpmi);
static MONITORFROMRECT g_pfnMonitorFromRect = NULL; static GETMONITORINFO g_pfnGetMonitorInfo = NULL;
/* InitMoniterFunc
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
BOOL CUIFWindow::InitMonitorFunc() { HMODULE hModUser32;
if (g_pfnMonitorFromRect && g_pfnGetMonitorInfo) return TRUE;
hModUser32 = CUIGetSystemModuleHandle(TEXT("user32.dll")); if (hModUser32) { g_pfnMonitorFromRect = (MONITORFROMRECT)GetProcAddress(hModUser32, "MonitorFromRect"); g_pfnGetMonitorInfo = (GETMONITORINFO)GetProcAddress(hModUser32, "GetMonitorInfoA"); }
if (g_pfnMonitorFromRect && g_pfnGetMonitorInfo) return TRUE;
return FALSE; }
/* GetWorkArea
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
BOOL CUIFWindow::GetWorkArea(RECT *prcIn, RECT *prcOut) { BOOL bRet = FALSE; HMONITOR hMon; MONITORINFO mi;
if (!FHasStyle( UIWINDOW_HABITATINWORKAREA | UIWINDOW_HABITATINSCREEN )) return FALSE;
if (!InitMonitorFunc()) goto TrySPI;
hMon = g_pfnMonitorFromRect(prcIn, MONITOR_DEFAULTTONEAREST); if (!hMon) goto TrySPI;
mi.cbSize = sizeof(mi); if (g_pfnGetMonitorInfo(hMon, &mi)) { if (FHasStyle( UIWINDOW_HABITATINWORKAREA )) { *prcOut = mi.rcWork; return TRUE; } else if (FHasStyle( UIWINDOW_HABITATINSCREEN )) { *prcOut = mi.rcMonitor; return TRUE; } return FALSE; }
TrySPI: if (FHasStyle( UIWINDOW_HABITATINWORKAREA )) { return SystemParametersInfo(SPI_GETWORKAREA, 0, prcOut, FALSE); } else if (FHasStyle( UIWINDOW_HABITATINSCREEN )) { prcOut->top = 0; prcOut->left = 0; prcOut->right = GetSystemMetrics(SM_CXSCREEN); prcOut->bottom = GetSystemMetrics(SM_CYSCREEN); return TRUE; } return FALSE; }
/* Adjust Window Position
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CUIFWindow::AdjustWindowPosition() { RECT rc; RECT rcWnd;
rcWnd.left = _xWnd; rcWnd.top = _yWnd; rcWnd.right = _xWnd + _nWidth; rcWnd.bottom = _yWnd + _nHeight; if (!GetWorkArea(&rcWnd, &rc)) return;
if (_xWnd < rc.left) _xWnd = rc.left;
if (_yWnd < rc.top) _yWnd = rc.top;
if (_xWnd + _nWidth >= rc.right) _xWnd = rc.right - _nWidth;
if (_yWnd + _nHeight >= rc.bottom) _yWnd = rc.bottom - _nHeight;
}
|