判断的鼠标是否停在Edit框上,以下是我的方法,可总是存在问题.咋回事呢!

java_lover_ 2008-06-15 04:49:19
程序是mfc基于对话框的.上面有一个编辑框ID为IDC_DISPLAY
添加了一个成员变量CRect m_rc;
在OnInitDialog()中
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_DISPLAY);
pEdit->GetClientRect(&m_rc);

为MyDlg类添加了WM_MOUSEMOVE消息处理如下


void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(point.x >= m_rc.left && point.x<= m_rc.right
&& point.y >= m_rc.top && point.y < m_rc.bottom)
AfxMessageBox("鼠标已经进入!");
CDialog::OnMouseMove(nFlags, point);
}


自以为上面的代码可以很轻易的办到,但是却出了一些我意想不到的问题,
就是当鼠标移入编辑框没丁点反应,当当鼠标移到编辑框的上边框和左边框时,他NND提示框出现啦.
特发此贴,以求响应?
...全文
123 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_lover_ 2008-06-17
  • 打赏
  • 举报
回复
分都不够发了,加一百再给!
菜牛 2008-06-16
  • 打赏
  • 举报
回复
鼠标消息在控件中处理,就不会再发给对话框了。
rehen 2008-06-15
  • 打赏
  • 举报
回复
以CEdit为基类派生一个新类CMyEdit,添加一个成员变量CRect m_rect;
一个成员函数void Init();
void CMyEdit::Init()
{
this->GetWindowRect(&m_rect);
ScreenToClient(&m_rect);
}
再添加一个鼠标响应函数
void CMyEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_rect.PtInRect(point))
{
//该干啥干啥
}
CEdit::OnMouseMove(nFlags, point);
}

再为对话框添加一个成员变量 CMyEdit m_edDisplay;
在对话框的OnInitDialog()里要调用一下m_edDisplay.Init();
tccqs 2008-06-15
  • 打赏
  • 举报
回复
up and mark,,
cnzdgs 2008-06-15
  • 打赏
  • 举报
回复
简单地做法:只要重载主窗口的PreTranslateMessage函数,在函数中判断发给Edit控件句柄的WM_MOUSEMOVE消息就可以了。
java_lover_ 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liyinlei 的回复:]
因为Edit控件本身默认处理鼠标消息。

要想在Edit内部也能处理WM_MOUSEMOVE消息有两种方法,一是从CEdit继承一个类,在该类中处理WM_MOUSEMOVE消息(鼠标在Edit中时)

而是 使用窗口子类化SubclassWindow, 替换Edit控件默认的消息处理函数
[/Quote]
上面试验成功
窗口子类化以前没听过,还得进一步学习啊!
liyinlei 2008-06-15
  • 打赏
  • 举报
回复
因为Edit控件本身默认处理鼠标消息。

要想在Edit内部也能处理WM_MOUSEMOVE消息有两种方法,一是从CEdit继承一个类,在该类中处理WM_MOUSEMOVE消息(鼠标在Edit中时)

而是 使用窗口子类化SubclassWindow, 替换Edit控件默认的消息处理函数
java_lover_ 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zaodt 的回复:]

1、从 CEdit 继承自己的类 CMyEdit;

2、完成 CMyEdit::OnMouseMove 函数;

3、在主对话框类中定义 CMyEdit 成员变量,如: CMyEdit m_myEdit;

4、打开对话框时创建你自己的 Edit 控件,如:myEdit.Create(...);

5、鼠标放上去看看。

=======

1、建立自己的 CMyEdit 类:

class CMyEdit : public CEdit
{
...
}

2、完成事件响应:将相对坐标显示出来


C/C++ codevoid CMyEdit::OnM…
[/Quote]
马上试验
java_lover_ 2008-06-15
  • 打赏
  • 举报
回复
一天之后才能加分哦。。。。。。。。
java_lover_ 2008-06-15
  • 打赏
  • 举报
回复
试过了,
新添加了一个CRect m_clientRect;
之后在OnInitDialog中加入

(CMyEdit *) pEdit =(CMyEdit *)GetDlgItem(IDC_DSIPLAY);
pEdit->GetWindowRect(&m_rc);
::GetWindowRect(m_hWnd,&m_clientRect);
修改WM_MOUSEMOVE消息处理如下

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
int pt_x = point.x;
int pt_y = point.y;
int Edit_left = m_rc.left- m_clientRect.left;
int Edit_top = m_rc.top - m_clientRect.top;
int Edit_right = m_rc.left- m_clientRect.left + m_rc.Width();
int Edit_bottom = m_rc.top- m_clientRect.top + m_rc.Height();
if( pt_x > Edit_left && pt_x < Edit_right
&& pt_y> Edit_top && pt_y < Edit_bottom )
{
AfxMessageBox("鼠标已经进入!");
}
CDialog::OnMouseMove(nFlags, point);
}



可却出现了这样的结果,
鼠标以如图方向移到如图红框部分出现消息框,在其他任何位置都没有消息框.加分分以求之....
zaodt 2008-06-15
  • 打赏
  • 举报
回复

1、从 CEdit 继承自己的类 CMyEdit;

2、完成 CMyEdit::OnMouseMove 函数;

3、在主对话框类中定义 CMyEdit 成员变量,如: CMyEdit m_myEdit;

4、打开对话框时创建你自己的 Edit 控件,如:myEdit.Create(...);

5、鼠标放上去看看。

=======

1、建立自己的 CMyEdit 类:

class CMyEdit : public CEdit
{
...
}

2、完成事件响应:将相对坐标显示出来

void CMyEdit::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
char szBuf[10];

sprintf( szBuf , "x:%d,y:%d" , point.x , point.y );

SetWindowText( szBuf );

CEdit::OnMouseMove(nFlags, point);
}


3、在主对话框类中定义成员变量:

CMyEdit m_myEdit;

4、在打开对话框时,创建控件:

m_myEdit.Create(WS_CHILD|WS_VISIBLE,CRect(250,300,400,400),this,1234);

5、鼠标放上去测试。
miao120550 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liyinlei 的回复:]
坐标的不一致。

GetClientRect(&m_rc); 客户区的坐标区域,对于edit来说,以Edit控件的左上角为原点(0,0)

而OnMouseMove中的 point的坐标以窗口(dialog)的左上角为原点
[/Quote]

2楼正解。。。。。
miao120550 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liyinlei 的回复:]
(GetWindowRect 基于显示设备的左上角为原点)通过dialog的GetWindowRect 和Edit的GetWindowRect, 可算出Edit基于对话框窗口的坐标。
这样与Point进行比较就不会有问题了。
[/Quote]
jzww2003 2008-06-15
  • 打赏
  • 举报
回复
同意二楼说的,两个区域的原点不同,各是各的原点(0,0),
liyinlei 2008-06-15
  • 打赏
  • 举报
回复
(GetWindowRect 基于显示设备的左上角为原点)通过dialog的GetWindowRect 和Edit的GetWindowRect, 可算出Edit基于对话框窗口的坐标。
这样与Point进行比较就不会有问题了。
liyinlei 2008-06-15
  • 打赏
  • 举报
回复
坐标的不一致。

GetClientRect(&m_rc); 客户区的坐标区域,对于edit来说,以Edit控件的左上角为原点(0,0)

而OnMouseMove中的 point的坐标以窗口(dialog)的左上角为原点

16,549

社区成员

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

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

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