橡皮条制作

来源:互联网 发布:软件售后服务系统流程 编辑:程序博客网 时间:2024/04/28 15:51
 
橡皮条制作

橡皮条并没有提供直接拖就可以有的功能,就像是Bar一样,要用代码来生成。

其实我并没有完全掌握橡皮条的制作。这里只把我所知道的所有写下来。

你只要为你的对话框程序的WM_LBUTTONDOWN消息响应函数中加入以下代码:

static CPoint secondPoint; //记录矩形的右上角
static CPoint OldPoint;//记录矩形的左上角
if (!m_fristHit)// 它是个BOOL类型,可以看到是全局变量,自己去声明,初始化为FALSE。用于控制是不是第一次画。
{
OldPoint = point;
CRectTracker RectTracker(CRect(0,0,0,0),CRectTracker::resizeOutside|CRectTracker::solidLine);//要指明样式要不然画出来的线看不见。
RectTracker.TrackRubberBand(this,point,1);
CPoint CurPoint;
::GetCursorPos(&CurPoint);
::ScreenToClient(m_hWnd,&CurPoint);
secondPoint=CurPoint;
RectTracker.m_rect = CRect(OldPoint.x,OldPoint.y,CurPoint.x,CurPoint.y);
CClientDC dc(this);
RectTracker.Draw(&dc);//画矩形
m_fristHit=TRUE;

}
else
{
CPoint CurPoint;
::GetCursorPos(&CurPoint);
::ScreenToClient(m_hWnd,&CurPoint);
CRect rect(secondPoint.x-50,secondPoint.y-50,secondPoint.x+50,secondPoint.y+50);
CRect leftrect(OldPoint.x-50,OldPoint.y-50,OldPoint.x+50,OldPoint.y+50);
if (rect.PtInRect(CurPoint))//如果你点击了右下角,
{
CRectTracker RectTracker(CRect(OldPoint.x,OldPoint.y,secondPoint.x,secondPoint.y),CRectTracker::resizeOutside|CRectTracker::solidLine);
RectTracker.TrackRubberBand(this,OldPoint);
CPoint CuPoint;
::GetCursorPos(&CuPoint);
::ScreenToClient(m_hWnd,&CuPoint);
secondPoint=CuPoint;
RectTracker.m_rect = CRect(OldPoint.x,OldPoint.y,CuPoint.x,CuPoint.y);
CClientDC dc(this);
Invalidate();//消除第一次画的矩形
MessageBox("");
RectTracker.Draw(&dc);


}
else if (leftrect.PtInRect(CurPoint))//如果你点击了左下角
{
CRectTracker RectTracker(CRect(OldPoint.x,OldPoint.y,secondPoint.x,secondPoint.y),CRectTracker::resizeOutside|CRectTracker::solidLine);
RectTracker.TrackRubberBand(this,secondPoint);
CPoint CuPoint;
::GetCursorPos(&CuPoint);
::ScreenToClient(m_hWnd,&CuPoint);
OldPoint=CuPoint;
RectTracker.m_rect = CRect(OldPoint.x,OldPoint.y,secondPoint.x,secondPoint.y);
CClientDC dc(this);
Invalidate();//消除第一次画的矩形
MessageBox("");
RectTracker.Draw(&dc);
}

}

这里一共要控制六个点来改变矩形的大小的。这里只做了两个点。 就是左右角。其他角类似做。

这里有个问题自己现在没有解决。就是我要改变矩形大小时。上次画的矩形就要消除掉,如图一样,如果不消除就会出现多个矩形。这不是我们想要的。我用了Invalidate()函数来重绘窗口消除掉上次画的。但是不知道什么情况,可能是消息延迟,当我画完了这次的矩形,他才响应了消除背景的动作,这导致了这次画的一样被消除了。客户区空白了。

我用updatewindow()或者sendmessage来发送WM_PAINT消息却连我第一次画的矩形都消除不掉。调试时发现程序却是执行了OnPaint函数。但是却连画的矩形都消除不掉。不知道为什么。

下次补上吧。