www.pudn.com > 44757463.rar > ColorSetDlg.cpp


// ColorSetDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GraphSoft.h" 
#include "ColorSetDlg.h" 
 
#include "GraphSoftView.h" 
#include "MainFrm.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CColorSetDlg dialog 
 
 
CColorSetDlg::CColorSetDlg(int nType,CWnd* pParent /*=NULL*/) 
	: CDialog(CColorSetDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CColorSetDlg) 
	m_nColor_B = 0; 
	m_nColor_G = 0; 
	m_nColor_R = 0; 
	//}}AFX_DATA_INIT 
	m_nColorType=nType; 
	m_nNumPatterns = 40 ; 
	m_nColorOther    = 1000 ; 
	m_nColorAuto   = 1001; 
	m_OtherColorRect.top	= 118 ; 
	m_OtherColorRect.left	= 0 ; 
	m_OtherColorRect.bottom = 140 ; 
	m_OtherColorRect.right  = 146 ; 
 
	m_AutoSetRect.top=0; 
	m_AutoSetRect.left=0; 
	m_AutoSetRect.bottom=22; 
	m_AutoSetRect.right=146; 
 
	m_AutoColorRect.left=0; 
	m_AutoColorRect.top=0; 
	m_AutoColorRect.bottom=22; 
	m_AutoColorRect.right=22;	 
 
 
	m_nBoxSize = 18 ; 
	m_nNumColumns = 8 ; 
	m_nMargin = 1 ; 
	m_nCurrent = -1 ; 
	m_nSelect  = -1 ; 
 
	m_clrArray[0]=RGB(0,0,0); 
	m_clrArray[1]=RGB(153,51,0); 
	m_clrArray[2]=RGB(51,51,0); 
	m_clrArray[3]=RGB(0,51,0); 
	m_clrArray[4]=RGB(0,51,102); 
	m_clrArray[5]=RGB(0,0,128); 
	m_clrArray[6]=RGB(51,51,153); 
	m_clrArray[7]=RGB(51,51,51); 
 
	m_clrArray[8]=RGB(128,0,0); 
	m_clrArray[9]=RGB(255,102,0); 
	m_clrArray[10]=RGB(128,128,0); 
	m_clrArray[11]=RGB(0,1128,0); 
	m_clrArray[12]=RGB(0,128,128); 
	m_clrArray[13]=RGB(0,0,255); 
	m_clrArray[14]=RGB(102,102,153); 
	m_clrArray[15]=RGB(128,128,128); 
 
	m_clrArray[16]=RGB(255,0,0); 
	m_clrArray[17]=RGB(255,153,0); 
	m_clrArray[18]=RGB(153,204,0); 
	m_clrArray[19]=RGB(51,153,102); 
	m_clrArray[20]=RGB(51,204,204); 
	m_clrArray[21]=RGB(51,102,255); 
	m_clrArray[22]=RGB(128,0,128); 
	m_clrArray[23]=RGB(153,153,153); 
 
	m_clrArray[24]=RGB(255,0,255); 
	m_clrArray[25]=RGB(255,204,0); 
	m_clrArray[26]=RGB(255,255,0); 
	m_clrArray[27]=RGB(0,255,0); 
	m_clrArray[28]=RGB(0,255,255); 
	m_clrArray[29]=RGB(0,204,255); 
	m_clrArray[30]=RGB(153,51,102); 
	m_clrArray[31]=RGB(192,192,192); 
 
	m_clrArray[32]=RGB(234,255,204); 
	m_clrArray[33]=RGB(255,204,53); 
	m_clrArray[34]=RGB(255,255,153); 
	m_clrArray[35]=RGB(204,255,204); 
	m_clrArray[36]=RGB(204,255,255); 
	m_clrArray[37]=RGB(53,204,255); 
	m_clrArray[38]=RGB(204,153,255); 
	m_clrArray[39]=RGB(255,255,255); 
 
	m_pWndParent=pParent; 
} 
 
 
void CColorSetDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CColorSetDlg) 
	DDX_Text(pDX, IDC_COLOR_B, m_nColor_B); 
	DDV_MinMaxInt(pDX, m_nColor_B, 0, 255); 
	DDX_Text(pDX, IDC_COLOR_G, m_nColor_G); 
	DDV_MinMaxInt(pDX, m_nColor_G, 0, 255); 
	DDX_Text(pDX, IDC_COLOR_R, m_nColor_R); 
	DDV_MinMaxInt(pDX, m_nColor_R, 0, 255); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CColorSetDlg, CDialog) 
	//{{AFX_MSG_MAP(CColorSetDlg) 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_KILLFOCUS() 
	ON_WM_MOUSEMOVE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CColorSetDlg message handlers 
 
void CColorSetDlg::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	int i ; 
	draw_cell(&dc,m_nColorAuto); 
	for(i=0;iPostMessage(WM_COMMAND,IDCANCEL) ; 
		} 
	}else if(m_AutoSetRect.PtInRect(point)) {		 
		SetColor(RGB(0,0,0));			 
		this->PostMessage(WM_COMMAND,IDCANCEL) ;		 
	} else { 
		for(i=0;iPostMessage(WM_COMMAND,IDCANCEL) ; 
				} 
			} 
		} 
	}	 
	CDialog::OnLButtonDown(nFlags, point); 
} 
 
void CColorSetDlg::OnKillFocus(CWnd* pNewWnd)  
{ 
	CDialog::OnKillFocus(pNewWnd);	 
	// TODO: Add your message handler code here 
	 
	this->PostMessage(WM_COMMAND,IDCANCEL); 
	 
} 
 
void CColorSetDlg::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	BOOL flag = FALSE ;		 
	int i ; 
	CRect rect ;	 
	if(m_AutoSetRect.PtInRect(point)) { 
		if(this->m_nSelect!=m_nColorAuto) { 
			CClientDC dc(this);  			 
			int old = m_nSelect ; 
			m_nSelect = -1 ; 
			if(old>=0) draw_cell(&dc,old) ;			 
			m_nSelect = m_nColorAuto ; 
			draw_cell(&dc,m_nColorAuto) ; 
		}		 
		flag = TRUE ; 
	} 
	if(!flag){ 
		GetCellRect(m_nColorOther,&rect) ; 
		if(rect.PtInRect(point)) { 
			if(m_nSelect!=m_nColorOther) { 
				CClientDC dc(this);   
				 
				int old = this->m_nSelect ; 
				m_nSelect = -1 ; 
				if(old>=0) draw_cell(&dc,old) ; 
				 
				m_nSelect = m_nColorOther ; 
				draw_cell(&dc,m_nColorOther) ; 
			}			 
			flag = TRUE ; 
		} 
	} 
	if(!flag) { 
		for(i=0;im_nSelect!=i) { 
						CClientDC dc(this);   
						 
						int old = this->m_nSelect ; 
						this->m_nSelect = -1 ; 
						if(old>=0) draw_cell(&dc,old) ; 
						 
						this->m_nSelect = i ; 
						draw_cell(&dc,i) ; 
					} 
					flag = TRUE ; 
					break ; 
				} 
			} 
		}	} 
	if(!flag) { 
		CClientDC dc(this);  		 
		int old = this->m_nSelect ; 
		this->m_nSelect = -1 ; 
		if(old>=0) draw_cell(&dc,old) ; 
	}	 
	CDialog::OnMouseMove(nFlags, point); 
} 
 
void CColorSetDlg::draw_cell(CDC *pDC, int i) 
{ 
	if(i==m_nColorOther) { 
		CRect rect = m_OtherColorRect ; 
        rect.top += 2*m_nMargin;		 
        // Fill background 
        pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));		 
        // Draw horizontal line 
        pDC->FillSolidRect(m_OtherColorRect.left+2*m_nMargin, m_OtherColorRect.top, 
			m_OtherColorRect.Width()-4*m_nMargin, 1, ::GetSysColor(COLOR_3DSHADOW)); 
        pDC->FillSolidRect(m_OtherColorRect.left+2*m_nMargin, m_OtherColorRect.top+1, 
			m_OtherColorRect.Width()-4*m_nMargin, 1, ::GetSysColor(COLOR_3DHILIGHT)); 
		 
        rect.DeflateRect(1,1);		 
        // Draw button 
        if (i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT); 
        else if (i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT); 
		 
		NONCLIENTMETRICS ncm; 
		ncm.cbSize = sizeof(NONCLIENTMETRICS); 
		VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)); 
		CFont font ; 
		font.CreateFontIndirect(&(ncm.lfMessageFont)) ; 
		 
		CFont* pOldFont = (CFont*)pDC->SelectObject(&font) ; 
		 
        pDC->SetBkMode(TRANSPARENT); 
		CString str ; 
#ifdef IDS_AUTO_COLOR 
		str.LoadString(IDS_OTHER_COLOR) ; 
#else 
		str="其它颜色"; 
#endif			 
        pDC->DrawText(str, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);		 
		pDC->SelectObject(pOldFont) ;		 
	}else if(i==m_nColorAuto) { 
		CRect rect = m_AutoSetRect ; 
        rect.bottom += 2*m_nMargin;		 
        // Fill background 
        pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));         
        pDC->FillSolidRect(m_AutoSetRect.left+m_nMargin, m_AutoSetRect.bottom-1, 
			m_AutoSetRect.Width()-2*m_nMargin, 1, ::GetSysColor(COLOR_3DHILIGHT));		 
        rect.DeflateRect(m_nMargin,m_nMargin);		 
        // Draw button 
        if (i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT); 
        else if (i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT); 
		// Draw Out Rect 
        pDC->MoveTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.top+3*m_nMargin); 
		pDC->LineTo(m_AutoSetRect.right-5*m_nMargin,m_AutoSetRect.top+3*m_nMargin); 
		pDC->LineTo(m_AutoSetRect.right-5*m_nMargin,m_AutoSetRect.bottom-3*m_nMargin); 
		pDC->LineTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.bottom-3*m_nMargin); 
		pDC->LineTo(m_AutoSetRect.left+5*m_nMargin,m_AutoSetRect.top+3*m_nMargin); 
         
		// Draw the AutoColorRect 
        CPen   pen; 
		pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));	 
		CBrush brush ;			 
		brush.CreateSolidBrush(RGB(0,0,0)) ; 
		CPen*   pOldPen   = (CPen*)   pDC->SelectObject(&pen); 
		CBrush* pOldBrush = (CBrush*) pDC->SelectObject(&brush);			 
		rect=m_AutoColorRect; 
		rect.DeflateRect(0,4*m_nMargin+1); 
		rect.left+=7*m_nMargin+1; 
		pDC->Rectangle(rect);		 
		pDC->SelectObject(pOldBrush); 
		pDC->SelectObject(pOldPen);	 
 
		// Text 
		NONCLIENTMETRICS ncm; 
		ncm.cbSize = sizeof(NONCLIENTMETRICS); 
		VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)); 
		CFont font ; 
		font.CreateFontIndirect(&(ncm.lfMessageFont)) ; 
		 
		CFont* pOldFont = (CFont*)pDC->SelectObject(&font) ; 
		 
        pDC->SetBkMode(TRANSPARENT); 
		CString str ; 
#ifdef IDS_AUTO_COLOR 
		str.LoadString(IDS_AUTO_COLOR) ; 
#else 
		str="自动"; 
#endif		 
        pDC->DrawText(str, m_AutoSetRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);		 
		pDC->SelectObject(pOldFont) ;		 
	}else { 
		CRect rect; 
		if (!GetCellRect(i,&rect)) return; 
		 
		pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE)); 
		 
		if(i==this->m_nSelect) pDC->DrawEdge(rect, BDR_RAISEDINNER, BF_RECT); 
		else if(i==this->m_nCurrent) pDC->DrawEdge(rect, BDR_SUNKENOUTER, BF_RECT); 
		 
		CPen   pen; 
		pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW)); 
		CPen*   pOldPen   = (CPen*)   pDC->SelectObject(&pen); 
		 
		CBrush brush ; 
		CBrush* pOldBrush ; 
		 
		brush.CreateSolidBrush(GetColor(i)) ; 
		pOldBrush = (CBrush*) pDC->SelectObject(&brush); 
		 
		// Draw the cell colour 
		rect.DeflateRect(m_nMargin+1, m_nMargin+1); 
		pDC->Rectangle(rect); 
		 
		// restore DC and cleanup 
		pDC->SelectObject(pOldBrush); 
		pDC->SelectObject(pOldPen); 
	} 
} 
 
int	CColorSetDlg::GetRow(int i) 
{ 
	return i / m_nNumColumns;  
 
} 
int	CColorSetDlg::GetColumn(int i) 
{ 
	return i % m_nNumColumns;  
 
} 
BOOL CColorSetDlg::GetCellRect(int i,CRect* pRect) 
{ 
	if(i==this->m_nColorOther) { 
		*pRect = this->m_OtherColorRect ; 
	} 
	else { 
		if (i < 0 || i >= m_nNumPatterns) 
			return FALSE; 
		 
		pRect->left		= GetColumn(i) * m_nBoxSize + m_nMargin; 
		pRect->top		= GetRow(i)	* m_nBoxSize + m_nMargin + m_AutoSetRect.Height()+2*m_nMargin; 
		pRect->right	= pRect->left	+ m_nBoxSize; 
		pRect->bottom	= pRect->top	+ m_nBoxSize; 
	}	 
	return TRUE; 
} 
COLORREF CColorSetDlg::GetColor(int i) 
{ 
   return m_clrArray[i]; 
} 
COLORREF CColorSetDlg::GetColor() 
{ 
	return RGB(m_nColor_R,m_nColor_G,m_nColor_B);	  
} 
void CColorSetDlg::InitColor(COLORREF color) 
{	 
    m_nColor_R=(int)GetRValue(color); 
	m_nColor_G=(int)GetGValue(color); 
    m_nColor_B=(int)GetBValue(color); 
	for(int i=0;iPostMessage(WM_SETCOLOR,WPARAM(color)); 
	}else if(m_nColorType==1&&m_pWndParent!=NULL){ 
        m_pWndParent->PostMessage(WM_SETFILLCOLOR,WPARAM(color)); 
	} 
} 
COLORREF CColorSetDlg::GetInitColor() 
{ 
	return RGB(m_nColor_R,m_nColor_G,m_nColor_B);	  
} 
 
 
 
BOOL CColorSetDlg::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	 
	return CDialog::PreCreateWindow(cs); 
}