Descent3/legacy/D3Launch/Label.cpp
2024-06-15 20:13:59 +02:00

255 lines
5.1 KiB
C++

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// Label.cpp : implementation file
//
#include "stdafx.h"
#include "Resource.h"
#include "Label.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLabel
CLabel::CLabel() {
m_crText = GetSysColor(COLOR_WINDOWTEXT);
m_hBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE));
::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(m_lf), &m_lf);
m_font.CreateFontIndirect(&m_lf);
m_bTimer = FALSE;
m_bState = FALSE;
m_bLink = TRUE;
m_hCursor = NULL;
m_Type = None;
m_hwndBrush = ::CreateSolidBrush(GetSysColor(COLOR_3DFACE));
}
CLabel::~CLabel() {
m_font.DeleteObject();
::DeleteObject(m_hBrush);
}
CLabel &CLabel::SetText(const CString &strText) {
SetWindowText(strText);
return *this;
}
CLabel &CLabel::SetTextColor(COLORREF crText) {
m_crText = crText;
RedrawWindow();
return *this;
}
CLabel &CLabel::SetFontBold(BOOL bBold) {
m_lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
ReconstructFont();
RedrawWindow();
return *this;
}
CLabel &CLabel::SetFontUnderline(BOOL bSet) {
m_lf.lfUnderline = bSet;
ReconstructFont();
RedrawWindow();
return *this;
}
CLabel &CLabel::SetFontItalic(BOOL bSet) {
m_lf.lfItalic = bSet;
ReconstructFont();
RedrawWindow();
return *this;
}
CLabel &CLabel::SetSunken(BOOL bSet) {
if (!bSet)
ModifyStyleEx(WS_EX_STATICEDGE, 0, SWP_DRAWFRAME);
else
ModifyStyleEx(0, WS_EX_STATICEDGE, SWP_DRAWFRAME);
return *this;
}
CLabel &CLabel::SetBorder(BOOL bSet) {
if (!bSet)
ModifyStyle(WS_BORDER, 0, SWP_DRAWFRAME);
else
ModifyStyle(0, WS_BORDER, SWP_DRAWFRAME);
return *this;
}
CLabel &CLabel::SetFontSize(int nSize) {
nSize *= -1;
m_lf.lfHeight = nSize;
ReconstructFont();
RedrawWindow();
return *this;
}
CLabel &CLabel::SetBkColor(COLORREF crBkgnd) {
if (m_hBrush)
::DeleteObject(m_hBrush);
m_hBrush = ::CreateSolidBrush(crBkgnd);
return *this;
}
CLabel &CLabel::SetFontName(const CString &strFont) {
strcpy(m_lf.lfFaceName, strFont);
ReconstructFont();
RedrawWindow();
return *this;
}
BEGIN_MESSAGE_MAP(CLabel, CStatic)
//{{AFX_MSG_MAP(CLabel)
ON_WM_CTLCOLOR_REFLECT()
ON_WM_TIMER()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLabel message handlers
HBRUSH CLabel::CtlColor(CDC *pDC, UINT nCtlColor) {
// TODO: Change any attributes of the DC here
// TODO: Return a non-NULL brush if the parent's handler should not be called
if (CTLCOLOR_STATIC == nCtlColor) {
pDC->SelectObject(&m_font);
pDC->SetTextColor(m_crText);
pDC->SetBkMode(TRANSPARENT);
}
if (m_Type == Background) {
if (!m_bState)
return m_hwndBrush;
}
return m_hBrush;
}
void CLabel::ReconstructFont() {
m_font.DeleteObject();
BOOL bCreated = m_font.CreateFontIndirect(&m_lf);
ASSERT(bCreated);
}
CLabel &CLabel::FlashText(BOOL bActivate) {
if (m_bTimer) {
SetWindowText(m_strText);
KillTimer(1);
}
if (bActivate) {
GetWindowText(m_strText);
m_bState = FALSE;
m_bTimer = TRUE;
SetTimer(1, 500, NULL);
m_Type = Text;
}
return *this;
}
CLabel &CLabel::FlashBackground(BOOL bActivate) {
if (m_bTimer)
KillTimer(1);
if (bActivate) {
m_bState = FALSE;
m_bTimer = TRUE;
SetTimer(1, 500, NULL);
m_Type = Background;
}
return *this;
}
void CLabel::OnTimer(UINT nIDEvent) {
m_bState = !m_bState;
switch (m_Type) {
case Text:
if (m_bState)
SetWindowText("");
else
SetWindowText(m_strText);
break;
case Background:
InvalidateRect(NULL, FALSE);
UpdateWindow();
break;
}
CStatic::OnTimer(nIDEvent);
}
CLabel &CLabel::SetLink(BOOL bLink) {
m_bLink = bLink;
if (bLink)
ModifyStyle(0, SS_NOTIFY);
else
ModifyStyle(SS_NOTIFY, 0);
return *this;
}
void CLabel::OnLButtonDown(UINT nFlags, CPoint point) {
CString strLink;
GetWindowText(strLink);
ShellExecute(NULL, "open", strLink, NULL, NULL, SW_SHOWNORMAL);
CStatic::OnLButtonDown(nFlags, point);
}
BOOL CLabel::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message) {
if (m_hCursor) {
::SetCursor(m_hCursor);
return TRUE;
}
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
CLabel &CLabel::SetLinkCursor(HCURSOR hCursor) {
m_hCursor = hCursor;
return *this;
}