graphpa.cpp

来自「VC做的矢量画图程序!」· C++ 代码 · 共 750 行 · 第 1/2 页

CPP
750
字号
// XxColorSetDialog.cpp : implementation file
//

#include "stdafx.h"
#include "draw.h"
#include "drawdoc.h"
#include "graphpa.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CGraphPara *p_GraphPara;	//初试化一个公用的关于图形参数的实例
extern int	nCharHeight,nCharWidth;

/////////////////////////////////////////////////////////////////////////////
// XxColorSetDialog dialog


XxColorSetDialog::XxColorSetDialog(CWnd* pParent /*=NULL*/)
	: CDialog(XxColorSetDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(XxColorSetDialog)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

//构造函数
XxColorSetDialog::XxColorSetDialog(short color1,short color2,short color3,short color4,short linetype,short linewide,CWnd* pParent /*=NULL*/)
	: CDialog(XxColorSetDialog::IDD, pParent)
{
	m_color1=color1;	//笔色
	m_color2=color2;	//屏幕底色
	m_color3=color3;	//填充色
	m_color4=color4;	//虚线间隔色
	m_linetype=linetype;//线型	
	m_linewide=linewide;//线宽
}

void XxColorSetDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(XxColorSetDialog)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

//初始化函数
BOOL XxColorSetDialog::OnInitDialog()
{
	//得到并设置滚动条
	bar1=(CScrollBar*)(GetDlgItem(IDC_SCROLLBAR1));
	bar1->SetScrollRange(0,255,TRUE);
	bar1->SetScrollPos(m_linewide);//rrr.top=0;
	return TRUE;
}

//对话框绘制函数,绘制对话框中的内容
void XxColorSetDialog::draw()
{      
	char p1[4];
	CPaintDC ddd(this);
	CPen pen1(m_linetype,m_linewide,p_GraphPara->GetColor(m_color1));
	CBrush* pbrush;
	CPen* pOldpen;
	pOldpen=ddd.SelectObject(&pen1);
	//以下绘制屏幕底色矩形
	ddd.SetBkColor(p_GraphPara->GetColor(m_color2));
	pbrush=new CBrush(p_GraphPara->GetColor(m_color2));
	CStatic* pStatic=(CStatic *)GetDlgItem(IDC_STATIC1);
	pStatic->GetWindowRect(r1);
	ScreenToClient(&r1);
	r1.top+=10;
	ddd.FillRect(r1,pbrush);
	//以下绘制笔色线
	ddd.MoveTo(r1.left,(r1.top+r1.bottom)/2);
	ddd.LineTo(r1.right,(r1.top+r1.bottom)/2);
	delete pbrush;
	//以下绘制填充色方格  
	pbrush=new CBrush(p_GraphPara->GetColor(m_color3));
	pStatic=(CStatic *)GetDlgItem(IDC_STATIC2);
	pStatic->GetWindowRect(r1);
	ScreenToClient(&r1);
	r1.top+=10;
	ddd.FillRect(r1,pbrush);
	delete pbrush;
	//以下绘制虚线间隔色方格
	pbrush=new CBrush(p_GraphPara->GetColor(m_color4));
	pStatic=(CStatic *)GetDlgItem(IDC_STATIC3);
	pStatic->GetWindowRect(r1);
	ScreenToClient(&r1);
	r1.top+=10;
	ddd.FillRect(r1,pbrush);
	delete pbrush;
	//以下填写线宽
	ddd.SelectObject(pOldpen);
	sprintf(p1,"%d",m_linewide);
	SetDlgItemText(IDC_STATIC6,p1);
}

//保存退出对话狂
void XxColorSetDialog::OnOk()
{
	EndDialog(IDOK);
}

//放弃退出对话框
void XxColorSetDialog::OnCancel()
{
	EndDialog(IDCANCEL);
}

//设置笔色
void XxColorSetDialog::penColor()
{
	ColorSetDialog pDg1(m_color1);
	if(pDg1.DoModal()==IDOK)
	{
		m_color1=pDg1.m_ColorIndex;
		Invalidate();
	}
}

//设置屏幕底色
void XxColorSetDialog::backColor()
{
	ColorSetDialog pDg1(m_color2);
	if(pDg1.DoModal()==IDOK)
	{
		m_color2=pDg1.m_ColorIndex;
		Invalidate();
	}
}

//设置虚线间隔色
void XxColorSetDialog::betweenColor()
{
	ColorSetDialog pDg1(m_color4);
	if(pDg1.DoModal()==IDOK)
	{
		m_color4=pDg1.m_ColorIndex;
		Invalidate();
	}
}

//设置填充色
void XxColorSetDialog::brushColor()
{
	ColorSetDialog pDg1(m_color3);
	if(pDg1.DoModal()==IDOK)
	{
		m_color3=pDg1.m_ColorIndex;
		Invalidate();
	}
}

//滚动纵向滚动条的消息处理函数
void XxColorSetDialog::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar *pScrollBar)
{
	short nScrollInc;
	int nNewPos;
	switch(nSBCode) //判断按键位置
	{
	    case SB_TOP:                 //如果将滚动条滚动到顶部
			nScrollInc=-m_linewide;   //得到相对滚动范围
			break;
		case SB_BOTTOM:              //如果将滚动条滚动到底部
			nScrollInc=100-m_linewide; //得到相对的滚动范围
			break;
		case SB_LINEUP:             //如果按了滚动条中的向上的按键
			nScrollInc=-1;      //得到相对滚动位置
			break;
		case SB_LINEDOWN:           //如果按中了向下的按键
			nScrollInc=1;        //得到相对的滚动位置
			break;
		case SB_PAGEUP:             //如果按中了中间活动按钮的上部区域
			nScrollInc=-10;       //得到相对的滚动位置
			break;                    
		case SB_PAGEDOWN:           //如果按中了中间活动钮的下部位置
			nScrollInc=10;        //得到相对的滚动位置
			break;
		case SB_THUMBPOSITION:      //如果用鼠标拖动中间活动钮到一个位置
			nScrollInc=nPos-m_linewide; //通过信息处理函数得到的按钮位置得到相对移动位置
			break;
		default:
			nScrollInc=0;
	}
	 //进行滚动边界检查,得到实际的滚动位置(不能超出滚动条的滚动范围)
	nNewPos=max(1,min(m_linewide+nScrollInc,100));
	//得到实际的相对滚动范围
	nScrollInc=nNewPos-m_linewide;
	if(nScrollInc)			//如果产生了滚动
	{
		m_linewide=nNewPos;  //设定新的滚动位置
		bar1->SetScrollPos(m_linewide);
		UpdateWindow();		//使滚动条的位置改动在屏幕上实现
		Invalidate();
	}
}

//设置线型
void XxColorSetDialog::LineTypeSet()
{
	LineSetDialog pDlg1(m_linetype);
	if(pDlg1.DoModal()==IDOK)
	{
		m_linetype=pDlg1.m_LineType;
		Invalidate();
	};
}


BEGIN_MESSAGE_MAP(XxColorSetDialog, CDialog)
	//{{AFX_MSG_MAP(XxColorSetDialog)
  ON_BN_CLICKED(IDOK,OnOk)
  ON_COMMAND(IDOK,CMOK)
  ON_BN_CLICKED(IDCANCEL,OnCancel)
  ON_COMMAND(IDCANCEL,CMCancel)
  ON_WM_PAINT()
  ON_BN_CLICKED(IDC_COLOR_PEN,penColor)
  ON_BN_CLICKED(IDC_COLOR_BACK,backColor)
  ON_BN_CLICKED(IDC_COLOR_BRUSH,brushColor)
  ON_BN_CLICKED(IDC_LINE_TYPE,LineTypeSet)
  ON_BN_CLICKED(IDC_COLOR_BETWEEN,betweenColor)
  ON_WM_VSCROLL()
		// NOTE: the ClassWizard will add message map macros here
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// XxColorSetDialog message handlers
/////////////////////////////////////////////////////////////////////////////
// ColorSet dialog


ColorSetDialog::ColorSetDialog(CWnd* pParent /*=NULL*/)
	: CDialog(ColorSetDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(ColorSet)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

//构造函数
//ColorIndex-设置前颜色的序号
ColorSetDialog::ColorSetDialog(int ColorIndex,CWnd* pParent /*=NULL*/)
	: CDialog(ColorSetDialog::IDD, pParent)
{
	m_ColorIndex=ColorIndex;
}

void ColorSetDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ColorSet)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

//调用Windows颜色配置对话框设置当前选中的颜色值
void ColorSetDialog::nrxg()
{
	if(m_ColorIndex>=0&&m_ColorIndex<100)
	{
		CColorDialog ColorDlgBox(0,0,this);
		if(ColorDlgBox.DoModal()==IDOK)
		{
			p_GraphPara->m_ColorList[m_ColorIndex]=ColorDlgBox.GetColor();
			Invalidate();
		}
	}
}

//初始化函数
BOOL ColorSetDialog::OnInitDialog()
{
	CRect r1;
	GetClientRect(&r1);		//得到显示区的大小
	width=r1.right/10;
	widthAll=width*10;
	//以下得到修改按钮的位置,以确定显示区的高度
	CButton* pbut=(CButton *)GetDlgItem(ID_YS_XG);
	pbut->GetWindowRect(r1);
	ScreenToClient(&r1);
	height=(r1.top-10)/10;
	heightAll=height*10;
	return TRUE;
}

//绘制函数
void ColorSetDialog::draw()
{;
	
	int k1,k2;
	CPaintDC ht(this);
	CPen pen(0,2,RGB(255,255,255));
	CPen* oldpen=ht.SelectObject(&pen);
	ht.Rectangle(0,0,widthAll,heightAll);
	for(int i=0;i<100;i++)	//绘制各个颜色
		draw1(i);
	if(m_ColorIndex>=0&&m_ColorIndex<100)
	//如果当前选中了某种颜色,在这个颜色方格边绘制一个粗线边框
	{
		ht.SetROP2(R2_NOT);
		k2=m_ColorIndex/10;
		k1=m_ColorIndex-k2*10;
		ht.MoveTo(width*k1,height*k2);
		ht.LineTo(width*(k1+1),height*k2);
		ht.LineTo(width*(k1+1),height*(k2+1));
		ht.LineTo(width*(k1),height*(k2+1));
		ht.LineTo(width*(k1),height*(k2));
		m_ColorIndex1=m_ColorIndex;
	}
	ht.SelectObject(oldpen);
}

//绘制一个颜色(用颜色填充一个方格
//nIndex-要绘制颜色的序号
void ColorSetDialog::draw1(int nIndex)
{
	CClientDC ddd(this);
	int k1,k2;
	k1=nIndex/10;
	k2=nIndex-k1*10;
	CPen pen(0,1,p_GraphPara->GetColor(nIndex));
	CBrush brush(p_GraphPara->GetColor(nIndex));
	CPen* poldp=ddd.SelectObject(&pen);
	CBrush* poldb=ddd.SelectObject(&brush);
	ddd.Rectangle(k2*width,k1*height,(k2+1)*width-1,(k1+1)*height-1);
	ddd.SelectObject(poldp);
	ddd.SelectObject(poldb);
}

//按下鼠标左键的消息处理函数
void ColorSetDialog::OnLButtonDown(UINT nFlags,CPoint point)
{
	CClientDC ddd(this);
	CPen pen(0,1,RGB(255,255,255));
	int h1,v1;
	v1=point.y/height;
	h1=point.x/width;
	m_ColorIndex=v1*10+h1;
	if(m_ColorIndex==m_ColorIndex1||v1>=10||h1>=10)//如果没有点中已经存在的颜色方格,函数退出
		return;
	CPen* pold=ddd.SelectObject(&pen);
	ddd.SetROP2(R2_NOT);
	//在当前点中的颜色方格外绘制边框
	ddd.MoveTo(h1*width,v1*height);
	ddd.LineTo(h1*width,(v1+1)*height);
	ddd.LineTo((h1+1)*width,(v1+1)*height);
	ddd.LineTo((h1+1)*width,v1*height);
	ddd.LineTo(h1*width,v1*height);
	v1=m_ColorIndex1/10;
	h1=m_ColorIndex1-v1*10;
	//在原来点中的颜色方格外绘制边框(去掉原来的边框)
	ddd.MoveTo(h1*width,v1*height);
	ddd.LineTo(h1*width,(v1+1)*height);
	ddd.LineTo((h1+1)*width,(v1+1)*height);
	ddd.LineTo((h1+1)*width,v1*height);
	ddd.LineTo(h1*width,v1*height);
	ddd.SelectObject(pold);
	m_ColorIndex1=m_ColorIndex;
}

//保存退出
void ColorSetDialog::OnOk()
{
	EndDialog(IDOK);
}

//放弃退出
void ColorSetDialog::OnCancel()
{
	EndDialog(IDCANCEL);

⌨️ 快捷键说明

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