菜鸟问题:如何跟随鼠标拉出一虚线矩形框?回复就有分!
如何跟随鼠标拉出一虚线矩形框?就象PhotoShop或其它画图程序里虚线选择框一样. 问题点数:40、回复次数:12Top
1 楼zf925(天下哪来那么多高手)回复于 2001-12-20 10:34:22 得分 2
你仔细看一下,我这是画实线框的,
中心思想是:记住上次画的位置,本次清除它(用原色重画)
CClientDC *pDc = new CClientDC(this);
CPen pen;
CPen *oldpen;
pen.CreatePen(PS_SOLID,1,RGB(128,128,128));
oldpen = pDc->SelectObject(&pen);
if(SelectStart.x%24 != 0)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+3+4*SelectStart.x,StartY+4+4*24);
}
if(SelectStart.y != 0)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+4+24*8*4,StartY+3+4*SelectStart.y);
}
int xx = ((PreviousPoint.x-StartX-4)/4),yy = ((PreviousPoint.y-StartY-4)/4);
if((xx+1)%24 != 0)
{
pDc->MoveTo(StartX+7+4*xx,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);
}
if(yy != 23)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yy);
pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);
}
pDc->SelectObject(oldpen);
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
oldpen = pDc->SelectObject(&pen);
if(SelectStart.x%24 == 0)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+3+4*SelectStart.x,StartY+4+4*24);
}
if(SelectStart.y == 0)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+4+24*8*4,StartY+3+4*SelectStart.y);
}
if((xx+1)%24 == 0)
{
pDc->MoveTo(StartX+7+4*xx,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);
}
if(yy == 23)
{
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yy);
pDc->LineTo(StartX+7+4*xx,StartY+7+4*yy);
}
pDc->SelectObject(oldpen);
pen.DeleteObject();
if(((point1.x-StartX-4)/4>SelectStart.x)&&((point1.y-StartY-4)/4>SelectStart.y))
{
pen.CreatePen(PS_SOLID,1,RGB(0,255,0));
oldpen = pDc->SelectObject(&pen);
int xxx = ((point1.x-StartX-4)/4),yyy = ((point1.y-StartY-4)/4);
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+3+4*SelectStart.x,StartY+7+4*yyy);
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+7+4*xxx,StartY+3+4*SelectStart.y);
pDc->MoveTo(StartX+7+4*xxx,StartY+3+4*SelectStart.y);
pDc->LineTo(StartX+7+4*xxx,StartY+7+4*yyy);
pDc->MoveTo(StartX+3+4*SelectStart.x,StartY+7+4*yyy);
pDc->LineTo(StartX+7+4*xxx,StartY+7+4*yyy);
pDc->SelectObject(oldpen);
pen.DeleteObject();
}
}
}
}
Top
2 楼ygd(人生短暂,及时行乐。准备成熟中)回复于 2001-12-20 10:39:22 得分 1
DrawFocusRect();结束时一定要偶次调用Top
3 楼yhthy(雁回头)回复于 2001-12-20 10:56:51 得分 3
利用MFC可以很简单的实现上面的功能——源代码如下:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(PushNumb==0) //如果是第一次按下左鼠标键
{
PushNumb++; //做标记表示按下鼠标左键一次
mPointOrign=point; //直线的第一点等于点中点
mPointOld=point; //记录本次点中点
SetCapture(); //捕捉鼠标输入
}
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if(PushNumb==1)
{
if(point!=mPointOld) //如果鼠标移动了
{
ddd.SelectStockObject(NULL_BRUSH); //设置不填充状态
//擦除原来的矩形
ddd.Rectangle(mPointOrign.x,mPointOrign.y,
mPointOld.x,mPointOld.y);
//画新的矩形
ddd.Rectangle(mPointOrign.x,mPointOrign.y,point.x,point.y);
}
}Top
4 楼yhthy(雁回头)回复于 2001-12-20 10:59:07 得分 0
贴上去的时候没有注意排版,有不明白的请继续跟贴Top
5 楼zifzhu()回复于 2001-12-20 12:48:29 得分 30
用CRectTracker类,详细的查msdn。
创建并初始化了CRectTracker的实例后就可以在OnLButtonDown里加下面语句
void CMyDlg::OnLButtonDown(UINT nFlags,Cpoint point)
{
m_RectTracker.TrackRubberBand(this,point,TRUE);//CRectTracker的实例
CDialog::OnLButtonDown(nFlags,point);
}Top
6 楼rovoboy(魂之猎人)回复于 2001-12-20 12:53:36 得分 1
SetRop2()
用异或模式划线Top
7 楼jakieliu(边城浪子)回复于 2001-12-20 13:41:19 得分 0
To yhthy(雁回头):照你那样做,屏幕没有一点反应啊Top
8 楼starcbh(信仰)回复于 2001-12-20 13:59:22 得分 2
^%$*%(Y)*UI%^&*()_
mouse donw时记下point_one,mouse move 记下point_two
再move时 用从point_one 到 当前 point_two 以画笔反色画(就是SetRop2)矩形,再在
point_one 到 当前的point 画一个矩形.
Top
9 楼freewind_z(自由风)回复于 2001-12-20 14:15:09 得分 1
仔细查一下Top
10 楼jakieliu(边城浪子)回复于 2001-12-20 14:49:55 得分 0
To zifzhu():多谢你提供的CRectTracker类,它是最方便也是效果最好的.
不过要补充的是:执行m_RectTracker.TrackRubberBand(this,point,TRUE);后,系统将捕获不了WM_LBUTTONUP消息,也就是说在::OnLButtonUp{}里的程序将不再被执行.我本来想在OnLButtonUp里获得鼠标弹起的坐标也就不能实现.不过有m_RectTracker.m_rect保存的就是拉出的虚线矩形框,这就什么都有了.特在此说明,希望能给大家有所帮助.给你30分了,查收啊.Top
11 楼jakieliu(边城浪子)回复于 2001-12-20 14:52:49 得分 0
To zifzhu():能留下你的EMAIL吗?要不给我发,我的是:jakieliu76@163.com.
以后多多交流好吗?Top
12 楼zifzhu()回复于 2001-12-20 20:47:17 得分 0
zifzhu@sz.slr.com
很高兴认识你,以后多联系。Top
相关问题
- 菜鸟问题:如何跟随鼠标拉出一虚线矩形框?
- 如何在对话框区域里跟随鼠标移动画一矩形虚线框
- 请问如何在FormView中拖动鼠标时可以拖动出一个虚线边框的矩形框?
- 如何在视图中画一个跟随鼠标移动的,以鼠标为坐标原点的十字虚线,在线等候
- 要使用JavaScript+DHTML跟随鼠标画矩形框,就如同windows里用鼠标框选文件一样,请问有什么好的办法?
- 用鼠标按住dialog的caption然后拖动鼠标,系统会显示该dialog将会在新的位置的虚线框架,mouseup后dialog就移动到该虚线框架的位置,有没有办法不显示该虚线框架?因为我用了个多边形的dialog,虚线框架却还是原来的矩形。
- 如何在屏幕上画虚线矩形框?在线等候
- 怎么画用鼠标拉出来的虚线框
- 如何定义鼠标绘制矩形框
- 如何在web上随着鼠标的移动绘制矩形




