画图老是出错!求教

spritegg 2003-05-06 11:32:33
我编了一个仿真程序,在对话框中绘图。
开始设定仿真时间(也就是横轴)为10s,仿真步长为0.02s时程序运行很正常,没有问题,但是如果把仿真时间改成20s或更大,或者把步长变小的时候,画图程序就出现问题了,经常画了一半左右的时候图形就从对话框跑到屏幕上去了,在屏幕上他还能继续向前走。那位有过累死的经验,快帮我看看!!!
...全文
91 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
spritegg 2003-05-07
  • 打赏
  • 举报
回复
void CHss1Dlg1::drawfig(int left, int top, int right, int bottom,double *Ylmt)
{ int width,high,x0,y0,a;
int i,j,num;
// float t,HV=1.,HA=0.,y=0.;
/*HV.HA: 容积和转子的动态时间常数
y:信号叠加系数*/
// double z[6],s[6],h[5];
//double k[6][5];
// int tt[6],yy[6];
//int cr[6]={0,WHITE,DARKGRAY,GREEN,RED,LIGHTMAGENTA};
//float Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
char ch[8];
char *zch[6]={"","ψ(r/min)","ρ","ξ","σ","μ"};
char *zp[6]={""," ψ转速","ρ蒸汽室压力","ξ调速器位移",
" σ滑阀位移","μ油动机位移"};
//int calculate;/*calculate:实时模式计算进行标志 1:进行*/
// float int_tmp;/*中断间隔时间 0.065536/1.193=1/18.2秒*/
// FILE *fd_temp;
int j_temp=15;
// long int b_pos;
num=5;

width=right-left;
high=bottom-top;
x0=left;
y0=top+high/2;
HWND hwnd=GetSafeHwnd();
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CDC dc;
// CMemDC1 dc1(&dc);
// CString string;
// string="the SGA For Vane Setting";
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
//画表格边框
dc.MoveTo(left,top);
dc.LineTo(left,bottom);
dc.MoveTo(left,bottom);
dc.LineTo(right,bottom);

dc.MoveTo(right,bottom);
dc.LineTo(right,top);
dc.MoveTo(right,top);
dc.LineTo(left,top);
dc.MoveTo(x0,y0);
dc.LineTo(x0+width,y0);
//画横坐标刻度
CString str;
//设置字体
CFont font;
font.CreateFont(-12, //字体字符的逻辑高度
0, //字符平均宽度取默认值
0, //文本行角度为0,水平
0, //字符角度为0,正立
FW_NORMAL, //正常字体
FALSE, //不倾斜
FALSE, //不加下划线
FALSE, //不加删除线
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"Times New Roman");
CFont *oldFont=dc.SelectObject (&font);
// dc1.SelectObject(oldFont);

COLORREF crColor=GetSysColor(COLOR_BTNFACE);
dc.SetBkColor(crColor);
for(i=0;i<51;i++)/*时间轴:0-Tend (秒)*/
{
a=x0+f_int(i/50.0*width);
dc.MoveTo(a,bottom);
dc.LineTo(a,bottom-2);
if(i%10==0)
{
dc.MoveTo(a,bottom);
dc.LineTo(a,bottom-5);
gcvt(dd.Tend/50.0*i,2,ch);
//str.Format("%6.2f",dd.Tend/50.0*i);
dc.TextOut(a-3,y0+high/2+5,ch);
}
}

dc.TextOut(x0+width-5,y0+high/2+18,"t(s)");

for(j=-30;j<=30;j++)/*转速轴:2400-3600 (r/min)*/
{
a=y0-f_int(j/30.0*high/2.0);
//line(x0,a,x0+2,a);
dc.MoveTo(x0,a);
dc.LineTo(x0+2,a);
if(j%5==0)
{
//line(x0,a,x0+4,a);
dc.MoveTo(x0,a);
dc.LineTo(x0+5,a);
gcvt((Ylmt[1]*(j/30.0)+1)*3000,4,ch);
dc.TextOut(x0-35,a-6,ch);
}
}

for(j=-15;j<=15;j++)/*其它轴:-1.5 - +1.5 (相对量)*/
{
a=y0-f_int(j/15.0*high/2.0);
//line(x0+width,a,x0+width-2,a);
dc.MoveTo(x0+width,a);
dc.LineTo(x0+width-2,a);
if(j%5==0)
{
//line(x0+width,a,x0+width-4,a);
dc.MoveTo(x0+width,a);
dc.LineTo(x0+width-5,a);
gcvt(Ylmt[2]*(j/15.0),4,ch);
dc.TextOut(x0+width+4,a-8,ch);
}
}
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,255));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[0]);
dc.MoveTo(40,428);
dc.LineTo(77,428);
dc.TextOut(42,433,"ψ转速");
dc.TextOut(40,20,"ψ(r/min)");
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(255,0,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[1]);
dc.MoveTo(145,428);
dc.LineTo(185,428);
dc.TextOut(135,433,"ρ蒸汽室压力");
dc.TextOut(535,20,"ρ");
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,128,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[2]);
dc.TextOut(262,433,"ξ调速器位移");
dc.TextOut(545,20,"ξ");
dc.MoveTo(270,428);
dc.LineTo(315,428);
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[3]);
dc.TextOut(390,433,"σ滑阀位移");
dc.TextOut(555,20,"σ");
dc.MoveTo(395,428);
dc.LineTo(440,428);
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[4]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
dc.SetBkColor(crColor);
dc.SelectObject (&font);
dc.SetTextColor(m_colors[4]);
dc.TextOut(492,433,"μ油动机位移");
dc.TextOut(565,20,"μ");
dc.MoveTo(500,428);
dc.LineTo(540,428);
}

void CHss1Dlg1::OnPaint()
{ int i;
CPaintDC dc(this); // device context for painting
double Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
// TODO: Add your message handler code here
CRect rectClip;
if(dc.GetClipBox(&rectClip)!=NULLREGION&&mflag==1)
{ //AfxMessageBox("adafd");
HWND hwnd=GetSafeHwnd();
drawfig(60,45,555,400,Ylmt);

mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[0]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp0[i]);
dc.LineTo(ttemp0[i+1]);}

mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[1]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp1[i]);
dc.LineTo(ttemp1[i+1]);}

mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[2]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp2[i]);
dc.LineTo(ttemp2[i+1]);}

mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[3]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp3[i]);
dc.LineTo(ttemp3[i+1]);}

mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[4]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
for(i=0;i<f_int(dd.Tend/dd.H)-1;i++)
{dc.MoveTo(ttemp4[i]);
dc.LineTo(ttemp4[i+1]);}
}
// Do not call CDialog::OnPaint() for painting messages
}


spritegg 2003-05-07
  • 打赏
  • 举报
回复
下面是我得三个主要函数的代码,simu仿真函数,包括仿真计算及画图在内,OnPaint()重画函数,drawfig()函数主要是画表格边框。高手帮我看看,谢了!


void CHss1Dlg1::simu(int flag,int simu_mode)
/*flag: 0 只画坐标系 1 仿真
simu_mode: 0 实时模式 1仿真模式
*/
{ int i,j,num,lk=0;
int left,right,top,bottom,width,high,x0,y0;
double t,HV=1.,HA=0.,y=0.;
/*HV.HA: 容积和转子的动态时间常数
y:信号叠加系数*/
double z[6],s[6],h[5],k[6][5];
// int a,
int tt[6],yy[6];
// int cr[6]={0,BLACK,GREEN,BROWN,RED,LIGHTMAGENTA};
double Ylmt[6]={0,0.2,1.5,1.5,1.5,1.5};
// char ch[8];
char *zch[6]={"","ψ(r/min)","ρ","ξ","σ","μ"};
char *zp[6]={""," ψ转速","ρ蒸汽室压力","ξ调速器位移",
" σ滑阀位移","μ油动机位移"};
// int calculate;/*calculate:实时模式计算进行标志 1:进行*/
// double int_tmp;/*中断间隔时间 0.065536/1.193=1/18.2秒*/
//FILE *fd_temp;
int j_temp=15;
// long int b_pos;

mflag=0;
qingping();

num=5;
drawfig(60,45,555,400,Ylmt); //画表格边框,代码在后面
mflag=1;
left=60;
right=555;
top=45;
bottom=400;
width=right-left;
high=bottom-top;
x0=left;
y0=top+high/2;
HWND hwnd=GetSafeHwnd();
mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CDC dc;
// CMemDC1 dc1(&dc);
// CString string;
// string="the SGA For Vane Setting";
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);

/*变量初始化*/
for(i=0;i<=num;i++)
{
for(j=0;j<=4;j++) k[i][j] = 0.;
s[i] = 0.; z[i] = 0.;
}
h[1]=0.; h[2]=h[3]= dd.H/2.; h[4]=dd.H;

//dc.MoveTo(x0,y0);
/*画图中间变量f_int(dd.Tend/dd.H)+5*/
temp0=new double[f_int(dd.Tend/dd.H)+5];
temp1=new double[f_int(dd.Tend/dd.H)+5];
temp2=new double[f_int(dd.Tend/dd.H)+5];
temp3=new double[f_int(dd.Tend/dd.H)+5];
temp4=new double[f_int(dd.Tend/dd.H)+5];
temp5=new double[f_int(dd.Tend/dd.H)+5];

ttemp0=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp1=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp2=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp3=new CPoint[f_int(dd.Tend/dd.H)+5];
ttemp4=new CPoint[f_int(dd.Tend/dd.H)+5];
for(i=1;i<=num;i++) { tt[i]=x0; yy[i]=y0; }
t=0; /*从0秒开使仿真*/



do
{
t=t+dd.H;
z[3]=fd(z[3],dd.Vd,1);/*滑阀死区:dd.Vd*/
z[4]=fd(z[4],dd.Rd,1);/*油动机死区:dd.Rd*/
//CString str;
// str.Format("%f,%f",z[3],z[4]);
// AfxMessageBox(str);
for(j=1;j<=4;j++)
{
for(i=1;i<=num;i++) s[i]=z[i]+h[j]*k[i][j-1] ;
/*某全液压钻孔泵系统*/
/*转 子dψ/dt [2] */ k[1][j] = (s[2]-HA*s[1]+dd.LOAD/100.0)/dd.TA;
/*蒸汽室dρ/dt [1] */ k[2][j] = (s[5]-HV*s[2])/dd.TV;
/*调速器dξ/dt [3] */ k[3][j] = (s[1]/dd.dtsp-s[3]-dd.Z1)/dd.TR;
/*滑 阀dσ/dt [4] */ k[4][j] = -(y*s[1]+s[3]+s[5]+s[4])/dd.TB;
/*油动机dμ/dt [5] */ k[5][j] = s[4]/dd.TS;
}
temp0[lk]=lk*dd.H;
for(i=1;i<=num;i++)
{z[i] = z[i] +dd.H/6.*(k[i][1] +2.*k[i][2] +2.*k[i][3] +k[i][4]);
if(i==1)
temp1[lk]=z[i];
if(i==2)
temp2[lk]=z[i];
if(i==3)
temp3[lk]=z[i];
if(i==4)
temp4[lk]=z[i];
if(i==5)
temp5[lk]=z[i];
}
z[4]=limit(z[4],dd.V2,dd.V1,1);/*滑阀限幅:dd.V2到dd.V1*/
z[5]=limit(z[5],dd.R2,dd.R1,1);/*油动机限幅:dd.R2到dd.R1*/
temp4[lk]=z[4];
temp5[lk]=z[5];

//Again:
for(i=1;i<=num;i++)
{mypen.DeleteObject();
mypen.CreatePen(PS_SOLID,1,m_colors[i-1]);
dc.Attach(::GetDC(hwnd));
dc.SelectObject(&mypen);
//setcolor(cr[i]);
//if(paint[i]!=1) continue;
if(i==1)
{ttemp0[lk].x=tt[i];
ttemp0[lk].y=yy[i];}
if(i==2)
{ttemp1[lk].x=tt[i];
ttemp1[lk].y=yy[i];}
if(i==3)
{ttemp2[lk].x=tt[i];
ttemp2[lk].y=yy[i];}
if(i==4)
{ttemp3[lk].x=tt[i];
ttemp3[lk].y=yy[i];}
if(i==5)
{ttemp4[lk].x=tt[i];
ttemp4[lk].y=yy[i];}
dc.MoveTo(tt[i],yy[i]);
tt[i]=f_int((t/dd.Tend)*width)+x0;
yy[i]=y0-f_int(z[i]*high/2/Ylmt[i]);
dc.LineTo(tt[i],yy[i]);
}
lk++;
if(simu_mode==0){
Sleep(25);}

}while((t<=dd.Tend)&&(tt[1]<=(x0+width)));

}


林仪明 2003-05-07
  • 打赏
  • 举报
回复
9494
shilong 2003-05-06
  • 打赏
  • 举报
回复
贴点源码...
你画图用的是哪个DC?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧