在(1)中我们已经讨论LINEDDA的使用了.但慢速画线只是一个简单的应用,下面让我们看一下它的有趣一面.
在有些程序中,经常需要用户单击来确定一片区域,然后获得其基本信息,实现了简单的查询功能.那么在单击时我们是不是可以产生一些效果呢?
来看下面这个基于SDI的程序:(除了下面所叙述的,没做任何其他操作)
它的效果是在以点击处为中心, 由2条直线组成,4个端点同时开始绘制,沿直线向中心靠拢,
绘制一个标准的”叉”,然后慢慢消失,实现了漂亮的点击效果.
(首先是缓缓绘制出来,然后缓缓消失)
int x,y;
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;
}
当然这里也可以不创建线程来画另外一条直线,不过数学几何上要复杂一点,在此不多论述.
评论