我自己画了一个滚动条,用MouseMove让图片移动,现在可以移动了,但不知道怎样可以根据鼠标移动速度的快慢来控制?谢谢大家帮忙

解决方案 »

  1.   

    用postmessage不停的发消息,带上鼠标点的位置!
    响应消息的时候,取得最新的消息与点,然后刷新!这样就可以了!
      

  2.   

    你说的计时器 是SetTiemr吧?当一直MouseMove,不抬起鼠标时怎样得到其中的距离和时间?
      

  3.   

    我想这样应该不对吧,鼠标没有抬起之前Move的速度就会有变化的,所以不应该等到鼠标抬起时在计算速度吧?
      

  4.   

    把Timer的时间刻度设置小一点。每一毫秒循环一次。
      

  5.   

    直接在mousemove事件里面根据当前鼠标坐标处理就好了
      

  6.   

    现在我的滚动块可以跟着Mousemove中的坐标点移动了,但是发现时只移动几次就不动了,我的程序里没有数据处理,所以不项内存泄露, 重绘消息里我是这样写的:
    void MainWnd::OnPaint(HWND hWnd)
    {
    DEBUGMSG(TRUE, (TEXT("MainWnd::OnPaint\n")));
    PAINTSTRUCT ps = {0};
    HDC hdc = BeginPaint(hWnd, &ps);

    // 在此添加任意绘图代码 RECT m_rc = {0};
    GetClientRect(hWnd, &m_rc);
    //创建双缓冲
    HDC g = CreateCompatibleDC(hdc);
    HBITMAP buffer=CreateCompatibleBitmap(hdc,m_rc.right-m_rc.left,m_rc.bottom-m_rc.top);
    HBITMAP m_hOldbmp = (HBITMAP)SelectObject(g, buffer);
    HDC imgdc=CreateCompatibleDC(hdc);  //临时dc
    HBITMAP m_hOldbmp1 = (HBITMAP)SelectObject(imgdc, m_hScrollBar);
    BitBlt(g, 225, 50 , 11, 195 , imgdc, 0, 0, SRCCOPY);
    SelectObject(imgdc, m_hScrollUp);
    BitBlt(g, 225, 50 , 11, 11 , imgdc, 0, 0, SRCCOPY);
    SelectObject(imgdc, m_hScrollDown);
    BitBlt(g, 225, (243 - 11) , 11, 11 , imgdc, 0, 0, SRCCOPY); //滚动块Y坐标在随时变化
    for(int i=0; i<10; ++i)
    {
    SelectObject(imgdc, m_hScrollBox);
    BitBlt(g, 225, (m_nScrolltop + i), 11,  10 , imgdc, 0, 0, SRCCOPY);
    }
    SelectObject(imgdc, m_hOldbmp1);
    DeleteDC(imgdc);
    imgdc = NULL;
    //最后显示到hdc
    BitBlt(hdc, m_rc.left, m_rc.top, m_rc.right-m_rc.left,m_rc.bottom-m_rc.top, g, 0, 0, SRCCOPY);
    SelectObject(g, m_hOldbmp);
    DeleteDC(g);
    g = NULL;
    EndPaint(hWnd, &ps);
    }//左键按下消息
    void MainWnd::OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) 
    {
    DWORD  point;
    POINT cpDown={0}; 
    point=GetMessagePos();  
    cpDown.x=LOWORD(point);
    cpDown.y=HIWORD(point); m_nDownX = cpDown.x;   //记录按下位置
    m_nDownY = cpDown.y;
    }
    //WM_Mousemove消息
    void  MainWnd::OnMousemove(HWND hwnd, int x, int y, UINT keyFlags)
    {
    //移动滚动块
    //判断点击滚动条范围
    if(m_nDownX > 225 &&  m_nDownY > (50 + 11) && m_nDownY < (243 - 11))
    {
    m_nScrolltop = y;
    }
    InvalidateRect(hwnd, NULL, TRUE);
    ::UpdateWindow(hwnd);
    }哪里不对呢? 谢谢大家帮忙
      

  7.   

    不要调用UpdateWindow,否则,如果系统繁忙可能让系统停止响应,另外,m_nScrolltop 似乎处理不全面
      

  8.   

    不好意思 现在才看到你帮我回信息。 你上次说“不要调用UpdateWindow,否则,如果系统繁忙可能让系统停止响应”。如果我不写UpdateWindow, 发现也总是响应多次MouseMove后 就自动停止了 这是为什么呢?