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 + -
显示快捷键?