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

📄 colorbar.cpp

📁 一个复杂的画图系统
💻 CPP
字号:
// MainDialogBar.cpp : implementation file
//

#include "stdafx.h"
#include "geditor.h"
#include "ColorBar.h"
#include "geditordoc.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainDialogBar dialog


CColorBar::CColorBar(CWnd* pParent /*=NULL*/)
      : CDialogBar()
{
	//{{AFX_DATA_INIT(CColorBar)
	//}}AFX_DATA_INIT
	
	m_curColor = RGB(0,0,0);
			//Initially, the foreground color is 0(black)

	/*	The initial 20 colors in the color bar are defined as the Windows
		20 static colors. 
	*/
	m_colorArr[0].peRed=0,		m_colorArr[0].peGreen=0,		m_colorArr[0].peBlue=0;
	m_colorArr[1].peRed=0x80,	m_colorArr[1].peGreen=0,		m_colorArr[1].peBlue=0;
	m_colorArr[2].peRed=0,		m_colorArr[2].peGreen=0x80,		m_colorArr[2].peBlue=0;
	m_colorArr[3].peRed=0x80,	m_colorArr[3].peGreen=0x80,		m_colorArr[3].peBlue=0;
	m_colorArr[4].peRed=0,		m_colorArr[4].peGreen=0,		m_colorArr[4].peBlue=0x80;
	m_colorArr[5].peRed=0x80,	m_colorArr[5].peGreen=0,		m_colorArr[5].peBlue=0x80;
	m_colorArr[6].peRed=0,		m_colorArr[6].peGreen=0x80,		m_colorArr[6].peBlue=0x80;
	m_colorArr[7].peRed=0xC0,	m_colorArr[7].peGreen=0xC0,		m_colorArr[7].peBlue=0xC0;
	m_colorArr[8].peRed=0xC0,   m_colorArr[8].peGreen=0xDC,		m_colorArr[8].peBlue=0xC0;
	m_colorArr[9].peRed=0xA6,   m_colorArr[9].peGreen=0xCA,		m_colorArr[9].peBlue=0xF0;
	m_colorArr[10].peRed=0xFF,  m_colorArr[10].peGreen=0xFB,	m_colorArr[10].peBlue=0xF0;
	m_colorArr[11].peRed=0xA0,	m_colorArr[11].peGreen=0xA0,	m_colorArr[11].peBlue=0xA4;
	m_colorArr[12].peRed=0x80,  m_colorArr[12].peGreen=0x80,	m_colorArr[12].peBlue=0x80;
	m_colorArr[13].peRed=0xFF,  m_colorArr[13].peGreen=0,		m_colorArr[13].peBlue=0;
	m_colorArr[14].peRed=0,		m_colorArr[14].peGreen=0xFF,	m_colorArr[14].peBlue=0;
	m_colorArr[15].peRed=0xFF,	m_colorArr[15].peGreen=0xFF,	m_colorArr[15].peBlue=0;
	m_colorArr[16].peRed=0,		m_colorArr[16].peGreen=0,		m_colorArr[16].peBlue=0xFF;
	m_colorArr[17].peRed=0xFF,	m_colorArr[17].peGreen=0,		m_colorArr[17].peBlue=0xFF;
	m_colorArr[18].peRed=0,		m_colorArr[18].peGreen=0xFF,	m_colorArr[18].peBlue=0xFF;
	m_colorArr[19].peRed=0xFF,	m_colorArr[19].peGreen=0xFF,	m_colorArr[19].peBlue=0xFF;
}


void CColorBar::DoDataExchange(CDataExchange* pDX)
{
	CDialogBar::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMainDialogBar)
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CColorBar, CDialogBar)
	//{{AFX_MSG_MAP(CMainDialogBar)
	ON_WM_PAINT()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainDialogBar message handlers
void CColorBar::ComputeRect() 
{
	RECT rect;
	GetClientRect(&rect);
	int width=(rect.right-rect.left)/2;

	m_repaintRect.left = width-20;
	m_repaintRect.right = width + 20;
	m_repaintRect.top = 10;
	m_repaintRect.bottom = m_repaintRect.top+36;

	m_colorRect.left=width-BLOCKWIDTH-1;
	m_colorRect.top= m_repaintRect.bottom+BLOCKHEIGHT/2;
	m_colorRect.right= m_colorRect.left+2*BLOCKWIDTH+1;
	m_colorRect.bottom = m_colorRect.top+10*BLOCKHEIGHT+9;
}

void CColorBar::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	int i;
	RECT rect;
	CBrush brush,*oldbrush;
	GetClientRect(&rect);
	DrawConvexLine(&dc,&rect);   //border line
	
	ComputeRect();
	DrawConcaveBorder(&dc,&m_repaintRect);
			
	rect.top= m_repaintRect.top+14;
	rect.left= m_repaintRect.left+15;
	rect.bottom=rect.top+18;
	rect.right=rect.left+20;
    dc.FillSolidRect(&rect,RGB(255,255,255));
	DrawConvexBorder(&dc,&rect);

    rect.top= m_repaintRect.top+4;
	rect.left= m_repaintRect.left+5;
	rect.bottom=rect.top+18;
	rect.right=rect.left+20;
    brush.CreateSolidBrush(m_curColor);
    oldbrush=dc.SelectObject(&brush);
    dc.FillRect(&rect,&brush);
    dc.SelectObject(oldbrush);
    brush.DeleteObject();
	DrawConvexBorder(&dc,&rect);

	rect.top = m_colorRect.top-BLOCKHEIGHT-1;
	for (i=0;i<20;i++) {
		if (i%2==0) {
	        rect.left= m_colorRect.left;
			rect.top+=BLOCKHEIGHT+1;
		}
		else 
			rect.left=m_colorRect.right-BLOCKWIDTH;
		rect.right=rect.left+BLOCKWIDTH;
	    rect.bottom=rect.top+BLOCKHEIGHT;
	    brush.CreateSolidBrush(RGB(m_colorArr[i].peRed,
			 m_colorArr[i].peGreen,m_colorArr[i].peBlue));
	    oldbrush=dc.SelectObject(&brush);
	    dc.FillRect(&rect,&brush);
	    dc.SelectObject(oldbrush);
	    brush.DeleteObject();
		DrawConcaveBorder(&dc,&rect);
	}
	// Do not call CDialogBar::OnPaint() for painting messages
}

void CColorBar::DrawConcaveBorder(CPaintDC *dc, RECT *rect) 
{
	CPen pen,*oldpen;
	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
	oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->right,rect->top);
	dc->LineTo(rect->left,rect->top);
	dc->LineTo(rect->left,rect->bottom);
	dc->SelectObject(oldpen);
	pen.DeleteObject();
	pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
	oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->right,rect->top);
	dc->LineTo(rect->right,rect->bottom);
	dc->LineTo(rect->left,rect->bottom);
	dc->SelectObject(oldpen);
	pen.DeleteObject();
}

void CColorBar::DrawConvexBorder(CPaintDC *dc, RECT *rect) 
{
	CPen pen,*oldpen;
	pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
	oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->right,rect->top);
	dc->LineTo(rect->left,rect->top);
	dc->LineTo(rect->left,rect->bottom);
	dc->SelectObject(oldpen);
	pen.DeleteObject();

	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
	oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->right,rect->top);
	dc->LineTo(rect->right,rect->bottom);
	dc->LineTo(rect->left,rect->bottom);
	dc->SelectObject(oldpen);
	pen.DeleteObject();
}

void CColorBar::DrawConvexLine(CPaintDC *dc, RECT *rect) 
{
	CPen pen,*oldpen;
	pen.CreatePen(PS_SOLID,1,RGB(128,128,128));
    oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->left,rect->top);
	dc->LineTo(rect->right,rect->top);
	dc->SelectObject(oldpen);
    pen.DeleteObject();

	pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
    oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->left,rect->top+1);
	dc->LineTo(rect->right,rect->top+1);
	dc->SelectObject(oldpen);
	pen.DeleteObject();

    pen.CreatePen(PS_SOLID,1,RGB(128,128,128));
	oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->left,rect->bottom-2);
	dc->LineTo(rect->right,rect->bottom-2);
	dc->SelectObject(oldpen);
	pen.DeleteObject();

	pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
    oldpen=dc->SelectObject(&pen);
	dc->MoveTo(rect->left,rect->bottom-1);
	dc->LineTo(rect->right,rect->bottom-1);
	dc->SelectObject(oldpen);
	pen.DeleteObject();
}

void CColorBar::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	
    if (m_colorRect.PtInRect(point)) 
	{
    	POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition( );
	    CDocTemplate* docTemplate = AfxGetApp()->GetNextDocTemplate(pos);
    	ASSERT_VALID(docTemplate);
	    pos = docTemplate->GetFirstDocPosition( ); 
	    CGeditorDoc* pDoc = (CGeditorDoc*)docTemplate->GetNextDoc(pos);
	    ASSERT_VALID(pDoc);

	    CColorDialog ColorDlg(m_curColor,0,NULL);
	    if (ColorDlg.DoModal()==IDOK) 
		{
			m_curColor=ColorDlg.GetColor();
        	pDoc->m_curColor = m_curColor;

			int i=(point.y - m_colorRect.top)/(BLOCKHEIGHT+1);
	        int j=(point.x - m_colorRect.left)/(BLOCKWIDTH+1);
		    int index=i*2+j;

    		m_colorArr[index].peRed= m_curColor & 0x000000FF;
	    	m_colorArr[index].peGreen = (m_curColor & 0x0000FF00)>>8;
		    m_colorArr[index].peBlue = (m_curColor & 0x00FF0000)>>16;
			Invalidate();
		}//end of if
		
	}//end of if
	
}

void CColorBar::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	if (m_colorRect.PtInRect(point)) 
	{
    	POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition( );
	    CDocTemplate* docTemplate = AfxGetApp()->GetNextDocTemplate(pos);
    	ASSERT_VALID(docTemplate);
	    pos = docTemplate->GetFirstDocPosition( ); 
    	CGeditorDoc* pDoc = (CGeditorDoc*)docTemplate->GetNextDoc(pos);
	    ASSERT_VALID(pDoc);
	
	    int i=(point.y - m_colorRect.top)/(BLOCKHEIGHT+1);
        int j=(point.x - m_colorRect.left)/(BLOCKWIDTH+1);
	   	int index=i*2+j;
	    m_curColor=RGB(m_colorArr[index].peRed,m_colorArr[index].peGreen,
			m_colorArr[index].peBlue);
	    pDoc->m_curColor= m_curColor;
        InvalidateRect(&m_repaintRect);
	}//end of if
}


⌨️ 快捷键说明

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