⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorpickerdlg.cpp.svn-base

📁 wince c++ 下 开发的 rss 阅读器源代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
}

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 + -