mirror of
https://github.com/blendogames/quadrilateralcowboy.git
synced 2025-02-28 22:21:25 +00:00
369 lines
7.4 KiB
C++
369 lines
7.4 KiB
C++
// PropTreeItemColor.cpp : implementation file
|
|
//
|
|
// Copyright (C) 1998-2001 Scott Ramsay
|
|
// sramsay@gonavi.com
|
|
// http://www.gonavi.com
|
|
//
|
|
// This material is provided "as is", with absolutely no warranty expressed
|
|
// or implied. Any use is at your own risk.
|
|
//
|
|
// Permission to use or copy this software for any purpose is hereby granted
|
|
// without fee, provided the above notices are retained on all copies.
|
|
// Permission to modify the code and to distribute modified code is granted,
|
|
// provided the above notices are retained, and a notice that the code was
|
|
// modified is included with the above copyright notice.
|
|
//
|
|
// If you use this code, drop me an email. I'd like to know if you find the code
|
|
// useful.
|
|
|
|
//#include "stdafx.h"
|
|
#include "../../../idlib/precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#include "PropTree.h"
|
|
#include "../../../sys/win32/rc/proptree_Resource.h"
|
|
#include "PropTreeItemColor.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern HINSTANCE ghInst;
|
|
|
|
typedef struct _ColorTableEntry
|
|
{
|
|
COLORREF color;
|
|
RECT rcSpot;
|
|
} ColorTableEntry;
|
|
|
|
static ColorTableEntry _crColors[] =
|
|
{
|
|
{RGB(0x00, 0x00, 0x00)},
|
|
{RGB(0xA5, 0x2A, 0x00)},
|
|
{RGB(0x00, 0x40, 0x40)},
|
|
{RGB(0x00, 0x55, 0x00)},
|
|
{RGB(0x00, 0x00, 0x5E)},
|
|
{RGB(0x00, 0x00, 0x8B)},
|
|
{RGB(0x4B, 0x00, 0x82)},
|
|
{RGB(0x28, 0x28, 0x28)},
|
|
|
|
{RGB(0x8B, 0x00, 0x00)},
|
|
{RGB(0xFF, 0x68, 0x20)},
|
|
{RGB(0x8B, 0x8B, 0x00)},
|
|
{RGB(0x00, 0x93, 0x00)},
|
|
{RGB(0x38, 0x8E, 0x8E)},
|
|
{RGB(0x00, 0x00, 0xFF)},
|
|
{RGB(0x7B, 0x7B, 0xC0)},
|
|
{RGB(0x66, 0x66, 0x66)},
|
|
|
|
{RGB(0xFF, 0x00, 0x00)},
|
|
{RGB(0xFF, 0xAD, 0x5B)},
|
|
{RGB(0x32, 0xCD, 0x32)},
|
|
{RGB(0x3C, 0xB3, 0x71)},
|
|
{RGB(0x7F, 0xFF, 0xD4)},
|
|
{RGB(0x7D, 0x9E, 0xC0)},
|
|
{RGB(0x80, 0x00, 0x80)},
|
|
{RGB(0x7F, 0x7F, 0x7F)},
|
|
|
|
{RGB(0xFF, 0xC0, 0xCB)},
|
|
{RGB(0xFF, 0xD7, 0x00)},
|
|
{RGB(0xFF, 0xFF, 0x00)},
|
|
{RGB(0x00, 0xFF, 0x00)},
|
|
{RGB(0x40, 0xE0, 0xD0)},
|
|
{RGB(0xC0, 0xFF, 0xFF)},
|
|
{RGB(0x48, 0x00, 0x48)},
|
|
{RGB(0xC0, 0xC0, 0xC0)},
|
|
|
|
{RGB(0xFF, 0xE4, 0xE1)},
|
|
{RGB(0xD2, 0xB4, 0x8C)},
|
|
{RGB(0xFF, 0xFF, 0xE0)},
|
|
{RGB(0x98, 0xFB, 0x98)},
|
|
{RGB(0xAF, 0xEE, 0xEE)},
|
|
{RGB(0x68, 0x83, 0x8B)},
|
|
{RGB(0xE6, 0xE6, 0xFA)},
|
|
{RGB(0xFF, 0xFF, 0xFF)}
|
|
};
|
|
|
|
static void ColorBox(CDC* pDC, CPoint pt, COLORREF clr, BOOL bHover)
|
|
{
|
|
CBrush br(clr);
|
|
|
|
CBrush* obr = pDC->SelectObject(&br);
|
|
|
|
pDC->PatBlt(pt.x, pt.y, 13, 13, PATCOPY);
|
|
pDC->SelectObject(obr);
|
|
|
|
CRect rc;
|
|
rc.SetRect(pt.x - 2, pt.y - 2, pt.x + 15, pt.y + 15);
|
|
|
|
pDC->DrawEdge(&rc, (bHover) ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
|
|
}
|
|
|
|
|
|
|
|
static LONG FindSpot(CPoint point)
|
|
{
|
|
for (LONG i=0; i<40; i++)
|
|
{
|
|
if (PtInRect(&_crColors[i].rcSpot, point))
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPropTreeItemColor
|
|
|
|
COLORREF* CPropTreeItemColor::s_pColors = NULL;
|
|
|
|
CPropTreeItemColor::CPropTreeItemColor() :
|
|
m_cColor(0),
|
|
m_cPrevColor(0),
|
|
m_nSpot(-1),
|
|
m_bButton(FALSE),
|
|
m_bInDialog(FALSE)
|
|
{
|
|
}
|
|
|
|
CPropTreeItemColor::~CPropTreeItemColor()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPropTreeItemColor, CWnd)
|
|
//{{AFX_MSG_MAP(CPropTreeItemColor)
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_PAINT()
|
|
ON_WM_CLOSE()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_SETCURSOR()
|
|
ON_WM_LBUTTONDOWN()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPropTreeItemColor message handlers
|
|
|
|
void CPropTreeItemColor::SetDefaultColorsList(COLORREF* pColors)
|
|
{
|
|
s_pColors = pColors;
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::DrawAttribute(CDC* pDC, const RECT& rc)
|
|
{
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
CRect r(rc);
|
|
|
|
pDC->SelectObject(IsReadOnly() ? m_pProp->GetNormalFont() : m_pProp->GetBoldFont());
|
|
|
|
if (!m_pProp->IsWindowEnabled())
|
|
pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
|
|
else
|
|
pDC->SetTextColor(RGB(0,0,0));
|
|
|
|
r.top += 1;
|
|
r.right = r.left + r.Height() - 1;
|
|
|
|
CBrush br(m_cColor);
|
|
CBrush* pold = pDC->SelectObject(&br);
|
|
pDC->PatBlt(r.left, r.top, r.Width(), r.Height(), PATCOPY);
|
|
pDC->SelectObject(pold);
|
|
|
|
pDC->DrawEdge(&r, EDGE_SUNKEN, BF_RECT);
|
|
|
|
CString s;
|
|
|
|
r = rc;
|
|
r.left += r.Height();
|
|
s.Format(_T("R = %d, G = %d, B = %d"), GetRValue(m_cColor),GetGValue(m_cColor), GetBValue(m_cColor));
|
|
pDC->DrawText(s, r, DT_SINGLELINE|DT_VCENTER);
|
|
}
|
|
|
|
|
|
LPARAM CPropTreeItemColor::GetItemValue()
|
|
{
|
|
return m_cColor;
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::SetItemValue(LPARAM lParam)
|
|
{
|
|
m_cColor = lParam;
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnMove()
|
|
{
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnRefresh()
|
|
{
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnCommit()
|
|
{
|
|
ShowWindow(SW_HIDE);
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnActivate(int activateType, CPoint point)
|
|
{
|
|
CRect r;
|
|
|
|
m_cPrevColor = m_cColor;
|
|
|
|
r = m_rc;
|
|
r.right = r.left + 150;
|
|
r.bottom = r.top + 120;
|
|
|
|
ASSERT(m_pProp!=NULL);
|
|
m_pProp->GetCtrlParent()->ClientToScreen(r);
|
|
|
|
if (!IsWindow(m_hWnd))
|
|
{
|
|
LPCTSTR pszClassName;
|
|
|
|
pszClassName = AfxRegisterWndClass(CS_VREDRAW|CS_HREDRAW, LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_BTNFACE + 1));
|
|
|
|
DWORD dwStyle = WS_POPUP|WS_DLGFRAME;
|
|
|
|
CreateEx(0, pszClassName, _T(""), dwStyle, r, m_pProp->GetCtrlParent(), 0);
|
|
m_rcButton.SetRect(40, 94, 110, 114);
|
|
}
|
|
|
|
SetWindowPos(NULL, r.left, r.top, r.Width() + 1, r.Height(), SWP_NOZORDER|SWP_SHOWWINDOW);
|
|
SetFocus();
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnKillFocus(CWnd* pNewWnd)
|
|
{
|
|
CWnd::OnKillFocus(pNewWnd);
|
|
|
|
if (!m_bInDialog)
|
|
CommitChanges();
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnPaint()
|
|
{
|
|
CPaintDC dc(this);
|
|
CPoint pt;
|
|
|
|
for (LONG i=0; i<40; i++)
|
|
{
|
|
pt.x = (i & 7) * 18 + 3;
|
|
pt.y = (i >> 3) * 18 + 3;
|
|
ColorBox(&dc, pt, _crColors[i].color, m_nSpot==i);
|
|
SetRect(&_crColors[i].rcSpot, pt.x, pt.y, pt.x + 13, pt.y + 13);
|
|
}
|
|
|
|
ASSERT(m_pProp!=NULL);
|
|
|
|
dc.SelectObject(m_pProp->GetNormalFont());
|
|
|
|
CString s(_T("More Colors"));
|
|
|
|
dc.SetBkMode(TRANSPARENT);
|
|
dc.SetTextColor(GetSysColor(COLOR_BTNTEXT));
|
|
dc.DrawText(s, &m_rcButton, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
|
|
|
|
dc.DrawEdge(&m_rcButton, m_bButton ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnClose()
|
|
{
|
|
CommitChanges();
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnMouseMove(UINT, CPoint point)
|
|
{
|
|
BOOL bButton;
|
|
LONG nSpot;
|
|
|
|
nSpot = FindSpot(point);
|
|
if (nSpot!=m_nSpot)
|
|
{
|
|
Invalidate(FALSE);
|
|
m_nSpot = nSpot;
|
|
}
|
|
|
|
bButton = m_rcButton.PtInRect(point);
|
|
|
|
if (bButton!=m_bButton)
|
|
{
|
|
m_bButton = bButton;
|
|
Invalidate(FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL CPropTreeItemColor::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
if (nHitTest==HTCLIENT)
|
|
{
|
|
CPoint point;
|
|
|
|
GetCursorPos(&point);
|
|
ScreenToClient(&point);
|
|
|
|
if (FindSpot(point)!=-1 || m_rcButton.PtInRect(point))
|
|
{
|
|
SetCursor(LoadCursor(ghInst, MAKEINTRESOURCE(IDC_FPOINT)));
|
|
return TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
return CWnd::OnSetCursor(pWnd, nHitTest, message);
|
|
}
|
|
|
|
|
|
void CPropTreeItemColor::OnLButtonDown(UINT, CPoint point)
|
|
{
|
|
if (m_nSpot!=-1)
|
|
{
|
|
m_cColor = _crColors[m_nSpot].color;
|
|
CommitChanges();
|
|
}
|
|
else
|
|
if (m_rcButton.PtInRect(point))
|
|
{
|
|
CHOOSECOLOR cc;
|
|
COLORREF clr[16];
|
|
|
|
ZeroMemory(&cc, sizeof(CHOOSECOLOR));
|
|
cc.Flags = CC_FULLOPEN|CC_ANYCOLOR|CC_RGBINIT;
|
|
cc.lStructSize = sizeof(CHOOSECOLOR);
|
|
cc.hwndOwner = m_hWnd;
|
|
cc.rgbResult = m_cColor;
|
|
cc.lpCustColors = s_pColors ? s_pColors : clr;
|
|
|
|
memset(clr, 0xff, sizeof(COLORREF) * 16);
|
|
clr[0] = m_cColor;
|
|
|
|
m_bInDialog = TRUE;
|
|
|
|
ASSERT(m_pProp!=NULL);
|
|
m_pProp->DisableInput();
|
|
|
|
ShowWindow(SW_HIDE);
|
|
|
|
if (ChooseColor(&cc))
|
|
m_cColor = cc.rgbResult;
|
|
|
|
m_pProp->DisableInput(FALSE);
|
|
CommitChanges();
|
|
}
|
|
}
|