forked from metin2/client
235 lines
6.9 KiB
C++
235 lines
6.9 KiB
C++
|
/////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CSizingControlBarCF Version 2.43
|
||
|
//
|
||
|
// Created: Dec 21, 1998 Last Modified: August 03, 2000
|
||
|
//
|
||
|
// See the official site at www.datamekanix.com for documentation and
|
||
|
// the latest news.
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// Copyright (C) 1998-2000 by Cristi Posea. All rights reserved.
|
||
|
//
|
||
|
// This code is free for personal and commercial use, providing this
|
||
|
// notice remains intact in the source files and all eventual changes are
|
||
|
// clearly marked with comments.
|
||
|
//
|
||
|
// You must obtain the author's consent before you can include this code
|
||
|
// in a software library.
|
||
|
//
|
||
|
// No warrantee of any kind, express or implied, is included with this
|
||
|
// software; use at your own risk, responsibility for damages (if any) to
|
||
|
// anyone resulting from the use of this software rests entirely with the
|
||
|
// user.
|
||
|
//
|
||
|
// Send bug reports, bug fixes, enhancements, requests, flames, etc. to
|
||
|
// cristi@datamekanix.com or post them at the message board at the site.
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include <stdafx.h>
|
||
|
#include "scbarcf.h"
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////
|
||
|
// CSizingControlBarCF
|
||
|
|
||
|
IMPLEMENT_DYNAMIC(CSizingControlBarCF, baseCSizingControlBarCF);
|
||
|
|
||
|
int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,
|
||
|
NEWTEXTMETRIC FAR *lpntm,
|
||
|
int FontType,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
UNUSED_ALWAYS(lpelf);
|
||
|
UNUSED_ALWAYS(lpntm);
|
||
|
UNUSED_ALWAYS(FontType);
|
||
|
UNUSED_ALWAYS(lParam);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
CSizingControlBarCF::CSizingControlBarCF()
|
||
|
{
|
||
|
m_bActive = FALSE;
|
||
|
|
||
|
CDC dc;
|
||
|
dc.CreateCompatibleDC(NULL);
|
||
|
|
||
|
m_sFontFace = (::EnumFontFamilies(dc.m_hDC,
|
||
|
_T("Tahoma"), (FONTENUMPROC) EnumFontFamProc, 0) == 0) ?
|
||
|
_T("Tahoma") : _T("Arial");
|
||
|
|
||
|
dc.DeleteDC();
|
||
|
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CSizingControlBarCF, baseCSizingControlBarCF)
|
||
|
//{{AFX_MSG_MAP(CSizingControlBarCF)
|
||
|
//}}AFX_MSG_MAP
|
||
|
ON_MESSAGE(WM_SETTEXT, OnSetText)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
void CSizingControlBarCF::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
|
||
|
{
|
||
|
baseCSizingControlBarCF::OnUpdateCmdUI(pTarget, bDisableIfNoHndler);
|
||
|
|
||
|
if (!HasGripper())
|
||
|
return;
|
||
|
|
||
|
BOOL bNeedPaint = FALSE;
|
||
|
|
||
|
CWnd* pFocus = GetFocus();
|
||
|
BOOL bActiveOld = m_bActive;
|
||
|
|
||
|
m_bActive = (pFocus->GetSafeHwnd() && IsChild(pFocus));
|
||
|
|
||
|
if (m_bActive != bActiveOld)
|
||
|
bNeedPaint = TRUE;
|
||
|
|
||
|
if (bNeedPaint)
|
||
|
SendMessage(WM_NCPAINT);
|
||
|
}
|
||
|
|
||
|
// gradient defines (if not already defined)
|
||
|
#ifndef COLOR_GRADIENTACTIVECAPTION
|
||
|
#define COLOR_GRADIENTACTIVECAPTION 27
|
||
|
#define COLOR_GRADIENTINACTIVECAPTION 28
|
||
|
#define SPI_GETGRADIENTCAPTIONS 0x1008
|
||
|
#endif
|
||
|
|
||
|
void CSizingControlBarCF::NcPaintGripper(CDC* pDC, CRect rcClient)
|
||
|
{
|
||
|
if (!HasGripper())
|
||
|
return;
|
||
|
|
||
|
// compute the caption rectangle
|
||
|
BOOL bHorz = IsHorzDocked();
|
||
|
CRect rcGrip = rcClient;
|
||
|
CRect rcBtn = m_biHide.GetRect();
|
||
|
if (bHorz)
|
||
|
{ // right side gripper
|
||
|
rcGrip.left -= m_cyGripper + 1;
|
||
|
rcGrip.right = rcGrip.left + 11;
|
||
|
rcGrip.top = rcBtn.bottom + 3;
|
||
|
}
|
||
|
else
|
||
|
{ // gripper at top
|
||
|
rcGrip.top -= m_cyGripper + 1;
|
||
|
rcGrip.bottom = rcGrip.top + 11;
|
||
|
rcGrip.right = rcBtn.left - 3;
|
||
|
}
|
||
|
rcGrip.InflateRect(bHorz ? 1 : 0, bHorz ? 0 : 1);
|
||
|
|
||
|
// draw the caption background
|
||
|
//CBrush br;
|
||
|
COLORREF clrCptn = m_bActive ?
|
||
|
::GetSysColor(COLOR_ACTIVECAPTION) :
|
||
|
::GetSysColor(COLOR_INACTIVECAPTION);
|
||
|
|
||
|
// query gradient info (usually TRUE for Win98/Win2k)
|
||
|
BOOL bGradient = FALSE;
|
||
|
::SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &bGradient, 0);
|
||
|
|
||
|
if (!bGradient)
|
||
|
pDC->FillSolidRect(&rcGrip, clrCptn); // solid color
|
||
|
else
|
||
|
{
|
||
|
// gradient from left to right or from bottom to top
|
||
|
// get second gradient color (the right end)
|
||
|
COLORREF clrCptnRight = m_bActive ?
|
||
|
::GetSysColor(COLOR_GRADIENTACTIVECAPTION) :
|
||
|
::GetSysColor(COLOR_GRADIENTINACTIVECAPTION);
|
||
|
|
||
|
// this will make 2^6 = 64 fountain steps
|
||
|
int nShift = 6;
|
||
|
int nSteps = 1 << nShift;
|
||
|
|
||
|
for (int i = 0; i < nSteps; i++)
|
||
|
{
|
||
|
// do a little alpha blending
|
||
|
int nR = (GetRValue(clrCptn) * (nSteps - i) +
|
||
|
GetRValue(clrCptnRight) * i) >> nShift;
|
||
|
int nG = (GetGValue(clrCptn) * (nSteps - i) +
|
||
|
GetGValue(clrCptnRight) * i) >> nShift;
|
||
|
int nB = (GetBValue(clrCptn) * (nSteps - i) +
|
||
|
GetBValue(clrCptnRight) * i) >> nShift;
|
||
|
|
||
|
COLORREF cr = RGB(nR, nG, nB);
|
||
|
|
||
|
// then paint with the resulting color
|
||
|
CRect r2 = rcGrip;
|
||
|
if (bHorz)
|
||
|
{
|
||
|
r2.bottom = rcGrip.bottom -
|
||
|
((i * rcGrip.Height()) >> nShift);
|
||
|
r2.top = rcGrip.bottom -
|
||
|
(((i + 1) * rcGrip.Height()) >> nShift);
|
||
|
if (r2.Height() > 0)
|
||
|
pDC->FillSolidRect(r2, cr);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
r2.left = rcGrip.left +
|
||
|
((i * rcGrip.Width()) >> nShift);
|
||
|
r2.right = rcGrip.left +
|
||
|
(((i + 1) * rcGrip.Width()) >> nShift);
|
||
|
if (r2.Width() > 0)
|
||
|
pDC->FillSolidRect(r2, cr);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// draw the caption text - first select a font
|
||
|
CFont font;
|
||
|
int ppi = pDC->GetDeviceCaps(LOGPIXELSX);
|
||
|
int pointsize = MulDiv(85, 96, ppi); // 8.5 points at 96 ppi
|
||
|
|
||
|
LOGFONT lf;
|
||
|
BOOL bFont = font.CreatePointFont(pointsize, m_sFontFace);
|
||
|
if (bFont)
|
||
|
{
|
||
|
// get the text color
|
||
|
COLORREF clrCptnText = m_bActive ?
|
||
|
::GetSysColor(COLOR_CAPTIONTEXT) :
|
||
|
::GetSysColor(COLOR_INACTIVECAPTIONTEXT);
|
||
|
|
||
|
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
|
||
|
COLORREF clrOldText = pDC->SetTextColor(clrCptnText);
|
||
|
|
||
|
if (bHorz)
|
||
|
{
|
||
|
// rotate text 90 degrees CCW if horizontally docked
|
||
|
font.GetLogFont(&lf);
|
||
|
font.DeleteObject();
|
||
|
lf.lfEscapement = 900;
|
||
|
font.CreateFontIndirect(&lf);
|
||
|
}
|
||
|
|
||
|
CFont* pOldFont = pDC->SelectObject(&font);
|
||
|
CString sTitle;
|
||
|
GetWindowText(sTitle);
|
||
|
|
||
|
CPoint ptOrg = bHorz ?
|
||
|
CPoint(rcGrip.left - 1, rcGrip.bottom - 3) :
|
||
|
CPoint(rcGrip.left + 3, rcGrip.top - 1);
|
||
|
|
||
|
pDC->ExtTextOut(ptOrg.x, ptOrg.y,
|
||
|
ETO_CLIPPED, rcGrip, sTitle, NULL);
|
||
|
|
||
|
pDC->SelectObject(pOldFont);
|
||
|
pDC->SetBkMode(nOldBkMode);
|
||
|
pDC->SetTextColor(clrOldText);
|
||
|
}
|
||
|
|
||
|
// draw the button
|
||
|
m_biHide.Paint(pDC);
|
||
|
}
|
||
|
|
||
|
LRESULT CSizingControlBarCF::OnSetText(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
LRESULT lResult = baseCSizingControlBarCF::OnSetText(wParam, lParam);
|
||
|
|
||
|
SendMessage(WM_NCPAINT);
|
||
|
|
||
|
return lResult;
|
||
|
}
|