📄 colorpickerdlg.cpp
字号:
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 + -