text: ﻿//========= Copyright � 1996-2005, 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;
  }
  
  