正文

LINEDDA(2)2006-12-16 13:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/21628.html

分享到:


(1)中我们已经讨论LINEDDA的使用了.但慢速画线只是一个简单的应用,下面让我们看一下它的有趣一面.

 

在有些程序中,经常需要用户单击来确定一片区域,然后获得其基本信息,实现了简单的查询功能.那么在单击时我们是不是可以产生一些效果呢?

 

来看下面这个基于SDI的程序:(除了下面所叙述的,没做任何其他操作)

 

它的效果是在以点击处为中心, 2条直线组成,4个端点同时开始绘制,沿直线向中心靠拢,

绘制一个标准的”,然后慢慢消失,实现了漂亮的点击效果.

 

 

(首先是缓缓绘制出来,然后缓缓消失)

 

 

 

 //全局变量设置

int x,y;

int a1,b1;

int a2,b2;

int a3,b3;

const int z=10;     

 

                                                                        

// 左键按下

void CLineDDAView::OnLButtonDown(UINT nFlags, CPoint p)

{

       // TODO: Add your message handler code here and/or call default

       CClientDC dc(this);

 

       //设置反色绘制模式

       dc.SetROP2(R2_NOT);

      

      // 初始化

       Ini(p.x,p.y);

      

       //创建一个线程,绘制1条直线

       HANDLE h=CreateThread(NULL,0,RecvProc,(LPVOID)&dc,0,NULL);

       CloseHandle(h);

 

       //调用函数,绘制另一条直线,终点是单击处,即中心.

       ::LineDDA(p.x-z,p.y+z,p.x,p.y,hehe,(LPARAM)&dc);

 

       //以下是慢慢消失的过程,和绘制模式有关系

       Ini(p.x,p.y);

        h=CreateThread(NULL,0,RecvProc,(LPVOID)&dc,0,NULL);

       ::LineDDA(p.x-z,p.y+z,p.x,p.y,hehe,(LPARAM)&dc);

 

       CView::OnLButtonDown(nFlags, p);

}

 

 

void CALLBACK CLineDDAView::hehe(int a,int b,LPARAM l)

{

       // 以单击处为对称中心,一条直线从首尾端点同时绘制

 

       CDC *pDC=(CDC*)l;

       pDC->MoveTo(a1,b1);

       pDC->LineTo(a,b);

 

       pDC->MoveTo(2*x-a1,2*y-b1);//一点几何对称知识

       pDC->LineTo(2*x-a,2*y-b);

       a1=a;

       b1=b;

       ::Sleep(30);//该时间不能比下面的短,否则报错

}

DWORD CALLBACK CLineDDAView::RecvProc(LPVOID l)

{

       CDC *dc=(CDC*)l;

       ::LineDDA(a2,b2,x,y,haha,(LPARAM)l);

       return 0;

}

void CALLBACK CLineDDAView::haha(int a,int b,LPARAM l)

{

       // 以单击处为对称中心,一条直线从首尾端点同时绘制

 

CDC *pDC=(CDC*)l;

       pDC->MoveTo(a2,b2);

       pDC->LineTo(a,b);

       pDC->MoveTo(2*x-a2,2*y-b2);

       pDC->LineTo(2*x-a,2*y-b);

       a2=a;

       b2=b;

       ::Sleep(30);

}

 

void CLineDDAView::Ini(int p,int q)

{    

       x=p;

       y=q;

       a1=x-z;

       b1=y+z;

       a2=x-z;

       b2=y-z;

 

}

 

 

 

当然这里也可以不创建线程来画另外一条直线,不过数学几何上要复杂一点,在此不多论述.

阅读(3342) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册