[100分] 鼠 标 移 到 Button 时,怎 么 通 知 父 窗 体 ?

KaKaKaKa 2010-04-06 01:27:25
Win32 SDK 程序(非MFC):

在VS2008左侧的工具箱中拖了个Button1到Dialog上,
现在,当鼠标移动到Button1上时要去处理一些事情。
好象要用到个MouseFirst消息吧?就是当鼠标移到Button时要通知给Dialog1。
想知道,在Dialog1.cpp的哪里写代码监视到鼠标移到Button1呢?

谢谢各位。
...全文
281 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
visualassist4680 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 yangjianpro_hotmail 的回复:]

引用 35 楼 visualassist4680 的回复:
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
HANDLE_MSG(ButtonhWnd,WM_MOUSEHOVER, btn_MouseHover);


我知道你是想处理Button的MOUSEHOVER消息,所以你将句柄改成Button的句柄嘛。
但是,我这里只有一个Dialog1.……
[/Quote]
sorry ,我的错误
如果不用button实现,那么应该使用 非模态对话框,在消息循环的代码里
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_MOUSEMOVE == msg.message && button == msg.hwnd)
{
do something ...
}
if (!IsDialogMessage(hWnd,&msg))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
KaKaKaKa 2010-04-08
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 visualassist4680 的回复:]
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
HANDLE_MSG(ButtonhWnd,WM_MOUSEHOVER, btn_MouseHover);
[/Quote]

我知道你是想处理Button的MOUSEHOVER消息,所以你将句柄改成Button的句柄嘛。
但是,我这里只有一个Dialog1.cpp啊,这个Main_Proc是Dialog1的过程函数啊,并非Button的。
所以你在Main_Proc里用HANDLE_MSG(ButtonhWnd,WM_MOUSEHOVER, btn_MouseHover);绝对是不行的。
我也试验了下,确实没作用。
.....

我想要的是:不要去重写CButton,因为我这个本身就不是MFC程序;
也不要去弄个Button1.cpp什么的来创建这个Button,给Button添加过程什么的了。

我这个Button就是从工具箱中拖进Dialog1上来的。

难道没有简洁点的处理方式了?
KaKaKaKa 2010-04-07
  • 打赏
  • 举报
回复
未解,up
KaKaKaKa 2010-04-07
  • 打赏
  • 举报
回复
大家看清楚:
我这个是窗体Dialog1的cpp文件代码,Main_Proc是Dialog1的窗口过程函数。

Button是从左侧工具箱中拖到这个Dialog1上来的。
KaKaKaKa 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 visualassist4680 的回复:]
呵呵,不行是因为你收不到 wm_mousehover 消息,不是方法不行,你改成 wm_mousemove就可以了
[/Quote]

我改成wm_mousemove,仍然不行。
请看Dialog1.cpp的全部代码:

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "Resource.h"
#include "MainDlg.h"

void Main_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags);

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
HANDLE_MSG(hWnd, WM_MOUSEMOVE, Main_OnMouseMove);
}
return FALSE;
}

void Main_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
RECT rect;
POINT pt;
pt.x=x;
pt.y=y;
GetWindowRect(GetDlgItem(hwnd,IDC_OK),&rect);
TCHAR str[256];
wsprintf(str,TEXT("%d %d"),x,y);
SetWindowText(hwnd,str);
if (PtInRect(&rect,pt)) //一样收不到。当鼠标进入Button1时处理。 调试发现:当鼠标到Button时,根本不走这个函数。
{
MessageBox(hwnd,TEXT(""),TEXT(""),MB_OK);
}

}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_OK:
{
MessageBox(hwnd,TEXT("点击了OKs!"),TEXT("提示"),MB_OK);
}
break;
default:
break;
}
}

void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}
vann1982 2010-04-07
  • 打赏
  • 举报
回复
WM_MOUSEMOVE
dd_zhouqian 2010-04-07
  • 打赏
  • 举报
回复
SendMessage(ParentHwnd)
Dingnifei123 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zgl7903 的回复:]
从CButton派生新类,处理相应的消息, 然后发送给父窗口 比较容易
GetParent()->SendMessage(XXXX
[/Quote]
顶,简单易用~
jogger007 2010-04-07
  • 打赏
  • 举报
回复
我一直也想用SDK介入控件的消息处理,学习中。。。
visualassist4680 2010-04-07
  • 打赏
  • 举报
回复
只有新的xp风格的界面才能收到wm_mousehover 消息,就是说要有 menifest 文件,并且文件内包含 comctrl6
visualassist4680 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yangjianpro_hotmail 的回复:]

引用 6 楼 xiaoqiang321 的回复:
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMA……
[/Quote]

呵呵,不行是因为你收不到 wm_mousehover 消息,不是方法不行,你改成 wm_mousemove就可以了
KaKaKaKa 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 arpnet99 的回复:]
派生CButton处理WM_MOUSEMOVE事件
之后发送消息...
[/Quote]
大哥 非MFC程序,不准调用MFC框架的啊~ 这是个C语言+SDK的project
这不是鸭头 2010-04-07
  • 打赏
  • 举报
回复
派生CButton处理WM_MOUSEMOVE事件
之后发送消息...
KaKaKaKa 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaoqiang321 的回复:]
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd, WM_MOUSEMOVE, OnMouseMove); //这里只是当鼠标移到Dialog1截面,不是移到Button上,所以这里根本没法知道是到了button上了。我这个Main_Proc是Dialog1.cpp里的,是Dialog1的窗口过程,不是Button的。
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}

return FALSE;
}
[/Quote]

11楼的方法HANDLE_MSG(ButtonhWnd,WM_MOUSEHOVER, btn_MouseHover);
也是不行的。

8楼的方法:
Rect rect;
Point pt= pMsg->pt;
GetWindowRect(m_btnwnd,&rect);
if (PtInRect(&rect,pt))
{
//mouse in btn rect..
}
这样我去做了,在Dialog1.cpp的窗口过程WinProc中获取WM_Mouse****消息,根本不是移到Button的。我调试了下,鼠标到Button时,根本不处理这里代码。
BinboWang1987 2010-04-07
  • 打赏
  • 举报
回复
给按钮控件创建一个类,因为按钮控件也是一个窗体,所以可以处理WM_MOUSEMOVE消息,这样就可以获得鼠标移动到按钮的消息了
青稞 2010-04-07
  • 打赏
  • 举报
回复
方法确实有很多,个人感觉采用WM_MOUSEHOVER比较好。。
hunter281896968 2010-04-07
  • 打赏
  • 举报
回复
方法很多啊
jyh_baoding 2010-04-07
  • 打赏
  • 举报
回复
WM_MOUSEHOVER,
zgl7903 2010-04-07
  • 打赏
  • 举报
回复
从CButton派生新类,处理相应的消息, 然后发送给父窗口 比较容易
GetParent()->SendMessage(XXXX
加载更多回复(17)

16,472

社区成员

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

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

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