📄 colorpickerdlg.cpp
字号:
{
CDIB& d = m_BrightDIB;
d.Create(brightRect.Width(),brightRect.Height(),8);
for(int i=0; i < d.Height(); i++)
{
memset(d.GetLinePtr(i),i,d.Width());
}
}
void CColorPickerDlg::SetDIBPalette()
{
BYTE palette[768],*p;
HSVType h = hsvColor;
double d;
d = 255.0/brightRect.Height();
p = palette;
for(int i=brightRect.Height()-1; i >= 0 ;i--,p+=3)
{
h.v = (int)((double)i * d);
RGBType rgb = h.toRGB();
p[0] = rgb.r;
p[1] = rgb.g;
p[2] = rgb.b;
}
m_BrightDIB.SetPalette(palette);
}
void CColorPickerDlg::CalcRects()
{
CPoint pt;
pt = PtFromAngle(hsvColor.h,hsvColor.s,m_Centre);
m_CurrentRect = CRect(pt.x - RECT_WIDTH,pt.y - RECT_WIDTH,pt.x+RECT_WIDTH,pt.y + RECT_WIDTH);
int y;
y = (int)(((double)hsvColor.v/255)*brightRect.Height());
y = brightRect.bottom - y;
brightMark = CRect(brightRect.left - 2, y - 4, brightRect.right+2,y+4);
}
void CColorPickerDlg::DrawHSB(CDC *pDC)
{
if(m_HsbBitmap.GetSafeHandle())
{
CBitmap *pOldBitmap ;
pOldBitmap = (CBitmap *)memDC.SelectObject(&m_HsbBitmap);
pDC->BitBlt(hsbRect.left,hsbRect.top,hsbWidth,hsbHeight,&memDC,0,0,SRCCOPY);
m_BrightDIB.BitBlt(pDC->m_hDC,brightRect.left,brightRect.top,brightRect.Width(),brightRect.Height(),0,0);
DrawMarkers(pDC);
memDC.SelectObject(pOldBitmap);
}
}
void CColorPickerDlg::DrawRGB(CDC *pDC)
{
if(m_RgbBitmap.GetSafeHandle())
{
CBitmap *pOldBitmap ;
pOldBitmap = (CBitmap *)memDC.SelectObject(&m_RgbBitmap);
pDC->BitBlt(rgbRect.left,rgbRect.top,rgbWidth,rgbHeight,&memDC,0,0,SRCCOPY);
DrawLines(pDC);
memDC.SelectObject(pOldBitmap);
}
}
void CColorPickerDlg::DrawLines(CDC *pDC)
{
CPoint pt[3];
pt[0] = PointOnLine(Vertex,Top,(color.r*RedLen)/255,RedLen);
pt[1] = PointOnLine(Vertex,Left,(color.g*GreenLen)/255,GreenLen);
pt[2] = PointOnLine(Vertex,Right,(color.b*BlueLen)/255,BlueLen);
COLORREF col = RGB(255,255,255);
CRect cr;
for(int i=0; i < 3; i++)
{
cr = CRect(pt[i].x - RECT_WIDTH ,pt[i].y-RECT_WIDTH ,pt[i].x+RECT_WIDTH ,pt[i].y+RECT_WIDTH );
rects[i] = cr;
DrawXorRect(pDC,cr);
}
CPen *oldPen;
int oldMode;
oldPen = (CPen *)pDC->SelectStockObject(WHITE_PEN);
oldMode = pDC->SetROP2(R2_XORPEN);
/*
Draw the following lines :
1 -2
2 -3
3 - 4
4- 5
5 -2
5 - 6
6-7
7-4
*/
pDC->MoveTo(m_Cuboid[1]);
pDC->LineTo(m_Cuboid[2]);
pDC->LineTo(m_Cuboid[3]);
pDC->LineTo(m_Cuboid[4]);
pDC->LineTo(m_Cuboid[5]);
pDC->LineTo(m_Cuboid[2]);
pDC->MoveTo(m_Cuboid[5]);
pDC->LineTo(m_Cuboid[6]);
pDC->LineTo(m_Cuboid[7]);
pDC->LineTo(m_Cuboid[4]);
pDC->MoveTo(m_Cuboid[1]);
pDC->LineTo(m_Cuboid[6]);
pDC->SelectObject(oldPen);
pDC->SetROP2(oldMode);
DrawFilledColor(pDC,NewColorRect,color.color());
}
void CColorPickerDlg::DrawXorRect(CDC *pDC,CRect& cr)
{
CPen pen,*oldPen;
CBrush *oldBrush;
int oldMode;
pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
oldPen = (CPen *)pDC->SelectObject(&pen);
oldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);
oldMode =pDC->SetROP2(R2_XORPEN);
pDC->Rectangle(&cr);
pDC->SetROP2(oldMode);
pDC->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
pen.DeleteObject();
}
void CColorPickerDlg::CalcSlopes()
{
lines[RED].slope = Slope(Top,Vertex);
lines[GREEN].slope = Slope(Left,Vertex);
lines[BLUE].slope = Slope(Right,Vertex);
int i;
for(i=0; i < 3; i++)
{
lines[i].x = Vertex.x;
lines[i].y = Vertex.y;
lines[i].c = FindC(lines[i]);
}
}
/*
Cuboid points
0 = vertex
1 = Red Axis
2 = Red Green Intersection
3 = Green Axis
4 = Blue Green Intersection
5 = Blue Green Red Intersection
6 = Red Blue Intersection
7 = Blue Axis
Draw the following lines :
1 -2
2 -3
3 - 4
4- 5
5 -2
5 - 6
6-7
7-4
*/
void CColorPickerDlg::CalcCuboid()
{
double rLen,gLen,bLen;
rLen = (double)(color.r*RedLen)/255;
gLen = (double)(color.g*GreenLen)/255;
bLen = (double)(color.b*BlueLen)/255;
LineDesc l[12];
m_Cuboid[0] = Vertex;
m_Cuboid[1] = PointOnLine(Vertex,Top,(int)rLen,RedLen);
m_Cuboid[3] = PointOnLine(Vertex,Left,(int)gLen,GreenLen);
m_Cuboid[7] = PointOnLine(Vertex,Right,(int)bLen,BlueLen);
l[0] = lines[RED];
l[1] = lines[GREEN];
l[2] = lines[BLUE];
l[3].slope = lines[GREEN].slope;
l[3].x = m_Cuboid[1].x;
l[3].y = m_Cuboid[1].y;
l[3].c = FindC(l[3]);
l[4].slope = lines[RED].slope;
l[4].x = m_Cuboid[3].x;
l[4].y = m_Cuboid[3].y;
l[4].c = FindC(l[4]);
l[5].slope = lines[BLUE].slope;
l[5].x = m_Cuboid[3].x;
l[5].y = m_Cuboid[3].y;
l[5].c = FindC(l[5]);
l[6].slope = lines[GREEN].slope;
l[6].x = m_Cuboid[7].x;
l[6].y = m_Cuboid[7].y;
l[6].c = FindC(l[6]);
l[10].slope = lines[BLUE].slope;
l[10].x = m_Cuboid[1].x;
l[10].y = m_Cuboid[1].y;
l[10].c = FindC(l[10]);
l[11].slope = lines[RED].slope;
l[11].x = m_Cuboid[7].x;
l[11].y = m_Cuboid[7].y;
l[11].c = FindC(l[11]);
m_Cuboid[2] = Intersection(l[3],l[4]);
m_Cuboid[4] = Intersection(l[5],l[6]);
m_Cuboid[6] = Intersection(l[10],l[11]);
l[7].slope = lines[RED].slope;
l[7].x = m_Cuboid[4].x;
l[7].y = m_Cuboid[4].y;
l[7].c = FindC(l[7]);
l[8].slope = lines[BLUE].slope;
l[8].x = m_Cuboid[2].x;
l[8].y = m_Cuboid[2].y;
l[8].c = FindC(l[8]);
m_Cuboid[5] = Intersection(l[7],l[8]);
}
void CColorPickerDlg::SetSpinVals()
{
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_RED))->SetRange(0,255);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_GREEN))->SetRange(0,255);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_BLUE))->SetRange(0,255);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_HUE))->SetRange(0,360);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_SAT))->SetRange(0,255);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_VAL))->SetRange(0,255);
}
void CColorPickerDlg::SetEditVals()
{
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_RED))->SetPos(color.r);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_GREEN))->SetPos(color.g);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_BLUE))->SetPos(color.b);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_HUE))->SetPos(hsvColor.h);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_SAT))->SetPos(hsvColor.s);
((CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_VAL))->SetPos(hsvColor.v);
}
void CColorPickerDlg::OnChangeEditBlue()
{
int b;
b = GetDlgItemInt(IDC_EDIT_BLUE);
if( b != color.b && m_bInitOver)
{
color.b = b;
if(color.b < 0) color.b = 0;
if(color.b > 255) color.b = 255;
hsvColor = color.toHSV();
DrawAll();
}
}
void CColorPickerDlg::OnChangeEditGreen()
{
int g;
g = GetDlgItemInt(IDC_EDIT_GREEN);
if(g != color.g && m_bInitOver)
{
color.g = g;
if(color.g < 0) color.g = 0;
if(color.g > 255) color.g = 255;
hsvColor = color.toHSV();
DrawAll();
}
}
void CColorPickerDlg::OnChangeEditRed()
{
int r;
r = GetDlgItemInt(IDC_EDIT_RED);
if(r != color.r && m_bInitOver)
{
color.r = r;
if(color.r < 0) color.r = 0;
if(color.r > 255) color.r = 255;
hsvColor = color.toHSV();
DrawAll();
}
}
void CColorPickerDlg::OnChangeEditHue()
{
int h;
h = GetDlgItemInt(IDC_EDIT_HUE);
if(h != hsvColor.h && m_bInitOver)
{
hsvColor.h = h;
if(hsvColor.h < 0) hsvColor.h = 0;
if(hsvColor.h > 359) hsvColor.h = 359;
color = hsvColor.toRGB();
DrawAll();
}
}
void CColorPickerDlg::OnChangeEditSat()
{
int s;
s = GetDlgItemInt(IDC_EDIT_SAT);
if(s != hsvColor.s && m_bInitOver)
{
hsvColor.s = s;
if(hsvColor.s < 0) hsvColor.s = 0;
if(hsvColor.s > 255) hsvColor.s = 255;
color = hsvColor.toRGB();
DrawAll();
}
}
void CColorPickerDlg::OnChangeEditVal()
{
int v;
v = GetDlgItemInt(IDC_EDIT_VAL);
if(v != hsvColor.v && m_bInitOver)
{
hsvColor.v = v;
if(hsvColor.v < 0) hsvColor.v = 0;
if(hsvColor.v > 255) hsvColor.v = 255;
color = hsvColor.toRGB();
DrawAll();
}
}
void CColorPickerDlg::DrawAll()
{
if(m_bInitOver && !m_bInDrawAll)
{
CClientDC dc(this);
DrawMarkers(&dc);
DrawLines(&dc);
m_bInDrawAll = TRUE;
CalcCuboid();
CalcRects();
SetDIBPalette();
DrawRGB(&dc);
DrawHSB(&dc);
SetEditVals();
m_bInDrawAll = FALSE;
}
}
void CColorPickerDlg::DrawFilledColor(CDC *pDC,CRect cr,COLORREF c)
{
pDC->FillSolidRect(&cr,c);
pDC->Draw3dRect(&cr,RGB(0,0,0),RGB(0,0,0));
cr.InflateRect(-1,-1);
pDC->Draw3dRect(&cr,RGB(192,192,192),RGB(128,128,128));
}
void CColorPickerDlg::LoadMappedBitmap(CBitmap& bitmap,UINT nIdResource,CSize& size)
{
CBitmap *pOldBitmap;
if(bitmap.GetSafeHandle()) bitmap.DeleteObject();
if(bitmap.LoadBitmap(nIdResource))
{
int width,height;
BITMAP bmInfo;
::GetObject(bitmap.m_hObject,sizeof(bmInfo),&bmInfo);
width = bmInfo.bmWidth;
height = bmInfo.bmHeight;
COLORREF colorWindow = ::GetSysColor(COLOR_3DFACE);
COLORREF sourceColor = RGB(192,192,192);
pOldBitmap = (CBitmap *)memDC.SelectObject(&bitmap);
int i,j;
for(i=0; i < height; i++)
{
for(j=0; j < width; j++)
{
if(memDC.GetPixel(j,i) == sourceColor)
{
memDC.SetPixel(j,i,colorWindow);
}
}
}
memDC.SelectObject(&pOldBitmap);
size = CSize(width,height);
}
}
void CColorPickerDlg::OnSysColorChange()
{
CSize size;
LoadMappedBitmap(m_HsbBitmap,IDB_BITMAP_HSB,size);
LoadMappedBitmap(m_RgbBitmap,IDB_BITMAP_RGB,size);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -