首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VC 动态画直线,该如何解决

2014-06-17 
VC 动态画直线已得到直线的起点与终点,起点是存在{x[a-1],y[b-1]},终点是{x[a],y[b]},怎样动态画这条直线

VC 动态画直线
已得到直线的起点与终点,起点是存在{x[a-1],y[b-1]},终点是{x[a],y[b]},怎样动态画这条直线啊??我按一个按钮,然后它自动在区域上显示直线的轨迹,现在只能实现动态画水平线和垂直线,不能实现画任意的斜线。。。。

[解决办法]
先调用 CDC::MoveTo 设置起点,然后调用 CDC::LineTo 就可以啦
[解决办法]
坐标转换一下就可以了,例如你把窗口中的(X0,Y0)点作为绘图的坐标原点,则(x,y)点对应到窗口中就是(x+X0,y+Y0)。
[解决办法]
程序中的座标与我们数学中的座标不同。前者的座标起点(0,0)位于客户区的左上角,因而没有象限概念
[解决办法]

探讨
这样画出来的直线没有一个动态的过程呀???

[解决办法]
给你个例子吧,实现动态画线的 在onmousemove函数中加入
if(nFlags==MK_LBUTTON && PMove1.x!=-1 && PMove1.y!=-1)
{
movepoint=TRUE;
HWND hwnd1;
CRect rect1;
GetDlgItem(PICTURE1,&hwnd1);
::GetWindowRect(hwnd1,&rect1);
ScreenToClient (&rect1); 
int left=rect1.left;
int right=rect1.right;
int top=rect1.top;
int bottom=rect1.bottom;
if(point.y>top && point.y<bottom && point.x>left && point.x<right)
{

CPoint ptemp=*(iter+1);
point.x=point.x-left;
point.y=point.y-top;

CDC dc1;
HDC hdc=::GetDC(hwnd1);
dc1.Attach(hdc);
dc1.SetROP2(R2_NOT);

dc1.MoveTo(PMove1.x,PMove1.y);
dc1.LineTo(Porign1.x,Porign1.y);
dc1.MoveTo(PMove1.x,PMove1.y);
dc1.LineTo(point.x,point.y);
 dc1.MoveTo(PMove2.x,PMove2.y);
 dc1.LineTo(Porign2.x,Porign2.y);
 dc1.MoveTo(PMove2.x,PMove2.y);
 dc1.LineTo(point.x,point.y);
Porign1.x=point.x;
Porign1.y=point.y;
Porign2.x=point.x;
Porign2.y=point.y;
plast.x=point.x;
plast.y=point.y;
}
}
CDialog::OnMouseMove(nFlags, point);
你可以参考一下
[解决办法]
这跟手动实现画线算法并不多嘛,由直线方程得到一个增量比如Xt,然后每次按x = x+Xt,y = y+k*Xt增加,(初始x = x0,y = y0),相邻两点连接(用moveto lineto),中间sleep一会即可.
[解决办法]
实质是,根据直线方程,按横向扫描线或者纵向扫描线依次算出交点即可。
当然,横向扫描线的Y范围是起点.y到终点.y,纵向扫描X范围起点. x到终点.x
扫描线起点终点的另一个分量自然就是画线的起点终点对应的另一个分量。
[解决办法]
起点是存在{x[a-1],y[b-1]},终点是{x[a],y[b]},

弄个计时器,例如每秒x轴移动i像素,然后算出x1的坐标,
再用上面2点之间的直线方程算出y坐标,在2个点之间画线就好了

热点排行