求助:vc编程如何实现'十字线随光标移动'

zontaclub9 2009-05-30 07:33:45
我是新手上路,烦请各位大师帮忙:用vc编程如何实现'十字线随光标移动'(十字线惯穿整个屏幕,可在任何窗口使用)

万分感谢!!!
...全文
622 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
红色代码 2009-06-26
  • 打赏
  • 举报
回复
View类中添加一成员变量CPoint m_PtMove;
构造函数中初始化m_PtMove=CPoint(-1,-1);
OnMouseMove中处理消息

CRect rect;
GetClientRect(&rect);

CClientDC dc(this);
//翻转颜色
dc.SetROP2(R2_NOT);
//擦除原来的线
dc.MoveTo(m_ptTemp.x,rect.top);
dc.LineTo(m_ptTemp.x,rect.bottom);
dc.MoveTo(rect.left,m_ptTemp.y);
dc.LineTo(rect.right,m_ptTemp.y);
//绘制现在的线
dc.MoveTo(point.x,rect.top);
dc.LineTo(point.x,rect.bottom);
dc.MoveTo(rect.left,point.y);
dc.LineTo(rect.right,point.y);
m_ptTemp=point;
CView::OnMouseMove(nFlags, point);

程序已发你邮箱.用vs2008编译的.6.0不能编译.自己建一个6.0工程添加文件进去就行了
devinside 2009-06-26
  • 打赏
  • 举报
回复
项目下两个工程,一个测试对话框,一个dll,测试对话框初始化实例的时候启动dll的全局钩子,只要对话框不关,一直有效,可以最小化,可以隐藏,自己处理吧,主要函数在
LRESULT CALLBACK MouseProc1(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
里面,目前的R2NOT绘图在窗口需要刷新的时候会花,可以去图形图像去问问怎么整
邮件已发送,mousehook.rar,vc6.0直接编译
zontaclub9 2009-06-25
  • 打赏
  • 举报
回复
请发一份給我,我的邮箱:zonqinghua@163.com

谢谢!
devinside 2009-06-24
  • 打赏
  • 举报
回复
上面的程序试了,可以用,不过只在应用程序客户区内有效,不知道是否满足lz(十字线惯穿整个屏幕,可在任何窗口使用)
的需求,如果lz是要做一个类外挂的程序,开启后最小化或隐藏此应用程序,而且要实现随鼠标移动贯穿屏幕的十字线,无论当前窗口,似乎要使用全局钩子在桌面DC上绘图了,我刚实现了这个方法,钩子没问题,使用R2_NOT绘制十字线,效果不是太好,有兴趣的话留个邮箱给你发一份,绘图方面可以再问问别人,不在行了
zontaclub9 2009-06-23
  • 打赏
  • 举报
回复
非常感谢Jcily,
这段时间试着用您提供编码没搞定,可能是我方法不对,您能否再抽些时间列出整个操作过程(我是新手,VC6.0才入门).
Hiiishe 2009-06-12
  • 打赏
  • 举报
回复
这里是上面的使用方法


void CXXXXView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bShowCross)
{
m_CrossDrawer.OnMouseMove(nFlags, point, this);
return;
}
}

void CXXXView::OnDraw(CDC* pDC)
{
m_CrossDrawer.Render(pDC);
}
Hiiishe 2009-06-12
  • 打赏
  • 举报
回复


#pragma once

class CCrossDrawer
{
public:
CCrossDrawer(void);
~CCrossDrawer(void);

void Restart();

void OnMouseMove(UINT nFlag, CPoint pt, CView* pView);
void Render(CDC* pDC);

void AddLine(CString strText);
void ClearTexts();

protected:
CPoint m_ptPre; // 鼠标点
CRect m_rectClient; // 客户区区域矩形

UINT m_nTextHeight; // 文字总高度
UINT m_nTextWidth; // 文字总宽度
CPoint m_ptTextPos; // 文字的输出位置

public:
COLORREF m_clrLine; // 十字线颜色
int m_nDstX; // 文字边框到鼠标的横向距离
int m_nDstY; // 文字边框到鼠标的纵向距离
int m_nExtText; // 文字到文字边框的距离
std::vector<CString> m_Texts; // 文字提示信息
};







#include "StdAfx.h"
#include ".\crossdrawer.h"

CCrossDrawer::CCrossDrawer(void)
:m_ptPre(-999,-999)
,m_ptTextPos(-999,-999)
{
m_clrLine = RGB(0,0,0);
m_nDstX = 8;
m_nDstY = 16;
m_nExtText = 3;
m_nTextHeight = m_nTextWidth = 0;
CString strInit = _T("文字提示信息......第01行");
m_Texts.push_back(strInit);
strInit.Format(_T("文字提示信息......第02行"));
m_Texts.push_back(strInit);
strInit.Format(_T("文字提示信息......第XXX行"));
m_Texts.push_back(strInit);
}

CCrossDrawer::~CCrossDrawer(void)
{
}

void CCrossDrawer::OnMouseMove( UINT nFlag, CPoint pt, CView* pView )
{
pView->GetClientRect(&m_rectClient);
CClientDC dc(pView);
pView->OnPrepareDC(&dc);
dc.DPtoLP(&m_rectClient);
m_rectClient.NormalizeRect();
m_ptPre = pt;
dc.DPtoLP(&m_ptPre);

// 计算文字的宽高
// 找到最长字符串的下标
int nMaxIndex = 0;
int nLines = m_Texts.size();

for (UINT i = 0; i < nLines; i++)
{
if (m_Texts[nMaxIndex].GetLength() < m_Texts[i].GetLength())
nMaxIndex = i;
}
// 选入字体
LOGFONT logfont = { -18,0,0,0,400,0,0,0,134,3,2,1,2, _T("宋体") };
//logfont.lfHeight = Sim2DHelper::FontSizeToLP(&dc, logfont.lfHeight);
CSize szHeight(0, logfont.lfHeight);
dc.DPtoLP(&szHeight);
logfont.lfHeight = szHeight.cy;
CFont font; font.CreateFontIndirect(&logfont);
CFont* pOldFont = dc.SelectObject(&font);
CSize szTextExtent;
if (!m_Texts.empty()) szTextExtent = dc.GetTextExtent(m_Texts[nMaxIndex]);
else szTextExtent = dc.GetTextExtent(_T(""));
m_nTextWidth = szTextExtent.cx;
m_nTextHeight = szTextExtent.cy*nLines;
// 计算文字输出位置
CSize sizeOffset(m_nDstX, m_nDstY);
dc.DPtoLP(&sizeOffset); sizeOffset.cy *= -1;
m_ptTextPos.x = m_ptPre.x + sizeOffset.cx;
m_ptTextPos.y = m_ptTextPos.y = m_ptPre.y + sizeOffset.cy;
if ( (LONG)(m_ptPre.x + sizeOffset.cx + m_nTextWidth) >= m_rectClient.right)
{
m_ptTextPos.x = m_ptPre.x - sizeOffset.cx - m_nTextWidth;
}

if ((LONG)(m_ptPre.x - sizeOffset.cx - m_nTextWidth) <= m_rectClient.left )
{
m_ptTextPos.x = m_ptPre.x + sizeOffset.cx;
}

if ((LONG)(m_ptPre.y + sizeOffset.cy - m_nTextHeight) <= m_rectClient.top)
{
m_ptTextPos.y = m_ptPre.y - sizeOffset.cy + m_nTextHeight;
}

if ((LONG)(m_ptPre.y - sizeOffset.cy + m_nTextHeight) >= m_rectClient.bottom)
{
m_ptTextPos.y = m_ptPre.y + sizeOffset.cy;
}


pView->Invalidate(FALSE);
}

void CCrossDrawer::Restart()
{
m_ptPre.SetPoint(-999,-999);
}

void CCrossDrawer::Render( CDC* pDC )
{
if (m_ptPre.x != -999)
{
CPen pen(PS_DOT, 0, m_clrLine);
CPen* pOldpen = pDC->SelectObject(&pen);
pDC->MoveTo(CPoint(m_ptPre.x, m_rectClient.top));
pDC->LineTo(CPoint(m_ptPre.x, m_rectClient.bottom));
pDC->MoveTo(CPoint(m_rectClient.left, m_ptPre.y));
pDC->LineTo(CPoint(m_rectClient.right, m_ptPre.y));
pDC->SelectObject(pOldpen);

if (!m_Texts.empty())
{
// 以下绘制文字提示框

//// 计算文字左上角
//CSize sizeOffset(m_nDstX, m_nDstY);
//pDC->DPtoLP(&sizeOffset); sizeOffset.cy *= -1;
//CPoint m_ptTextPos = m_ptPre + sizeOffset;

// 计算文本矩形框并绘制
// 找到最长字符串的下标
int nMaxIndex = 0;
int nLines = m_Texts.size();
for (UINT i = 0; i < nLines; i++)
{
if (m_Texts[nMaxIndex].GetLength() < m_Texts[i].GetLength())
nMaxIndex = i;
}
// 选入字体
LOGFONT logfont = { -13,0,0,0,400,0,0,0,134,3,2,1,2, _T("宋体") };
//logfont.lfHeight = Sim2DHelper::FontSizeToLP(pDC, logfont.lfHeight);
CSize szHeight(0, logfont.lfHeight);
pDC->DPtoLP(&szHeight);
logfont.lfHeight = szHeight.cy;
CFont font; font.CreateFontIndirect(&logfont);
CFont* pOldFont = pDC->SelectObject(&font);
// 计算矩形
CSize szTextExtent = pDC->GetTextExtent(m_Texts[nMaxIndex]);
CRect rtTexts(m_ptTextPos.x, m_ptTextPos.y, m_ptTextPos.x + szTextExtent.cx, m_ptTextPos.y - szTextExtent.cy*nLines);
rtTexts.NormalizeRect();
CSize szDstText(m_nExtText, m_nExtText); pDC->DPtoLP(&szDstText);
rtTexts.InflateRect(szDstText);
CBrush brh(RGB(238,245,201));
CBrush* pOldBrh = pDC->SelectObject(&brh);
pDC->Rectangle(rtTexts);
pDC->SelectObject(pOldBrh);

// 绘制文字信息
int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
for (UINT i = 0; i < nLines; i++)
{
pDC->TextOut(m_ptTextPos.x, m_ptTextPos.y - i*szTextExtent.cy, m_Texts[i]);
}
pDC->SetBkMode(nOldBkMode);
pDC->SelectObject(pOldFont);
}
}
}

void CCrossDrawer::AddLine( CString strText )
{
if (strText.GetLength() < 4)
return;
m_Texts.push_back(strText);
}

void CCrossDrawer::ClearTexts()
{
m_Texts.clear();
}

zontaclub9 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zontaclub9 的回复:]
非常感谢!我用的是VC6.0,能否有详细操作过程(我是新手,正试着用VC6.0,随光标移动的大十字线用于分析jpg格式图片资料及网页上图片)
[/Quote]

请各位大师帮帮手!!!

我急用上述'随光标移动的大十字线' (用VC6.0,最好有详细操作过程)

万分感谢!!!

zontaclub9 2009-06-09
  • 打赏
  • 举报
回复
非常感谢!我用的是VC6.0,能否有详细操作过程(我是新手,正试着用VC6.0,随光标移动的大十字线用于分析jpg格式图片资料及网页上图片)
tjudwt 2009-06-02
  • 打赏
  • 举报
回复
添加onMouseMove事件
然后在里面添加代码
[code=C/C++][/ShowCursor(FALSE);
Invalidate();
UpdateWindow();
CDC* pDC = GetDC();
pDC->MoveTo(point.x-m_Halflength,point.y);
pDC->LineTo(point.x+m_Halflength,point.y);
pDC->MoveTo(point.x,point.y-m_Halflength);
pDC->LineTo(point.x,point.y+m_Halflength);
ReleaseDC(pDC);]

其中m_Halflength为十字线的半长度,如果嫌闪烁的话就用内存DC
danxuezx 2009-06-02
  • 打赏
  • 举报
回复
捕获当前鼠标光标的位置,然后一次坐标画垂直相交线就好了吧
bofrobber 2009-06-01
  • 打赏
  • 举报
回复
你的问题是不是本身窗体不显示,但是要在屏幕上画出一个十字线来,并且让十字线随鼠标动?
个人感觉你是在做一个异形窗体。
Eleven 2009-05-31
  • 打赏
  • 举报
回复
你把鼠标设置成IDC_CROSS不是得了
DavidHsing 2009-05-31
  • 打赏
  • 举报
回复
隐藏鼠标、处理 WM_MOUSEMOVE、画线,没啥难的
kelong1988 2009-05-30
  • 打赏
  • 举报
回复
up~

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧