mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-05 22:09:59 +03:00
1
This commit is contained in:
227
hammer/titlewnd.cpp
Normal file
227
hammer/titlewnd.cpp
Normal file
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user