我用Mousemove消息来让鼠标拖动图片,现在可以实现了,当发现总是移动几次后就不能动了,手机像死机一样。本来以为是内存泄露了,但我的程序里没有对数据操作,请问是哪里的问题呢?

解决方案 »

  1.   

    没有代码,被人怎么可能知道你是在哪里犯错了呢?所以解决方法:
    1.自己Debug
    2.贴代码出来
      

  2.   

    重绘消息里我是这样写的: 
    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); 
    } 哪里不对呢? 谢谢大家帮忙
      

  3.   

    你把任务管理器打开,拖动时看占用的cpu和内存啊.
    我觉得没有必要在mousemove里刷新,
    可以用OnMouseHover,及ontime啊.
      

  4.   

    void MainWnd::OnTimer(UINT_PTR nIDEvent)
    {
       if(m_bMouseMove)
        {
            .......
        }  
    }
    然后设置 SetTimer(1,50,NULL);//设置0.05秒刷新一次