📄 colorpickerdlg.cpp.svn-base
字号:
}
void CHSCtl::SetColor(COLORREF color) {
double l;
rgb2hsl(color, m_dH, m_dS, l);
}
#define CROSS_SIZE SCALEX(5)
#define CROSS_INSIDE SCALEX(1)
#define CROSS_WD SCALEX(2)
void CHSCtl::DrawCross(CDC &dc) {
CRect rc;
GetClientRect(&rc);
int x = (int) (m_dH * rc.Width());
int y = (int) ((1.0 - m_dS) * rc.Height());
CPen blackPen(PS_SOLID, SCALEY(1), RGB(0, 0, 0));
dc.SelectObject(&blackPen);
// left
dc.MoveTo(x - CROSS_SIZE, y);
dc.LineTo(x - CROSS_INSIDE, y);
dc.MoveTo(x - CROSS_SIZE, y + SCALEY(1));
dc.LineTo(x - CROSS_INSIDE, y + SCALEY(1));
// right
dc.MoveTo(x + CROSS_WD + CROSS_INSIDE, y);
dc.LineTo(x + CROSS_WD + CROSS_SIZE, y);
dc.MoveTo(x + CROSS_WD + CROSS_INSIDE, y + SCALEY(1));
dc.LineTo(x + CROSS_WD + CROSS_SIZE, y + SCALEY(1));
// up
dc.MoveTo(x, y - CROSS_SIZE);
dc.LineTo(x, y - CROSS_INSIDE);
dc.MoveTo(x + SCALEX(1), y - CROSS_SIZE);
dc.LineTo(x + SCALEX(1), y - CROSS_INSIDE);
// down
dc.MoveTo(x, y + CROSS_WD + CROSS_INSIDE);
dc.LineTo(x, y + CROSS_WD + CROSS_SIZE);
dc.MoveTo(x + SCALEX(1), y + CROSS_WD + CROSS_INSIDE);
dc.LineTo(x + SCALEX(1), y + CROSS_WD + CROSS_SIZE);
}
void CHSCtl::OnPaint() {
CPaintDC dc(this); // device context for painting
int save = dc.SaveDC();
CRect rc;
GetClientRect(&rc);
// ---
if (m_dcMem == NULL) {
m_dcMem = new CDC();
CDC *pDC = GetDC();
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
m_dcMem->CreateCompatibleDC(pDC);
m_bmp = m_dcMem->SelectObject(&bmp);
// fill
for (int i = 0; i < rc.Height(); i += SCALEY(5)) {
for (int j = 0; j < rc.Width(); j += SCALEX(5)) {
double h = (double) j / rc.Width();
double s = 1.0 - (double) i / rc.Height();
COLORREF rgb = hsl2rgb(h, s, 0.5);
m_dcMem->FillSolidRect(rc.left + j, rc.top + i, rc.left + j + SCALEX(5), rc.top + i + SCALEY(5), rgb);
}
}
ReleaseDC(pDC);
}
dc.BitBlt(0, 0, rc.Width(), rc.Height(), m_dcMem, 0, 0, SRCCOPY);
DrawCross(dc);
dc.RestoreDC(save);
ValidateRect(NULL);
}
void CHSCtl::SetHSFromPoint(CPoint &point) {
CRect rc;
GetClientRect(&rc);
m_dH = (double) (point.x - rc.left) / rc.Width();
if (m_dH < 0.0) m_dH = 0.0;
if (m_dH > 1.0) m_dH = 1.0;
m_dS = (double) (rc.bottom - point.y) / rc.Height();
if (m_dS < 0.0) m_dS = 0.0;
if (m_dS > 1.0) m_dS = 1.0;
}
void CHSCtl::UpdateMe(CPoint &point) {
// old position
CRect rc;
GetClientRect(&rc);
int x = (int) (m_dH * rc.Width());
int y = (int) ((1.0 - m_dS) * rc.Height());
InvalidateRect(CRect(x - CROSS_SIZE, y - CROSS_SIZE, x + CROSS_SIZE + CROSS_WD, y + CROSS_SIZE + CROSS_WD));
SetHSFromPoint(point);
InvalidateRect(CRect(point.x - CROSS_SIZE, point.y - CROSS_SIZE,
point.x + CROSS_SIZE + CROSS_WD, point.y + CROSS_SIZE + CROSS_WD));
UpdateWindow();
}
void CHSCtl::OnLButtonDown(UINT nFlags, CPoint point) {
SetCapture();
UpdateMe(point);
GetParent()->SendMessage(SELECT_COLOR_MESSAGE);
}
void CHSCtl::OnMouseMove(UINT nFlags, CPoint point) {
CRect rc;
GetClientRect(&rc);
if (point.y < rc.top - SCALEY(1))
point.y = rc.top - SCALEY(1);
else if (point.y > rc.bottom - CROSS_INSIDE - SCALEY(1))
point.y = rc.bottom - CROSS_INSIDE - SCALEY(1);
if (point.x < rc.left)
point.x = rc.left;
else if (point.x > rc.right - CROSS_INSIDE - SCALEX(1))
point.x = rc.right - CROSS_INSIDE - SCALEX(1);
UpdateMe(point);
GetParent()->SendMessage(SELECT_COLOR_MESSAGE);
}
void CHSCtl::OnLButtonUp(UINT nFlags, CPoint point) {
ReleaseCapture();
}
/////////////////////////////////////////////////////////////////////////////
// CColorPickerDlg dialog
CColorPickerDlg::CColorPickerDlg(COLORREF clrInit/* = 0*/)
: CCeDialog(CColorPickerDlg::IDD)
{
m_clrColor = clrInit;
//{{AFX_DATA_INIT(CColorPickerDlg)
//}}AFX_DATA_INIT
SetMenu(IDR_CANCEL);
// m_strCaption.LoadString(IDS_SELECT_COLOR);
}
void CColorPickerDlg::DoDataExchange(CDataExchange* pDX)
{
LOG0(5, "CColorPickerDlg::DoDataExchange()");
CCeDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CColorPickerDlg)
DDX_Control(pDX, IDC_SSPIN, m_ctlSspin);
DDX_Control(pDX, IDC_RSPIN, m_ctlRspin);
DDX_Control(pDX, IDC_LSPIN, m_ctlLspin);
DDX_Control(pDX, IDC_HSPIN, m_ctlHspin);
DDX_Control(pDX, IDC_BSPIN, m_ctlBspin);
DDX_Control(pDX, IDC_GSPIN, m_ctlGspin);
DDX_Control(pDX, IDC_COLOR, m_ctlColor);
DDX_Control(pDX, IDC_LIGHTNESS, m_ctlLigthness);
DDX_Control(pDX, IDC_HSFIELD, m_ctlHSField);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CColorPickerDlg, CCeDialog)
//{{AFX_MSG_MAP(CColorPickerDlg)
ON_NOTIFY(UDN_DELTAPOS, IDC_BSPIN, OnDeltaposBspin)
ON_NOTIFY(UDN_DELTAPOS, IDC_GSPIN, OnDeltaposGspin)
ON_NOTIFY(UDN_DELTAPOS, IDC_RSPIN, OnDeltaposRspin)
ON_NOTIFY(UDN_DELTAPOS, IDC_HSPIN, OnDeltaposHspin)
ON_NOTIFY(UDN_DELTAPOS, IDC_SSPIN, OnDeltaposSspin)
ON_NOTIFY(UDN_DELTAPOS, IDC_LSPIN, OnDeltaposLspin)
//}}AFX_MSG_MAP
ON_MESSAGE(SELECT_COLOR_MESSAGE, OnSelectColor)
ON_MESSAGE(SELECT_LIGHTNESS_MESSAGE, OnSelectLightness)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CColorPickerDlg message handlers
BOOL CColorPickerDlg::OnInitDialog() {
LOG0(3, "CColorPickerDlg::OnInitDialog()");
CCeDialog::OnInitDialog();
// better spin buttons
m_ctlRspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
m_ctlGspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
m_ctlBspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
m_ctlHspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
m_ctlSspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
m_ctlLspin.SendMessage(CCM_SETVERSION, COMCTL32_VERSION);
// set ranges
m_ctlRspin.SetRange(0, 255);
m_ctlGspin.SetRange(0, 255);
m_ctlBspin.SetRange(0, 255);
m_ctlHspin.SetRange(0, 360);
m_ctlSspin.SetRange(0, 255);
m_ctlLspin.SetRange(0, 255);
// set values
SetRGB(m_clrColor);
double h, s, l;
rgb2hsl(m_clrColor, h, s, l);
SetHSL(h, s, l);
m_ctlColor.SetColor(m_clrColor);
m_ctlLigthness.SetColor(m_clrColor);
m_ctlLigthness.m_dL = l;
m_ctlHSField.m_dH = h;
m_ctlHSField.m_dS = s;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CColorPickerDlg::OnSelectColor(WPARAM wParam, LPARAM lParam) {
double h = m_ctlHSField.m_dH;
double s = m_ctlHSField.m_dS;
double l = m_ctlLigthness.m_dL;
COLORREF color = hsl2rgb(h, s, l);
m_ctlColor.SetColor(color);
m_ctlColor.Invalidate();
// m_ctlLigthness.SetColor(color);
m_ctlLigthness.SetColor(h, s, l);
m_ctlLigthness.Invalidate();
// HSL
m_ctlHspin.SetPos((int) (h * 360));
m_ctlSspin.SetPos((int) (s * 255));
// RGB
SetRGB(color);
m_clrColor = color;
return TRUE;
}
LRESULT CColorPickerDlg::OnSelectLightness(WPARAM wParam, LPARAM lParam) {
double h = m_ctlHSField.m_dH;
double s = m_ctlHSField.m_dS;
double l = m_ctlLigthness.m_dL;
COLORREF color = hsl2rgb(h, s, l);
m_ctlColor.SetColor(color);
m_ctlColor.Invalidate();
// HSL
m_ctlLspin.SetPos((int) (l * 255));
// RGB
SetRGB(color);
m_clrColor = color;
return TRUE;
}
void CColorPickerDlg::SetHSL(double h, double s, double l) {
m_ctlHspin.SetPos((int) (h * 360));
m_ctlSspin.SetPos((int) (s * 255));
m_ctlLspin.SetPos((int) (l * 255));
}
void CColorPickerDlg::SetHSLCtrl(double h, double s, double l) {
m_ctlLigthness.SetColor(h, s, l);
m_ctlLigthness.Invalidate();
m_ctlHSField.SetColor(h, s, l);
m_ctlHSField.Invalidate();
}
void CColorPickerDlg::UpdateHSL() {
int r = m_ctlRspin.GetPos();
int g = m_ctlGspin.GetPos();
int b = m_ctlBspin.GetPos();
m_clrColor = RGB(r, g, b);
double h, s, l;
rgb2hsl(m_clrColor, h, s, l);
SetHSL(h, s, l);
m_ctlColor.SetColor(m_clrColor);
m_ctlColor.Invalidate();
SetHSLCtrl(h, s, l);
}
void CColorPickerDlg::OnDeltaposBspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateHSL();
*pResult = 0;
}
void CColorPickerDlg::OnDeltaposGspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateHSL();
*pResult = 0;
}
void CColorPickerDlg::OnDeltaposRspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateHSL();
*pResult = 0;
}
void CColorPickerDlg::SetRGB(COLORREF color) {
m_ctlRspin.SetPos(GetRValue(color));
m_ctlGspin.SetPos(GetGValue(color));
m_ctlBspin.SetPos(GetBValue(color));
}
void CColorPickerDlg::UpdateRGB() {
int h = m_ctlHspin.GetPos();
int s = m_ctlSspin.GetPos();
int l = m_ctlLspin.GetPos();
m_clrColor = hsl2rgb(h / 360.0, s / 255.0, l / 255.0);
SetRGB(m_clrColor);
m_ctlColor.SetColor(m_clrColor);
m_ctlColor.Invalidate();
SetHSLCtrl(h / 360.0, s / 255.0, l / 255.0);
}
void CColorPickerDlg::OnDeltaposHspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateRGB();
*pResult = 0;
}
void CColorPickerDlg::OnDeltaposSspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateRGB();
*pResult = 0;
}
void CColorPickerDlg::OnDeltaposLspin(NMHDR* pNMHDR, LRESULT* pResult) {
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateRGB();
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -