我在CRich Edit 里设置了文本链接,WM_SETCUSOR是鼠标放到链接上的事件,但是我想捕获鼠标离开文本链接的事件,怎么办,谢谢

xixuanfong 2008-07-29 10:34:30
急,大侠帮忙指点
...全文
98 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanshao27 2008-08-04
  • 打赏
  • 举报
回复
参考一下
//此文件是纯 WIN32 SDK 编写,不需要MFC等支持。可在DOS模式下编译。

//FileName: MouseLevel.c
#include <windows.h>#include <commctrl.h> //必须导入此头文件
#ifndef APP_NAME#define APP_NAME TEXT("My MouseHover test")#endif
const int SUCCEED =0;
ATOM RegisterFormClass(HINSTANCE);BOOL InitInstance(HINSTANCE,int);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow){ MSG msg; RegisterFormClass(hInstance); if(!InitInstance(hInstance,iCmdShow)) return FALSE; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return SUCCEED;}
ATOM RegisterFormClass(HINSTANCE hInstance){ WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wcex.hCursor = LoadCursor(NULL,IDC_ARROW); wcex.hIcon = LoadIcon(hInstance,IDI_APPLICATION); wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION); wcex.hInstance = hInstance; wcex.lpfnWndProc = WndProc; wcex.lpszClassName = APP_NAME; wcex.lpszMenuName = NULL; wcex.style = CS_HREDRAW | CS_VREDRAW; return RegisterClassEx(&wcex);}
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow){ HWND hWnd; hWnd = CreateWindowEx(WS_EX_APPWINDOW, APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd,iCmdShow); UpdateWindow(hWnd); return TRUE;}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ switch(uMsg) { case WM_MOUSELEAVE: MessageBox(hWnd,TEXT("MouseLeave!"),TEXT("MouseLeave"),0); break; case WM_MOUSEHOVER: MessageBox(hWnd,TEXT("MouseHover"),TEXT("MouseHover"),0); break; case WM_NCMOUSELEAVE: MessageBox(hWnd,TEXT("MouseNClient!"),TEXT("MouseNClient!"),0); break; case WM_MOUSEMOVE: //因为 TRACKMOUSEEVENT 只发送一次消息,且随着其它消息产生而失效,所以在此消息中调用函数。
TRACKMOUSEEVENT trmouse; trmouse.cbSize = sizeof(TRACKMOUSEEVENT); trmouse.dwFlags = TME_LEAVE | TME_HOVER | TME_NONCLIENT; trmouse.dwHoverTime = 2000; trmouse.hwndTrack = hWnd; if(!_TrackMouseEvent(&trmouse)) return FALSE; break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); break; } return SUCCEED;}
cnzdgs 2008-08-03
  • 打赏
  • 举报
回复
直接用lParam参数就可以,LOWORD(lParam)是x坐标,HIWORD(lParam)是y坐标,都是相对于目标控件客户区的。
如果用GetCursorPos得到的是相对于整个屏幕的,还需要再ScreenToClient转换为RichEdit控件的客户区坐标才行。
xixuanfong 2008-08-03
  • 打赏
  • 举报
回复
人呢
xixuanfong 2008-08-01
  • 打赏
  • 举报
回复
CPoint ptCursor;
GetCursorPos(&ptCursor);

int iposChar = m_RichEditTest.CharFromPos(ptCursor);

是这样用么
xixuanfong 2008-08-01
  • 打赏
  • 举报
回复
可是我把鼠标放到链接字符串的位置上时,返回的也是最后一个字符的索引啊,怎么回事呢,谢谢
cnzdgs 2008-08-01
  • 打赏
  • 举报
回复
当指定点超出控件中的最后一个字符时,CharFromPos的返回值是最后一个字符的索引,需要自己处理一下。
xixuanfong 2008-08-01
  • 打赏
  • 举报
回复
ENLINK里我保存了chrg.cpMin和chrg.cpMax(在鼠标移动到我指定的链接上后)

但是我在PreTranslateMessage函数里得到的字符索引是一个固定的值啊,用CharFromPos得到字符索引能直接和cpMin、cpMax比较么
cnzdgs 2008-08-01
  • 打赏
  • 举报
回复
哪里有问题?
xixuanfong 2008-08-01
  • 打赏
  • 举报
回复
不行啊
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
我刚刚试了一下,无法直接获得鼠标从链接上移开的消息。你可以这样试试,在响应EN_LINK通知时把链接的字符索引范围记录下来;另外重载主窗口的PreTranslateMessage函数,在函数中判断发给RichEdit的WM_MOUSEMOVE消息,用CharFromPos获取鼠标指向的字符索引,判断如果超出了EN_LINK通知的索引范围,就表示鼠标从链接上移开了,清除索引范围记录,然后做自己的处理。
xixuanfong 2008-07-30
  • 打赏
  • 举报
回复
能给个例子么
xixuanfong 2008-07-30
  • 打赏
  • 举报
回复
WM_SETCURSOR 我用了啊,这个是鼠标放到链接上响应的事件啊

我想要知道什么时候鼠标离开链接
cnzdgs 2008-07-29
  • 打赏
  • 举报
回复
我搞错了,当成控件了。
你响应WM_SETCURSOR消息就可以了,当控件是RichEdit、nHitTest是HTTOP时设置指针,其它情况恢复指针。
xixuanfong 2008-07-29
  • 打赏
  • 举报
回复
WM_MOUSELEAVE我试过了不行的,其他两个我明天再看看

我是指捕获鼠标离开文本链接的事件,我是响应的EN_LINK消息,在这个消息里面怎么捕获呢
cnzdgs 2008-07-29
  • 打赏
  • 举报
回复
TrackMouseEvent,WM_MOUSEHOVER、WM_MOUSELEAVE。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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