在(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; } 当然这里也可以不创建线程来画另外一条直线,不过数学几何上要复杂一点,在此不多论述.

评论