如何用鼠标画直线呢? 很菜的问题 我想在一副图像上用鼠标画一条直线,同时能够获得直线两端点的坐标我该怎么做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 点两次,在view类里用一个变量存储点击次数。int m_nClickCount;每点击一次,m_nClickCount++;当m_nClickCount是单数的时候,把鼠标坐标记入CPoint m_ptFirst中,如果是偶数,记入CPoint m_ptSecond。这样就可以获得两个点的坐标。 响应WM_LBUTTONDOWN跟WM_LBUTTONUP消息 如果是sdk的话 坐标在wParam中(如果没记错的话)如果是mfc的话 坐标在CPoint类型的参数中 第一次鼠标点击的时候调用MoveToEx函数把点移到那个位置第二次在LineTo到鼠标提出的位置 利用pMsg->pt可得到坐标点;CPoint pointOrign(pMsg->pt); 在BOOL CXXXView::PreTranslateMessage(MSG* pMsg) 中判断pMsg->message==WM_LBUTTONDOWN 然后利用pMsg->pt可得到坐标点; 谢谢上述回答我用mfc编程的,由于使用鼠标点击得到坐标,得到window2000中画图程序中画直线的一样,点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的直线,另外一个点是不固定的,所以我认为用 kingofvc(还是喜欢97)的方法应该合理,但还是没有明白,如何画线呢?谢谢大家! 请再指点!!! 是不是想实现橡皮筋的功能啊?可用下面的代码试试。void CPgsView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default int x1,y1,x2,y2,x3,y3; CPen *poldpen,newpen; if ((mPointOld!=point)&&(MouseDownFlag)) { CClientDC dc(this); dc.SetBkMode(TRANSPARENT); newpen.CreatePen(PS_SOLID,2,RGB(0,0,0)); poldpen=dc.SelectObject(&newpen); CPgsDoc* pDoc=GetDocument(); switch(pDoc->m_SendData.m_Operation) { //m_Operation是2就绘制直线 case 2: dc.SetROP2(R2_NOTXORPEN); dc.MoveTo(mPointOrign); dc.LineTo(mPointOld); dc.MoveTo(mPointOrign); dc.LineTo(point); break; default: break; }//switch dc.SelectObject(poldpen); newpen.DeleteObject () mPointOld=point; ReleaseDC(&dc); }//if CView::OnMouseMove(nFlags, point);} 如果没有拖动效果,就很简单了,记录两点的位置,moveto lineto旧可以了.如果要拖动,要设一个表示绘图的变量,好在拖动是判断,并且反色重画旧的线段,再画新线. 你的这个应用程序应该基于WM_MOUSEMOVE事件消息,用CClientDC dc(this)dc.MoveTo(m_iPointX,m_iPointY);dc.Lineto(point.x,point.y);m_iPointX=Point.x;m_iPointY=Point.y;这样就可以了做到点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的直线 我正好在写WINDOWS的那个画图程序void CXPaintView::DrawLine(CDC *pdc, char cMouse)//cMouse 判断左右键/决定前景背景颜色{CPen hPen; CRect rect;COLORREF color;int iWid;//笔宽CSize size;CPoint ptTemp;iWid=((CMainFrame*)AfxGetMainWnd())->m_wndToolBox.GetLineWidth();switch(cMouse){case 'L': color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetForeColor(); hPen.CreatePen(PS_SOLID,iWid,color); break;case 'R': color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetBackColor(); hPen.CreatePen(PS_SOLID,iWid,color); break;}size=GetDocument()->prSize; //画纸大小GetDocument()->hdcPreStore.SelectObject(&hPen);pdc->StretchBlt(0,0,size.cx*iMagSize,size.cy*iMagSize,&(GetDocument()->hdcPreStore),0,0,size.cx,size.cy,SRCCOPY);//用原来每画线时的内存背景擦掉刚才画的if(ptCur.x>0 && ptCur.y>0 && ptCur.x<PMAX && ptCur.y<PMAX) //判断鼠标是否越界,如果用了SetCapture可以不用检查{ GetDocument()->hdcPreStore.StretchBlt(0,0,size.cx,size.cy,&(GetDocument()->hdcShade),0,0,size.cx,size.cy,SRCCOPY); //把存储当前线段的内存DC清除一遍 //iMagSize 为当前放大倍数(如果用了放大镜功能的话) ptTemp.x=ptPre.x/iMagSize;ptTemp.y=ptPre.y/iMagSize; GetDocument()->hdcPreStore.MoveTo(ptTemp); ptTemp.x=ptCur.x/iMagSize;ptTemp.y=ptCur.y/iMagSize; GetDocument()->hdcPreStore.LineTo(ptTemp);}} 关于ARPG类型的游戏服务器人物漫游设计,征求大家意见! 如何在非模式对话框中加入快捷键响应(非MFC) 0x7835a8c1 (mfc80ud.dll) 处未处理的异常。请高手指点! CMemFile memfile临时文件支持多大的数据量 创建线程使用CREATE_SUSPENDED却立即执行? 主线程中的循环死机问题 怎么檫掉自己画的画? 请教如何获得输入的网址 如何使打开文件对话框的左侧出现常用目录的按钮,即我的文档、桌面等 to prog_st:可是我把我的代码写成和你一样,它也不显示,你说气人不气人? 请问有关CStringArray的问题! shell函数调用dos命令问题?
如果是sdk的话 坐标在wParam中(如果没记错的话)
如果是mfc的话 坐标在CPoint类型的参数中
调用MoveToEx函数把点移到那个位置
第二次在LineTo到鼠标提出的位置
CPoint pointOrign(pMsg->pt);
中判断pMsg->message==WM_LBUTTONDOWN
然后利用pMsg->pt可得到坐标点;
画直线的一样,点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的
直线,另外一个点是不固定的,所以我认为用 kingofvc(还是喜欢97)的方法
应该合理,但还是没有明白,如何画线呢?
谢谢大家! 请再指点!!!
可用下面的代码试试。
void CPgsView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int x1,y1,x2,y2,x3,y3;
CPen *poldpen,newpen; if ((mPointOld!=point)&&(MouseDownFlag))
{
CClientDC dc(this);
dc.SetBkMode(TRANSPARENT);
newpen.CreatePen(PS_SOLID,2,RGB(0,0,0));
poldpen=dc.SelectObject(&newpen);
CPgsDoc* pDoc=GetDocument();
switch(pDoc->m_SendData.m_Operation) {
//m_Operation是2就绘制直线
case 2:
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(mPointOrign);
dc.LineTo(mPointOld);
dc.MoveTo(mPointOrign);
dc.LineTo(point);
break;
default:
break;
}//switch dc.SelectObject(poldpen);
newpen.DeleteObject ()
mPointOld=point;
ReleaseDC(&dc);
}//if CView::OnMouseMove(nFlags, point);
}
如果要拖动,要设一个表示绘图的变量,好在拖动是判断,并且反色重画旧的线段,再画新线.
CClientDC dc(this)dc.MoveTo(m_iPointX,m_iPointY);
dc.Lineto(point.x,point.y);m_iPointX=Point.x;
m_iPointY=Point.y;
这样就可以了做到点一个点,然后拖动鼠标,在另外一处在点击,得到自己所需的直线
{CPen hPen;
CRect rect;
COLORREF color;
int iWid;//笔宽
CSize size;
CPoint ptTemp;iWid=((CMainFrame*)AfxGetMainWnd())->m_wndToolBox.GetLineWidth();
switch(cMouse)
{
case 'L':
color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetForeColor();
hPen.CreatePen(PS_SOLID,iWid,color);
break;
case 'R':
color=((CMainFrame*)AfxGetMainWnd())->m_wndColorBox.GetBackColor();
hPen.CreatePen(PS_SOLID,iWid,color);
break;
}size=GetDocument()->prSize; //画纸大小GetDocument()->hdcPreStore.SelectObject(&hPen);pdc->StretchBlt(0,0,size.cx*iMagSize,size.cy*iMagSize,&(GetDocument()->hdcPreStore),0,0,size.cx,size.cy,SRCCOPY);//用原来每画线时的内存背景擦掉刚才画的
if(ptCur.x>0 && ptCur.y>0 && ptCur.x<PMAX && ptCur.y<PMAX) //判断鼠标是否越界,如果用了SetCapture可以不用检查
{
GetDocument()->hdcPreStore.StretchBlt(0,0,size.cx,size.cy,&(GetDocument()->hdcShade),0,0,size.cx,size.cy,SRCCOPY); //把存储当前线段的内存DC清除一遍
//iMagSize 为当前放大倍数(如果用了放大镜功能的话)
ptTemp.x=ptPre.x/iMagSize;ptTemp.y=ptPre.y/iMagSize;
GetDocument()->hdcPreStore.MoveTo(ptTemp);
ptTemp.x=ptCur.x/iMagSize;ptTemp.y=ptCur.y/iMagSize;
GetDocument()->hdcPreStore.LineTo(ptTemp);
}}