You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
6.4 KiB
227 lines
6.4 KiB
//========= 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; |
|
} |
|
|
|
|