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

📄 colorpickerdlg.cpp

📁 ColorPicker是一个基于对话框的应用程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	V = RGBmax * 100;

	if(RGBmax != RGBmin)
	{
		S = (((float)(RGBmax - RGBmin) / RGBmax)) * 100;

		if (R == RGBmax)
			H = (G - B) / (RGBmax - RGBmin);

		if (G == RGBmax)
			H = 2 + (B - R) / (RGBmax - RGBmin);

		if (B == RGBmax)
			H = 4 + (R - G) / (RGBmax - RGBmin);

		H = H * 60;

		if (H < 0)
			H = H + 360;
	}

	// 更新HSV文本框的值
	m_nH = (int)(H + 0.5f);
	m_nS = (int)(S + 0.5f);
	m_nV = (int)(V + 0.5f);

	UpdateData(FALSE);
}

/*******************************************************************************
*	作用:		将HSV转换为RGB,并更新对应数据
*******************************************************************************/
void CColorPickerDlg::UpdateRGB(void)
{
	UpdateData(TRUE);

	float H = (float)m_nH;
	float S = (float)m_nS;
	float V = m_nV * 255 / 100.0f;
	float R = 0.0;
	float G = 0.0;
	float B = 0.0;
	if(S == 0)
	{
		R = V;
		G = V;
		B = V;
	}
	else
	{
		H = H / 60;
		int num = (int)H;

		float f = H - num;
		float a = (V) * (1 - (S / 100));
		float b = (V) * (1 - (S / 100) * f);
		float c = (V) * (1 - (S / 100) * (1 - f));


		switch(num)
		{
		case 0: R = V; G = c; B = a; break;
		case 1: R = b; G = V; B = a; break;
		case 2: R = a; G = V; B = c; break;
		case 3: R = a; G = b; B = V; break;
		case 4: R = c; G = a; B = V; break;
		case 5: R = V; G = a; B = b; break;
		default: break;
		}
	}

	// 更新RGB文本框和滑块的值
	m_nSliderRed   = m_nRed   = (int)(R + 0.5f);
	m_nSliderGreen = m_nGreen = (int)(G + 0.5f);
	m_nSliderBlue  = m_nBlue  = (int)(B + 0.5f);

	UpdateData(FALSE);
}

/*******************************************************************************
*	作用:		更新颜色预览框
*******************************************************************************/
void CColorPickerDlg::UpdatePrev(void)
{
	CDC* pDC = m_ColorPrev.GetDC();	// 获取颜色预览框的CDC指针
	CRect rect;
	CBrush brush( RGB(m_nRed, m_nGreen, m_nBlue) );

	m_ColorPrev.GetClientRect(rect);
	// 利用当前RGB颜色填充颜色预览框
	pDC->FillRect(rect, &brush);

	// 释放CDC指针
	ReleaseDC(pDC);
}

/*******************************************************************************
*	作用:		滑块滑动的消息响应函数
*	备注:		对话框面板中所有滑块滑动都由该函数处理
*******************************************************************************/
void CColorPickerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	UpdateData(TRUE);

	if ( (&m_SliderColor) == (CSliderCtrl*)pScrollBar )
		OnSliderColorChange();

	else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_RED) == (CSliderCtrl*)pScrollBar )
		m_nRed = m_nSliderRed;

	else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_GREEN) == (CSliderCtrl*)pScrollBar )
		m_nGreen = m_nSliderGreen;

	else if ( (CSliderCtrl*)GetDlgItem(IDC_SLIDER_BLUE) == (CSliderCtrl*)pScrollBar )
		m_nBlue = m_nSliderBlue;

	UpdateData(FALSE);

	// 滑块改动的是RGB值,要重新更新HSV值
	UpdateHSV();
	UpDateColorArea();

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

/*******************************************************************************
*	作用:		主滑块滑动处理函数
*******************************************************************************/
void CColorPickerDlg::OnSliderColorChange(void)
{
	switch(m_SliderColor.GetPos() / 256)
	{
	case 0:
		m_nRed   = m_nSliderRed   = 255;
		m_nGreen = m_nSliderGreen = 0;
		m_nBlue  = m_nSliderBlue  = m_SliderColor.GetPos();
		break;

	case 1:
		m_nRed   = m_nSliderRed   = 255 -(m_SliderColor.GetPos() - 256);
		m_nGreen = m_nSliderGreen = 0;
		m_nBlue  = m_nSliderBlue  = 255;
		break;

	case 2:
		m_nRed   = m_nSliderRed   = 0;
		m_nGreen = m_nSliderGreen = m_SliderColor.GetPos() - 256 * 2;
		m_nBlue  = m_nSliderBlue  = 255;
		break;

	case 3:
		m_nRed   = m_nSliderRed   = 0;
		m_nGreen = m_nSliderGreen = 255;
		m_nBlue  = m_nSliderBlue  = 255 - (m_SliderColor.GetPos() - 256 * 3);
		break;

	case 4:
		m_nRed   = m_nSliderRed   = m_SliderColor.GetPos() - 256 * 4;
		m_nGreen = m_nSliderGreen = 255;
		m_nBlue  = m_nSliderBlue  = 0;
		break;

	case 5:
		m_nRed   = m_nSliderRed   = 255;
		m_nGreen = m_nSliderGreen = 255 - (m_SliderColor.GetPos() - 256 * 5);
		m_nBlue  = m_nSliderBlue  = 0;
		break;

	default:;
	}

	UpdateData(FALSE);
}


/*******************************************************************************
*	作用:		"红色"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditRed()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nRed > 255)
		m_nRed = 255;
	else if (m_nRed < 0)
		m_nRed = 0;

	m_nSliderRed = m_nRed;

	UpdateData(FALSE);
	UpdateHSV();
	UpDateColorArea();
}

/*******************************************************************************
*	作用:		"绿色"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditGreen()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nGreen > 255)
		m_nGreen = 255;
	else if (m_nGreen < 0)
		m_nGreen = 0;

	m_nSliderGreen = m_nGreen;

	UpdateData(FALSE);
	UpdateHSV();
	UpDateColorArea();
}


/*******************************************************************************
*	作用:		"蓝色"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditBlue()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nBlue > 255)
		m_nBlue = 255;
	else if (m_nBlue < 0)
		m_nBlue = 0;

	m_nSliderBlue = m_nBlue;

	UpdateData(FALSE);
	UpdateHSV();
	UpDateColorArea();
}

/*******************************************************************************
*	作用:		"H"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditH()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nH > 360)
		m_nH = 360;
	else if (m_nH < 0)
		m_nH = 0;

	UpdateData(FALSE);
	UpdateRGB();
	UpDateColorArea();
}

/*******************************************************************************
*	作用:		"S"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditS()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nS > 100)
		m_nS = 100;
	else if (m_nS < 0)
		m_nS = 0;

	UpdateData(FALSE);
	UpdateRGB();
	UpDateColorArea();
}

/*******************************************************************************
*	作用:		"V"文本框内容改变的响应函数
*******************************************************************************/
void CColorPickerDlg::OnEnChangeEditV()
{
	UpdateData(TRUE);

	// 限定取值范围
	if (m_nV > 100)
		m_nV = 100;
	else if (m_nV < 0)
		m_nV = 0;

	UpdateData(FALSE);
	UpdateRGB();
	UpDateColorArea();
}

/*******************************************************************************
*	作用:		按下鼠标左键的响应函数
*	备注:		用于颜色面板的取色
*******************************************************************************/
void CColorPickerDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	CDC*	pDC = m_ColorArea.GetDC();
	CRect	rect;
	
	m_ColorArea.GetWindowRect(rect);
	ClientToScreen(&point);

	// 判断当前鼠标是否在颜色面板中
	if (rect.PtInRect(point))
	{
		int x = point.x - rect.left;
		int y = point.y - rect.top;

		COLORREF clr = pDC->GetPixel(x, y);
		
		m_nSliderRed   = m_nRed   = GetRValue(clr);
		m_nSliderGreen = m_nGreen = GetGValue(clr);
		m_nSliderBlue  = m_nBlue  = GetBValue(clr);

		UpdateData(FALSE);
		UpdateHSV();
		UpdatePrev();
	}

	ReleaseDC(pDC);
}

/*******************************************************************************
*	作用:		屏幕取色处理函数
*	备注:		用户按a键时响应
*******************************************************************************/
BOOL CColorPickerDlg::PreTranslateMessage(MSG* pMsg)
{
	// 如果用户按下a键(不论大小写),进行屏幕取色处理
	if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == 'a' || pMsg->wParam == 'A'))
	{
		CDC* pDC = CDC::FromHandle(::GetDC(NULL));	// 获取屏幕CDC指针
		CPoint point;

		GetCursorPos(&point);		// 当前鼠标坐标
	
		// 获取鼠标所在点颜色信息
		COLORREF clr = pDC->GetPixel(point.x, point.y);

		m_nSliderRed   = m_nRed   = GetRValue(clr);
		m_nSliderGreen = m_nGreen = GetGValue(clr);
		m_nSliderBlue  = m_nBlue  = GetBValue(clr);

		UpdateData(FALSE);
		UpdateHSV();
		UpDateColorArea();
		
		ReleaseDC(pDC);
		return TRUE;
	}

	return CDialog::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -