我在CRich Edit 里设置了文本链接,WM_SETCUSOR是鼠标放到链接上的事件,但是我想捕获鼠标离开文本链接的事件,怎么办,谢谢 急,大侠帮忙指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TrackMouseEvent,WM_MOUSEHOVER、WM_MOUSELEAVE。 WM_MOUSELEAVE我试过了不行的,其他两个我明天再看看我是指捕获鼠标离开文本链接的事件,我是响应的EN_LINK消息,在这个消息里面怎么捕获呢 我搞错了,当成控件了。你响应WM_SETCURSOR消息就可以了,当控件是RichEdit、nHitTest是HTTOP时设置指针,其它情况恢复指针。 WM_SETCURSOR 我用了啊,这个是鼠标放到链接上响应的事件啊我想要知道什么时候鼠标离开链接 我刚刚试了一下,无法直接获得鼠标从链接上移开的消息。你可以这样试试,在响应EN_LINK通知时把链接的字符索引范围记录下来;另外重载主窗口的PreTranslateMessage函数,在函数中判断发给RichEdit的WM_MOUSEMOVE消息,用CharFromPos获取鼠标指向的字符索引,判断如果超出了EN_LINK通知的索引范围,就表示鼠标从链接上移开了,清除索引范围记录,然后做自己的处理。 ENLINK里我保存了chrg.cpMin和chrg.cpMax(在鼠标移动到我指定的链接上后)但是我在PreTranslateMessage函数里得到的字符索引是一个固定的值啊,用CharFromPos得到字符索引能直接和cpMin、cpMax比较么 当指定点超出控件中的最后一个字符时,CharFromPos的返回值是最后一个字符的索引,需要自己处理一下。 CPoint ptCursor;GetCursorPos(&ptCursor);int iposChar = m_RichEditTest.CharFromPos(ptCursor);是这样用么 直接用lParam参数就可以,LOWORD(lParam)是x坐标,HIWORD(lParam)是y坐标,都是相对于目标控件客户区的。如果用GetCursorPos得到的是相对于整个屏幕的,还需要再ScreenToClient转换为RichEdit控件的客户区坐标才行。 参考一下//此文件是纯 WIN32 SDK 编写,不需要MFC等支持。可在DOS模式下编译。//FileName: MouseLevel.c#include <windows.h>#include <commctrl.h> //必须导入此头文件#ifndef APP_NAME#define APP_NAME TEXT("My MouseHover test")#endifconst 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;} Dock 控件的原理是什么? 一个非模式对话框的问题 无模式对话框的问题. 跪求各位大虾帮忙啊,regdeletekey的用法,我的代码就两行,可删除不了。 求:谁能给我写一个连接MYSQL的单文档的程序? 状态栏的简单问题! (救命)断电后.dsw打不开了怎么办? 《windows高级编程》中例子的编译设置? dummy是什么意思 我怎么知道程序收到WM_CHAR消息时候一个字符的大小写呢! 又没有精度达到1毫秒的定时器啊。 想要一个获取网页源文件字符串的函数
你响应WM_SETCURSOR消息就可以了,当控件是RichEdit、nHitTest是HTTOP时设置指针,其它情况恢复指针。
GetCursorPos(&ptCursor);int iposChar = m_RichEditTest.CharFromPos(ptCursor);是这样用么
如果用GetCursorPos得到的是相对于整个屏幕的,还需要再ScreenToClient转换为RichEdit控件的客户区坐标才行。
//此文件是纯 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;}