📄 mypaintviewbak1.cpp
字号:
// MyPaintView.cpp : implementation of the CMyPaintView class
//
#include "stdafx.h"
#include "MyPaint.h"
#include "math.h"
#include "MyPaintDoc.h"
#include "MyPaintView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.1415926
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView
CMyPaintView* dcpoint=0; //定义全局视类指针变量dcpoint
IMPLEMENT_DYNCREATE(CMyPaintView, CView)
BEGIN_MESSAGE_MAP(CMyPaintView, CView)
//{{AFX_MSG_MAP(CMyPaintView)
ON_WM_PAINT()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView construction/destruction
CMyPaintView::CMyPaintView()
{
extern CMainFrame* mainwnd;
// TODO: add construction code here
paint.Create(IDD_DIALOG1,mainwnd);
}
CMyPaintView::~CMyPaintView()
{
}
BOOL CMyPaintView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView drawing
void CMyPaintView::OnDraw(CDC* pDC)
{
CMyPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView printing
BOOL CMyPaintView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyPaintView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView diagnostics
#ifdef _DEBUG
void CMyPaintView::AssertValid() const
{
CView::AssertValid();
}
void CMyPaintView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyPaintDoc* CMyPaintView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyPaintDoc)));
return (CMyPaintDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
double powerchge(char part[],double x)
{
char data[50][32],operat[50];
int j,m,swich=0,n;
short a[50],aa=0,open=0;
for(j=0;j<50;a[j++]=1);
for(j=0,m=0,n=0;part[j]!='\0';j++,m++)//把part里每个数的正负性保存下来
{
if(part[j]=='-')
{
a[aa]=-a[aa];
open=0;
}
else
{
if(open==0) aa++;
open=1;
}
}
for(j=0,m=0,n=0;part[j]!='\0';j++,m++)
{
if((part[j]<48||part[j]>57)&&part[j]!='x'&&part[j]!='.')
{
if(swich==1)
{
if(part[j]=='-')//如果运算符是-的话就变+,因为上面a[]已经存放了每个数的正负性,所以大胆地变,以方便下面的+运算 part[j]='+';
operat[n]=part[j];
n++;
swich=0;
}
m=-1;
}
else
{
data[n][m]=part[j];
swich=1;
}
}//--------------------------------把一维数组PART分离成数字字符数组DATA,和运算符字符数组OPERAT;并把字符X取代为X的数值;
CString datanum[50];
double num[50];
for(int i=0;i<n+1;i++)
{
if(data[i][0]=='x') num[i]=a[i]*x;//把数字与它前面的符号相乘
else
{
datanum[i]=data[i];
num[i]=a[i]*atof(datanum[i]);//把数字与它前面的符号相乘
}
} //-------------------------------把DATA转化成double型数组num,使用中间数组datanum
for(i=0;i<n;i++)
{
if(operat[i]=='*')
num[i+1]=num[i]*num[i+1];
else
{
if(operat[i]=='/')
num[i+1]=num[i]/num[i+1];
}
}
for(i=0;i<n;i++)
{
if(operat[i]=='+')
{
for(j=i+1;operat[j]!='+'&&operat[j]!='-'&&j!=n;j++);
num[j]=num[i]+num[j];
}
} //由于part里已经没有‘-’号运算符,所以只算+法就行了
return num[n];
}
////////////////////////////////////////////////////////////////////////
double superchge(char expres[100],double xl)
{
char expresbak[100],part[100],partsumch[32];
CString partsumcs;
short length=0;
for(int k=0;k<100;expresbak[k++]='\0');
strcpy(expresbak,expres); //把expres备分到expresbak[]里
for(k=0;k<100;expres[k++]='\0',part[k++]='\0'); //初始化数组
for(k=0;k<32;partsumch[k++]='\0');
strcpy(expres,expresbak);//用expresbak还原expres
for(int i=0,j=0;expres[i]!='\0';i++)
{
if(expres[i]==')')
{
for(j=i-1;j>=0;j--)
{
if(expres[j]=='(')
{
for(int m=0,n=j+1;n<i;part[m++]=expres[n++]);//构建最底层的( )内的PART--------
//-----------------------判断'('左边是不是有函数符号,并进行相应的处理
if(expres[j-1]<97||expres[j-1]>122)//----------------------------------如果没有函数字符时的处理
{
partsumcs.Format("%f",powerchge(part,xl));
length=0;
}
else
{
if (expres[j-2]=='l'&&expres[j-1]=='n') //-------------判断'('左边是不是有函数符号,并进行相应的处理
{
if(log(powerchge(part,xl))!=-1)
partsumcs.Format("%f",log(powerchge(part,xl)));
else
partsumcs.Format("%f",0.0);
length=2;
}
if (expres[j-3]=='c'&&expres[j-2]=='o'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
partsumcs.Format("%f",cos(powerchge(part,xl)));
length=3;
}
if (expres[j-3]=='s'&&expres[j-2]=='i'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理 {
{
partsumcs.Format("%f",sin(powerchge(part,xl)));
length=3;
}
if (expres[j-3]=='t'&&expres[j-2]=='a'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
partsumcs.Format("%f",tan(powerchge(part,xl)));
length=3;
}
if (expres[j-3]=='c'&&expres[j-2]=='t'&&expres[j-1]=='g')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
partsumcs.Format("%f",1/tan(powerchge(part,xl)));
length=3;
}
if (expres[j-4]=='f'&&expres[j-3]=='a'&&expres[j-2]=='b'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理 {
{
partsumcs.Format("%f",fabs(powerchge(part,xl)));
length=4;
}
if (expres[j-4]=='a'&&expres[j-3]=='s'&&expres[j-2]=='i'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
if(asin(powerchge(part,xl))!=-1)
partsumcs.Format("%f",asin(powerchge(part,xl)));
else
partsumcs.Format("%f",0.0);
length=4;
}
if (expres[j-4]=='a'&&expres[j-3]=='c'&&expres[j-2]=='o'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
if(acos(powerchge(part,xl))!=-1)
partsumcs.Format("%f",acos(powerchge(part,xl)));
else
partsumcs.Format("%f",0.0);
length=4;
}
if (expres[j-4]=='a'&&expres[j-3]=='t'&&expres[j-2]=='a'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
partsumcs.Format("%f",atan(powerchge(part,xl)));
length=4;
}
if (expres[j-4]=='a'&&expres[j-3]=='c'&&expres[j-2]=='t'&&expres[j-1]=='g')//-------------判断'('左边是不是有函数符号,并进行相应的处理
{
partsumcs.Format("%f",PI/2-atan(powerchge(part,xl)));
length=4;
}
}
//-------------------------------------------把所得的CString类型的partsumcs复制给char类型的数组partsumch
strncpy(partsumch,(LPCTSTR)partsumcs,32);
//-----------------------------
/////////////////////////////////-----------------关键!重新构造expres数组
for(int rb1=j-length,k=0;partsumch[k]!='\0';expres[rb1++]=partsumch[k++]);//构造新的expres数组的前半部分
for(int rb2=i+1;expresbak[rb2]!='\0';expres[rb1++]=expresbak[rb2++]);//构造新的expres数组的后半部分
strcpy(expresbak,expres);
i=j-length+k-1;
for(k=0;k<100;part[k]='\0',k++); //part数组重新清0
break;
}
}
}
}
return powerchge(expres,xl);
}
//================================================================/////////////////////////////////////////
// CMyPaintView message handlers
void CMyPaintView::OnPaint()
{
CPaintDC dc(this); // device context for painting
dcpoint=this;
int x=GetSystemMetrics(SM_CXSCREEN)/2,
y=GetSystemMetrics(SM_CYSCREEN)/2,
style=0,xc;
double xl,yl;
char expres[100];//把CString变量COPY到expres[]里
CString num[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
dc.MoveTo(x,0);
dc.LineTo(x,y*2);
dc.MoveTo(0,y);
dc.LineTo(x*2,y);
dc.TextOut(x+5,y+1,'0');
for(int i=0;i<15;i++)
{
dc.TextOut(x+35,y+1,num[i]); //画X+轴坐标上的数字
dc.TextOut(x-525,y+1,num[14-i]); //画X-轴坐标上的数字
dc.TextOut(x-530,y+1,'-'); //画X-轴坐标上的‘-’号
dc.MoveTo(x-525,y-5); //画X-轴坐标上的分隔线,长度为5
dc.LineTo(x-525,y);
dc.MoveTo(x+35,y-5); //画X+轴坐标上的分隔线,长度为5
dc.LineTo(x+35,y);
x+=35;
}
x=GetSystemMetrics(SM_CXSCREEN)/2;
y=GetSystemMetrics(SM_CYSCREEN)/2;
for(i=0;i<15;i++)
{
dc.TextOut(x+10,y-525,num[14-i]);
dc.TextOut(x-10,y+35,num[i]);
dc.TextOut(x-15,y+35,'-');
dc.MoveTo(x+5,y-525);
dc.LineTo(x,y-525);
dc.MoveTo(x+5,y+35);
dc.LineTo(x,y+35);
y+=35;
}
CPen pen;
pen.CreatePen(0,paint.m_line,paint.color);
dc.SelectObject(&pen);
style=paint.m_pattern.GetCurSel();
x=GetSystemMetrics(SM_CXSCREEN)/2;
y=GetSystemMetrics(SM_CYSCREEN)/2;
if(style==0)
{
for(xc=-x,xl=-x-100,yl=0;xc<x;xc++)
{
strncpy(expres,(LPCTSTR)paint.m_expres,100);
strcat(expres,"+0");//奇怪,不加会有大错,加了也还是有点小错,费解~~
dc.MoveTo((int)(xl+x),(int)(yl+y));
xl=(xc+1)/35.0;
//dc.TextOut(20,20,expres);
yl=-1*(( superchge(expres,xl) )*35.0);//函数表达式
//检查用
//CString aa="";
//aa.Format("%f",asin(2));
//dc.TextOut(20,20,aa);
xl=xc+1.0;
dc.LineTo((int)(xl+x),(int)(yl+y));
}
}
else//进行点线计算,基本同上,免看
{
for(xc=-x;xc<x;xc+=3)
{
strncpy(expres,(LPCTSTR)paint.m_expres,100);
xl=(xc+1)/35.0;
yl=-1*(( superchge(expres,xl) )*35.0);//函数表达式
xl=xc+1.0;
dc.SetPixel((int)(xl+x),(int)(yl+y),paint.color);
//dc.MoveTo((int)(xl+x-2),yl+y-2);
//dc.LineTo((int)(xl+x),yl+y);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -