diff options
Diffstat (limited to 'hammer/titlewnd.cpp')
| -rw-r--r-- | hammer/titlewnd.cpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/hammer/titlewnd.cpp b/hammer/titlewnd.cpp new file mode 100644 index 0000000..cd31d22 --- /dev/null +++ b/hammer/titlewnd.cpp @@ -0,0 +1,227 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "stdafx.h" +#include <commctrl.h> +#include "TitleWnd.h" +#include "MainFrm.h" +#include "Resource.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +CFont CTitleWnd::m_FontNormal; +CFont CTitleWnd::m_FontActive; + + +BEGIN_MESSAGE_MAP(CTitleWnd, CWnd) + ON_WM_PAINT() + ON_WM_RBUTTONDOWN() + ON_WM_LBUTTONDOWN() + ON_WM_MOUSEMOVE() + ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) +END_MESSAGE_MAP() + + +//----------------------------------------------------------------------------- +// Purpose: Factory. Registers the title window class if necessary and creates +// a title window. +// Input : pwndParent - Pointer to parent window. +// uID - Window ID to use for the title window. +// Output : Returns a pointer to the newly created title window. +//----------------------------------------------------------------------------- +CTitleWnd *CTitleWnd::CreateTitleWnd(CWnd *pwndParent, UINT uID) +{ + // + // Register the window class if we have not done so already. + // + static CString strTitleWndClass; + if (strTitleWndClass.IsEmpty()) + { + strTitleWndClass = AfxRegisterWndClass(CS_BYTEALIGNCLIENT, AfxGetApp()->LoadStandardCursor(IDC_ARROW), HBRUSH(GetStockObject(BLACK_BRUSH))); + } + + // + // Create the title window. + // + CTitleWnd *pWnd = new CTitleWnd(); + if (pWnd != NULL) + { + pWnd->Create(strTitleWndClass, "Title Window", WS_CHILD | WS_VISIBLE, CRect(0, 0, 5, 5), pwndParent, uID); + } + + return(pWnd); +} + + +//----------------------------------------------------------------------------- +// Purpose: Constructor. Creates fonts the first time it is called. +//----------------------------------------------------------------------------- +CTitleWnd::CTitleWnd(void) +{ + if (!m_FontNormal.m_hObject) + { + // + // Create two fonts, a normal one and a bold one for when we are active. + // + m_FontNormal.CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); + m_FontActive.CreateFont(16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); + } + + m_bMenuOpen = false; + m_bMouseOver = false; + m_szTitle[0] = '\0'; +} + + +//----------------------------------------------------------------------------- +// Purpose: Sets the text to display in the window. The window size is recalculated +// to ensure that the text fits. +// Input : pszTitle - Text to display in the window. +//----------------------------------------------------------------------------- +void CTitleWnd::SetTitle(LPCTSTR pszTitle) +{ + Assert(pszTitle != NULL); + if (pszTitle != NULL) + { + strcpy(m_szTitle, pszTitle); + if (::IsWindow(m_hWnd)) + { + CDC *pDC = GetDC(); + if (pDC != NULL) + { + pDC->SelectObject(&m_FontActive); + CSize TextSize = pDC->GetTextExtent(m_szTitle, strlen(m_szTitle)); + SetWindowPos(NULL, 0, 0, TextSize.cx, TextSize.cy, SWP_NOMOVE | SWP_NOZORDER); + Invalidate(); + UpdateWindow(); + } + } + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Turns off the active font when the mouse leaves our client area. +// Input : Per WM_MOUSELEAVE. +//----------------------------------------------------------------------------- +LRESULT CTitleWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam) +{ + m_bMouseOver = false; + Invalidate(); + UpdateWindow(); + return(0); +} + + +//----------------------------------------------------------------------------- +// Purpose: Enables mouse tracking so we can render with a special font when +// the mouse floats over the window. +// Input : Per MFC OnMouseMove. +//----------------------------------------------------------------------------- +void CTitleWnd::OnMouseMove(UINT nFlags, CPoint point) +{ + if (!m_bMouseOver) + { + TRACKMOUSEEVENT Track; + Track.cbSize = sizeof(Track); + Track.dwFlags = TME_HOVER | TME_LEAVE; + Track.hwndTrack = m_hWnd; + Track.dwHoverTime = 0.1; + + _TrackMouseEvent(&Track); + + m_bMouseOver = true; + + Invalidate(); + UpdateWindow(); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Renders the title window. A special font is used if the mouse is +// over the title window or if the window's menu is open. +//----------------------------------------------------------------------------- +void CTitleWnd::OnPaint(void) +{ + if (m_szTitle[0] != '\0') + { + if (GetUpdateRect(NULL, TRUE)) + { + CPaintDC dc(this); + CFont *pFontOld; + + if ((m_bMouseOver) || (m_bMenuOpen)) + { + pFontOld = dc.SelectObject(&m_FontActive); + dc.SetTextColor(RGB(255, 255, 255)); + } + else + { + pFontOld = dc.SelectObject(&m_FontNormal); + dc.SetTextColor(RGB(200, 200, 200)); + } + + dc.SetBkMode(TRANSPARENT); + dc.TextOut(0, 0, m_szTitle, strlen(m_szTitle)); + dc.SelectObject(pFontOld); + } + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Opens the context menu when right-clicked upon. +// Input : Per MFC OnRightButtonDown. +//----------------------------------------------------------------------------- +void CTitleWnd::OnLButtonDown(UINT nFlags, CPoint point) +{ + OnMouseButton(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Opens the context menu when right-clicked upon. +// Input : Per MFC OnRightButtonDown. +//----------------------------------------------------------------------------- +void CTitleWnd::OnRButtonDown(UINT nFlags, CPoint point) +{ + OnMouseButton(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Opens the context menu when right-clicked upon. +// Input : Per MFC OnRightButtonDown. +//----------------------------------------------------------------------------- +void CTitleWnd::OnMouseButton(void) +{ + static BOOL bFirstTime = TRUE; + static CMenu Menu; + + if (bFirstTime) + { + Menu.LoadMenu(IDR_POPUPS); + bFirstTime = FALSE; + } + + CMenu *pPopupMenu = Menu.GetSubMenu(5); + Assert(pPopupMenu); + + CRect rect; + GetClientRect(&rect); + + CPoint MenuLocation(0, rect.bottom); + ClientToScreen(&MenuLocation); + + m_bMenuOpen = true; + pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, MenuLocation.x, MenuLocation.y, (CWnd *)GetMainWnd(), NULL); + m_bMenuOpen = false; +} + |