Files
interactive/application/sp-console3/Common/GdStatic.cpp
T
2026-08-07 17:38:18 +09:00

211 lines
4.8 KiB
C++

// GdStatic.cpp : implementation file
//
#include "stdafx.h"
#include "GdStatic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGdStatic
CGdStatic::CGdStatic()
{
m_crText = ::GetSysColor(COLOR_3DFACE);
m_nFontWeight = FW_NORMAL;
m_nFontSize = 12;
}
CGdStatic::~CGdStatic()
{
if (m_bitmap.GetSafeHandle())
m_bitmap.DeleteObject();
if (m_fontCaption.GetSafeHandle())
m_fontCaption.DeleteObject();
if (m_fontName.GetSafeHandle())
m_fontName.DeleteObject();
}
BEGIN_MESSAGE_MAP(CGdStatic, CStatic)
//{{AFX_MSG_MAP(CGdStatic)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_SETTEXT, OnSetText)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGdStatic message handlers
void CGdStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CFont *pfontOld = NULL;
if (m_sFontName.GetLength() == 0) {
CWnd *pwndParent = GetParent();
if (pwndParent)
dc.SelectObject(pwndParent->GetFont());
}
else {
// create a font, if we need to
if (!m_fontCaption.GetSafeHandle()) {
m_fontCaption.CreateFont( m_nFontSize,
0, 0, 0, m_nFontWeight,
0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
FF_MODERN,
m_sFontName);
}
if (m_fontCaption.GetSafeHandle())
pfontOld = dc.SelectObject(&m_fontCaption);
}
// Draw text
CString sText;
GetWindowText(sText);
dc.SetTextColor(m_crText);
dc.SetBkMode(TRANSPARENT);
// vertical center
CRect rc;
GetClientRect(rc);
rc.left += 5;
dc.DrawText(sText, rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
if (pfontOld)
dc.SelectObject(pfontOld);
}
BOOL CGdStatic::OnEraseBkgnd(CDC* pDC)
{
if (!m_bitmap.GetSafeHandle())
MakeCaptionBitmap();
if (m_bitmap.GetSafeHandle()) {
CRect rc;
GetClientRect(rc);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pbitmap = memDC.SelectObject(&m_bitmap);
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0,0, SRCCOPY);
memDC.SelectObject(pbitmap);
}
return TRUE;
}
LRESULT CGdStatic::OnSetText(WPARAM wParam, LPARAM lParam)
{
DefWindowProc(WM_SETTEXT, wParam, lParam);
Invalidate(TRUE);
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////////
// Helper to paint rectangle with a color.
static void PaintRect(CDC& dc, int x, int y, int w, int h, COLORREF cr)
{
CBrush br(cr);
CBrush* pbrOld = dc.SelectObject(&br);
dc.PatBlt(x, y, w, h, PATCOPY);
dc.SelectObject(pbrOld);
}
void CGdStatic::MakeCaptionBitmap()
{
if (m_bitmap.m_hObject)
return; // already have bitmap; return
CRect rc;
GetClientRect(rc);
int w = rc.Width();
int h = rc.Height();
// Create bitmap same size as caption area and select into memory DC
CWindowDC dcWin(this);
CDC dc;
dc.CreateCompatibleDC(&dcWin);
m_bitmap.DeleteObject();
m_bitmap.CreateCompatibleBitmap(&dcWin, w, h);
CBitmap* pbitmapOld = dc.SelectObject(&m_bitmap);
COLORREF crBG = ::GetSysColor(COLOR_3DFACE); // background color
int r = GetRValue(crBG); // red..
int g = GetGValue(crBG); // ..green
int b = GetBValue(crBG); // ..blue color vals
int x = 8*rc.right/8; // start 5/6 of the way right
int w1 = x - rc.left; // width of area to shade
const int NCOLORSHADES = 128; // this many shades in gradient
int xDelta = max(w / NCOLORSHADES , 1); // width of one shade band
PaintRect(dc, x, 0, rc.right-x, h, crBG);
while (x > xDelta) { // paint bands right to left
x -= xDelta; // next band
int wmx2 = (w1-x)*(w1-x); // w minus x squared
int w2 = w1*w1; // w squared
PaintRect(dc, x, 0, xDelta, h, RGB(r-(r*wmx2)/w2, g-(g*wmx2)/w2, b-(b*wmx2)/w2));
}
PaintRect(dc,0,0,x,h,RGB(0,0,0)); // whatever's left ==> black
// draw the 'constant' text
// create a font, if we need to
if (m_fontName.GetSafeHandle()==NULL) {
m_fontName.CreateFont( 18, 0, 0, 0, FW_BOLD,
0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
FF_MODERN,
m_sFontName);
}
CFont * pfontOld = dc.SelectObject(&m_fontName);
// back up a little
rc.right -= 5;
// draw text in DC
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(::GetSysColor( COLOR_3DHILIGHT));
dc.DrawText(m_sConstantText, rc + CPoint(1,1), DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
dc.SetTextColor(::GetSysColor( COLOR_3DSHADOW));
dc.DrawText(m_sConstantText, rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
// restore old font
dc.SelectObject(pfontOld);
// Restore DC
dc.SelectObject(pbitmapOld);
}