MFC 鼠标移动获取坐标和画线 90
初学MFC,现做一个鼠标测试软件,希望实现鼠标移动实时获取坐标,在左下角显示X,Y坐标值,并实现按下左键拖动划红线,按下右键画蓝线,按下中键画绿线,主要代码如下:void...
初学MFC,现做一个鼠标测试软件,希望实现鼠标移动实时获取坐标,在左下角显示X,Y坐标值,并实现按下左键拖动划红线,按下右键画蓝线,按下中键画绿线,主要代码如下:
void CMSDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (LButDon||RButDon||MButDon)
{
CDC* pDC;
CPen newPen;
pDC=GetDC();
if(MButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(0,255,0));
if (RButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(0,0,255));
if (LButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(255,0,0));
pDC-> SelectObject(newPen);
pDC->MoveTo(p);
pDC->LineTo(point);
ReleaseDC(pDC);
}
p=point;
RefreshPromptInfo();
CDialog::OnMouseMove(nFlags, point);
}
void CMSDlg::RefreshPromptInfo()
{
CWnd *pWndPrompt = GetDlgItem ( IDC_STATIC_REPORT );
if ( !pWndPrompt || !::IsWindow ( pWndPrompt->m_hWnd ) )
return;
CRect recWindowtDialog,rectClientDialog,rectWindowStaticPrompt,rectClientStaticPrompt;
GetWindowRect(&recWindowtDialog);
GetClientRect(&rectClientDialog);
pWndPrompt->GetWindowRect(&rectWindowStaticPrompt);
pWndPrompt->GetClientRect(&rectClientStaticPrompt);
CRect recDisplay;
recDisplay.top = rectWindowStaticPrompt.top - recWindowtDialog.top + 8 - 24;
recDisplay.left = rectWindowStaticPrompt.left - recWindowtDialog.left;
recDisplay.bottom = recDisplay.top + rectWindowStaticPrompt.Height();
recDisplay.right = recDisplay.left + rectWindowStaticPrompt.Width();
InvalidateRect(&recDisplay);
UpdateWindow();
}
void CMSDlg::OnPaint()
{
CClientDC dc(this);
//显示X: Y: W:
COLORREF oldColor = dc.GetTextColor();
dc.SetBkMode(TRANSPARENT);
CFont font,fontChannel;
CFont* pOldFont=(CFont*)dc.SelectObject(&font);
CString strShowText;
fontChannel.CreatePointFont(300, _T("宋体"), &dc);
dc.SelectObject(&fontChannel);
strShowText.Format(_T("X:%4d Y:%4d W:%3d"),p.x,p.y,gl);
dc.SetTextColor(RGB(106,86,148)); //文本颜色
dc.TextOut(20,860,strShowText);
dc.SetTextColor(oldColor);
dc.SelectObject(pOldFont);
// CDialog::OnPaint();
}
以上代码鼠标移动能实现获取坐标,但是画不出线, 屏蔽掉RefreshPromptInfo()后画线功能可以了,但是显示X,Y坐标的数字重叠模糊成一片了。如果我不调用RefreshPromptInfo()函数,在OnMouseMove方法最前面加上局部刷新的代码:
RECT rect; //刷新区域
rect.left=20; //区域最左端
rect.top=860;//区域最顶端
rect.right=rect.left+400;//宽
rect.bottom=rect.top+40;//高
InvalidateRect(&rect);
UpdateWindow();
显示坐标的地方不重叠了 但是还是不能画线 小妹才疏学浅 求哪位高手指教 展开
void CMSDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (LButDon||RButDon||MButDon)
{
CDC* pDC;
CPen newPen;
pDC=GetDC();
if(MButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(0,255,0));
if (RButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(0,0,255));
if (LButDon)
newPen.CreatePen(PS_DASHDOTDOT,2,RGB(255,0,0));
pDC-> SelectObject(newPen);
pDC->MoveTo(p);
pDC->LineTo(point);
ReleaseDC(pDC);
}
p=point;
RefreshPromptInfo();
CDialog::OnMouseMove(nFlags, point);
}
void CMSDlg::RefreshPromptInfo()
{
CWnd *pWndPrompt = GetDlgItem ( IDC_STATIC_REPORT );
if ( !pWndPrompt || !::IsWindow ( pWndPrompt->m_hWnd ) )
return;
CRect recWindowtDialog,rectClientDialog,rectWindowStaticPrompt,rectClientStaticPrompt;
GetWindowRect(&recWindowtDialog);
GetClientRect(&rectClientDialog);
pWndPrompt->GetWindowRect(&rectWindowStaticPrompt);
pWndPrompt->GetClientRect(&rectClientStaticPrompt);
CRect recDisplay;
recDisplay.top = rectWindowStaticPrompt.top - recWindowtDialog.top + 8 - 24;
recDisplay.left = rectWindowStaticPrompt.left - recWindowtDialog.left;
recDisplay.bottom = recDisplay.top + rectWindowStaticPrompt.Height();
recDisplay.right = recDisplay.left + rectWindowStaticPrompt.Width();
InvalidateRect(&recDisplay);
UpdateWindow();
}
void CMSDlg::OnPaint()
{
CClientDC dc(this);
//显示X: Y: W:
COLORREF oldColor = dc.GetTextColor();
dc.SetBkMode(TRANSPARENT);
CFont font,fontChannel;
CFont* pOldFont=(CFont*)dc.SelectObject(&font);
CString strShowText;
fontChannel.CreatePointFont(300, _T("宋体"), &dc);
dc.SelectObject(&fontChannel);
strShowText.Format(_T("X:%4d Y:%4d W:%3d"),p.x,p.y,gl);
dc.SetTextColor(RGB(106,86,148)); //文本颜色
dc.TextOut(20,860,strShowText);
dc.SetTextColor(oldColor);
dc.SelectObject(pOldFont);
// CDialog::OnPaint();
}
以上代码鼠标移动能实现获取坐标,但是画不出线, 屏蔽掉RefreshPromptInfo()后画线功能可以了,但是显示X,Y坐标的数字重叠模糊成一片了。如果我不调用RefreshPromptInfo()函数,在OnMouseMove方法最前面加上局部刷新的代码:
RECT rect; //刷新区域
rect.left=20; //区域最左端
rect.top=860;//区域最顶端
rect.right=rect.left+400;//宽
rect.bottom=rect.top+40;//高
InvalidateRect(&rect);
UpdateWindow();
显示坐标的地方不重叠了 但是还是不能画线 小妹才疏学浅 求哪位高手指教 展开
8个回答
展开全部
1.在View类里设3个CPoint型变量,oldbegin,oldend用来表示移动过程中,刚才直线所在位置的起点,终点坐标,oldclick用来表示按下鼠标左键时,点击点的坐标.
2.在LButtonDown响应函数里,令oldclick=point,point是鼠标响应函数是参数.
3.在MouseMove响应函数里,把原直线擦去(擦去的方法要看你是怎么实现画直线的了,我也不知道你是怎么实现的,你自己分析吧),然后求出新的直线的两点坐标
(oldbegin.x+point.x-oldclick.x,oldbegin.y+point.y-oldclick.y),
(oldend.x+point.x-oldclick.x,oldend.y+point.y-oldclick.y),
希望对你有帮助
2.在LButtonDown响应函数里,令oldclick=point,point是鼠标响应函数是参数.
3.在MouseMove响应函数里,把原直线擦去(擦去的方法要看你是怎么实现画直线的了,我也不知道你是怎么实现的,你自己分析吧),然后求出新的直线的两点坐标
(oldbegin.x+point.x-oldclick.x,oldbegin.y+point.y-oldclick.y),
(oldend.x+point.x-oldclick.x,oldend.y+point.y-oldclick.y),
希望对你有帮助
展开全部
把绘图代码和控制代码分开,绘图完毕后不可调用InvalidateRect
绘图移到OnPaint事件处理函数中,避免因调用Invalide或update函数擦除图像
Onmousemove中只记录数据
绘图移到OnPaint事件处理函数中,避免因调用Invalide或update函数擦除图像
Onmousemove中只记录数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
rect.bottom=rect.top+40
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
您好,mfc现在用的不多了啊
看看就行啊
moveto,lineto联合使用即可
看看就行啊
moveto,lineto联合使用即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
任务
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询