256 lines
6.0 KiB
C++
256 lines
6.0 KiB
C++
/*********************************************************************
|
|
|
|
SAPrefsStatic
|
|
|
|
Copyright (C) 2000 Smaller Animals Software, Inc.
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
http://www.smalleranimals.com
|
|
smallest@smalleranimals.com
|
|
|
|
**********************************************************************/
|
|
|
|
// SAPrefsStatic.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "../resource.h"
|
|
#include "SAPrefsStatic.h"
|
|
|
|
#if defined(_DEBUG) && !defined(MMGR)
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSAPrefsStatic
|
|
|
|
CSAPrefsStatic::CSAPrefsStatic()
|
|
{
|
|
m_textClr = ::GetSysColor (COLOR_3DFACE);
|
|
m_fontWeight = FW_NORMAL;
|
|
m_fontSize = 12;
|
|
}
|
|
|
|
CSAPrefsStatic::~CSAPrefsStatic()
|
|
{
|
|
if (m_bm.GetSafeHandle())
|
|
{
|
|
m_bm.DeleteObject();
|
|
}
|
|
|
|
if (m_captionFont.GetSafeHandle())
|
|
{
|
|
m_captionFont.DeleteObject();
|
|
}
|
|
|
|
if (m_nameFont.GetSafeHandle())
|
|
{
|
|
m_nameFont.DeleteObject();
|
|
}
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CSAPrefsStatic, CStatic)
|
|
//{{AFX_MSG_MAP(CSAPrefsStatic)
|
|
ON_WM_PAINT()
|
|
ON_WM_ERASEBKGND()
|
|
ON_MESSAGE( WM_SETTEXT, OnSetText )
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSAPrefsStatic message handlers
|
|
|
|
void CSAPrefsStatic::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
CFont *pOldFont = NULL;
|
|
|
|
// Set default font
|
|
if (m_csFontName=="")
|
|
{
|
|
CWnd *pWndParent = GetParent();
|
|
if (pWndParent)
|
|
{
|
|
dc.SelectObject (pWndParent->GetFont());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// create a font, if we need to
|
|
if (m_captionFont.GetSafeHandle()==NULL)
|
|
{
|
|
m_captionFont.CreateFont( m_fontSize,
|
|
0, 0, 0,
|
|
m_fontWeight,
|
|
0, 0, 0, ANSI_CHARSET,
|
|
OUT_DEFAULT_PRECIS,
|
|
CLIP_DEFAULT_PRECIS,
|
|
DEFAULT_QUALITY,
|
|
FF_MODERN,
|
|
m_csFontName);
|
|
}
|
|
|
|
if (m_captionFont.GetSafeHandle()!=NULL)
|
|
pOldFont = dc.SelectObject(&m_captionFont);
|
|
}
|
|
|
|
// Draw text
|
|
CString strText;
|
|
GetWindowText(strText);
|
|
|
|
dc.SetTextColor(m_textClr);
|
|
dc.SetBkMode(TRANSPARENT);
|
|
|
|
// vertical center
|
|
CRect cr;
|
|
GetClientRect(cr);
|
|
|
|
cr.left+=5;
|
|
dc.DrawText( strText, cr, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
|
|
|
|
if (pOldFont)
|
|
dc.SelectObject(pOldFont);
|
|
}
|
|
|
|
BOOL CSAPrefsStatic::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
if (!m_bm.GetSafeHandle())
|
|
{
|
|
MakeCaptionBitmap();
|
|
}
|
|
|
|
if (m_bm.GetSafeHandle())
|
|
{
|
|
CRect cr;
|
|
GetClientRect(cr);
|
|
|
|
CDC memDC;
|
|
memDC.CreateCompatibleDC(pDC);
|
|
|
|
CBitmap *pOB = memDC.SelectObject(&m_bm);
|
|
|
|
pDC->BitBlt(0,0,cr.Width(), cr.Height(), &memDC, 0,0, SRCCOPY);
|
|
|
|
memDC.SelectObject(pOB);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
LRESULT CSAPrefsStatic::OnSetText(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
DefWindowProc (WM_SETTEXT, wParam, lParam);
|
|
Invalidate(TRUE);
|
|
return 1;
|
|
}
|
|
|
|
|
|
//////////////////
|
|
// Helper to paint rectangle with a color.
|
|
//
|
|
static void PaintRect(CDC& dc, int x, int y, int w, int h, COLORREF color)
|
|
{
|
|
CBrush brush(color);
|
|
CBrush* pOldBrush = dc.SelectObject(&brush);
|
|
dc.PatBlt(x, y, w, h, PATCOPY);
|
|
dc.SelectObject(pOldBrush);
|
|
}
|
|
|
|
void CSAPrefsStatic::MakeCaptionBitmap()
|
|
{
|
|
if (m_bm.m_hObject)
|
|
return; // already have bitmap; return
|
|
|
|
CRect cr;
|
|
GetClientRect(cr);
|
|
int w = cr.Width();
|
|
int h = cr.Height();
|
|
|
|
// Create bitmap same size as caption area and select into memory DC
|
|
//
|
|
CWindowDC dcWin(this);
|
|
CDC dc;
|
|
dc.CreateCompatibleDC(&dcWin);
|
|
m_bm.DeleteObject();
|
|
m_bm.CreateCompatibleBitmap(&dcWin, w, h);
|
|
CBitmap* pOldBitmap = dc.SelectObject(&m_bm);
|
|
|
|
COLORREF clrBG = ::GetSysColor(COLOR_3DFACE); // background color
|
|
int r = GetRValue(clrBG); // red..
|
|
int g = GetGValue(clrBG); // ..green
|
|
int b = GetBValue(clrBG); // ..blue color vals
|
|
int x = 8*cr.right/8; // start 5/6 of the way right
|
|
int w1 = x - cr.left; // width of area to shade
|
|
|
|
int NCOLORSHADES = 128; // this many shades in gradient
|
|
|
|
int xDelta= max( w / NCOLORSHADES , 1); // width of one shade band
|
|
|
|
PaintRect(dc, x, 0, cr.right-x, h, clrBG);
|
|
|
|
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_nameFont.GetSafeHandle()==NULL)
|
|
{
|
|
m_nameFont.CreateFont( 18, 0, 0, 0, FW_BOLD,
|
|
0, 0, 0, ANSI_CHARSET,
|
|
OUT_DEFAULT_PRECIS,
|
|
CLIP_DEFAULT_PRECIS,
|
|
DEFAULT_QUALITY,
|
|
FF_MODERN,
|
|
m_csFontName);
|
|
}
|
|
|
|
CFont * OldFont = dc.SelectObject(&m_nameFont);
|
|
|
|
// back up a little
|
|
cr.right-=5;
|
|
|
|
// draw text in DC
|
|
dc.SetBkMode(TRANSPARENT);
|
|
dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT));
|
|
dc.DrawText( m_csConstantText, cr + CPoint(1,1), DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
|
|
dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
|
|
dc.DrawText( m_csConstantText, cr, DT_SINGLELINE | DT_RIGHT | DT_VCENTER);
|
|
|
|
// restore old font
|
|
dc.SelectObject(OldFont);
|
|
|
|
// Restore DC
|
|
dc.SelectObject(pOldBitmap);
|
|
}
|