//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "stdafx.h" #include #include "TitleWnd.h" #include "MainFrm.h" #include "Resource.h" // memdbgon must be the last include file in a .cpp file!!! #include 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; }