www.gusucode.com > VC++增强版画图板源码源码程序 > VC++增强版画图板源码源码程序\code\HDraw\HColorBar.cpp
// HColorBar.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "HDraw.h" #include "HColorBar.h" #include "HDrawDoc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // HColorBar HColorBar::HColorBar() { //initiate colors int index = 0; for(int i = 0; i <= 256; i += 128){ for(int j = 0; j <= 256; j += 128){ for(int k = 0; k <= 256; k +=128){ m_COLOR[index ++] = RGB(256==i?255:i, 256==j?255:j, 256==k?255:k); } } } m_COLOR[index] = RGB(1,2,3); } HColorBar::~HColorBar() { } BEGIN_MESSAGE_MAP(HColorBar, CToolBar) //{{AFX_MSG_MAP(HColorBar) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // HColorBar message handlers COLORREF HColorBar::GetColor() { return m_currentColor; } void HColorBar::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rc; GetClientRect(&rc); //step1.1 draw color indicator frame dc.Draw3dRect(rc.left+1, rc.top+5, 33, 33, RGB(0, 0, 0), RGB(255, 255, 255)); //step1.2 draw color indicator CPen pen2(PS_SOLID, 1, m_currentColor); CBrush bru2(m_currentColor); dc.SelectObject(&pen2); dc.SelectObject(&bru2); dc.Draw3dRect(rc.left+5, rc.top+5+5, 15, 15, RGB(255, 255, 255), RGB(150, 150, 150)); dc.Rectangle(rc.left+6, rc.top+10, rc.left+29, rc.top+33); //step2.1 //initiate color rects for(int i=0;i<COLORNUMBER/2;i++) { m_rect[i*2].left=rc.left+36+i*(15+2)+1; m_rect[i*2].top=rc.top+5+1; m_rect[i*2].right=m_rect[i*2].left+13; m_rect[i*2].bottom=m_rect[i*2].top+13; m_rect[i*2+1].left=rc.left+36+i*(15+2)+1; m_rect[i*2+1].top=rc.top+22+1; m_rect[i*2+1].right=m_rect[i*2+1].left+13; m_rect[i*2+1].bottom=m_rect[i*2+1].top+13; }; //step2.2 //draw rects for(i =0;i<COLORNUMBER/2;i++) { dc.Draw3dRect(rc.left+36+i*(15+2), rc.top+5, 15, 15, RGB(0, 0, 0), RGB(255, 255, 255)); CPen pen3(PS_SOLID, 1, m_COLOR[i*2]); CBrush bru3(m_COLOR[i*2]); dc.SelectObject(&pen3); dc.SelectObject(&bru3); dc.Rectangle(m_rect[i*2].left, m_rect[i*2].top, m_rect[i*2].right, m_rect[i*2].bottom); dc.Draw3dRect(rc.left+36+i*(15+2), rc.top+22, 15, 15, RGB(0, 0, 0), RGB(255, 255, 255)); CPen pen4(PS_SOLID, 1, m_COLOR[i*2+1]); CBrush bru4(m_COLOR[i*2+1]); dc.SelectObject(&pen4); dc.SelectObject(&bru4); dc.Rectangle(m_rect[i*2+1].left, m_rect[i*2+1].top, m_rect[i*2+1].right, m_rect[i*2+1].bottom); }; //step3 calculate total area m_rectAll.left=m_rect[0].left; m_rectAll.top=m_rect[0].top; m_rectAll.right=m_rect[COLORNUMBER-1].right; m_rectAll.bottom=m_rect[1].bottom; } void HColorBar::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CRect rc; GetClientRect(&rc); for(int i=0;i<COLORNUMBER;i++) { if(m_rect[i].PtInRect(point)) { //step1. change variable m_currentColor = m_COLOR[i]; //step2. change document UpdateDocument(); CPen pen(PS_SOLID, 1, m_currentColor); CBrush bru(m_currentColor); dc.SelectObject(&pen); dc.SelectObject(&bru); //step2. draw indicator dc.Rectangle(rc.left+6, rc.top+10, rc.left+29, rc.top+33); break; } } CToolBar::OnLButtonDown(nFlags, point); } void HColorBar::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); CRect rc; GetClientRect(&rc); if(m_rectAll.PtInRect(point)) { CColorDialog dlg; dlg.m_cc.Flags |= CC_RGBINIT; dlg.m_cc.rgbResult=m_currentColor; if(dlg.DoModal()==IDOK) { //step1. set variable m_currentColor=dlg.GetColor(); //step2. update document UpdateDocument(); CPen pen(PS_SOLID, 1, m_currentColor); CBrush bru(m_currentColor); dc.SelectObject(&pen); dc.SelectObject(&bru); //step3. draw indicator dc.Rectangle(rc.left+6, rc.top+10, rc.left+19, rc.top+24); }; } } void HColorBar::UpdateDocument() { //Get Document CHDrawDoc* pDoc = ((CHDrawDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument())); //Set color of document pDoc->m_picColor = m_currentColor; //Set color of selected strokes bool refresh = false; for(int i = 0; i < pDoc->m_strokeList.GetSize(); i ++){ if(pDoc->m_strokeList.GetAt(i)->m_bSelected) pDoc->m_strokeList.GetAt(i)->m_penColor = m_currentColor; refresh = true; } if(refresh){ pDoc->BackUp(); ((CMainFrame*)AfxGetMainWnd())->GetActiveView()->Invalidate(); } }