急,大侠帮忙指点

解决方案 »

  1.   

    TrackMouseEvent,WM_MOUSEHOVER、WM_MOUSELEAVE。
      

  2.   

    WM_MOUSELEAVE我试过了不行的,其他两个我明天再看看我是指捕获鼠标离开文本链接的事件,我是响应的EN_LINK消息,在这个消息里面怎么捕获呢
      

  3.   

    我搞错了,当成控件了。
    你响应WM_SETCURSOR消息就可以了,当控件是RichEdit、nHitTest是HTTOP时设置指针,其它情况恢复指针。
      

  4.   

    WM_SETCURSOR 我用了啊,这个是鼠标放到链接上响应的事件啊我想要知道什么时候鼠标离开链接
      

  5.   

    我刚刚试了一下,无法直接获得鼠标从链接上移开的消息。你可以这样试试,在响应EN_LINK通知时把链接的字符索引范围记录下来;另外重载主窗口的PreTranslateMessage函数,在函数中判断发给RichEdit的WM_MOUSEMOVE消息,用CharFromPos获取鼠标指向的字符索引,判断如果超出了EN_LINK通知的索引范围,就表示鼠标从链接上移开了,清除索引范围记录,然后做自己的处理。
      

  6.   

    ENLINK里我保存了chrg.cpMin和chrg.cpMax(在鼠标移动到我指定的链接上后)但是我在PreTranslateMessage函数里得到的字符索引是一个固定的值啊,用CharFromPos得到字符索引能直接和cpMin、cpMax比较么
      

  7.   

    当指定点超出控件中的最后一个字符时,CharFromPos的返回值是最后一个字符的索引,需要自己处理一下。
      

  8.   

    CPoint ptCursor;
    GetCursorPos(&ptCursor);int iposChar = m_RichEditTest.CharFromPos(ptCursor);是这样用么
      

  9.   

    直接用lParam参数就可以,LOWORD(lParam)是x坐标,HIWORD(lParam)是y坐标,都是相对于目标控件客户区的。
    如果用GetCursorPos得到的是相对于整个屏幕的,还需要再ScreenToClient转换为RichEdit控件的客户区坐标才行。
      

  10.   

    参考一下
    //此文件是纯 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;}