211 lines
4.8 KiB
Plaintext
211 lines
4.8 KiB
Plaintext
// 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);
|
|
}
|