我欲替换系统鼠标(不是此程序的鼠标)为一图标 和一个很大的十字架,我做了如下工作:
1.隐藏系统鼠标
2.Hook到Mouse位置
3.画一个图标
4.画线(十字架)
问题出现了:
当移动鼠标的时候,前面的画线和图标擦除不掉,欲擦除屏幕,多次尝试不得结果,请高手指点迷津。
可能有用的东东: WM_PAINT,Invalidate...好像无法工作

解决方案 »

  1.   

    何必那么麻烦呢?
    把鼠标画好,做成资源文件,调用出来不就可以了。或者直接动态的调用鼠标:
    var
      MyCursor : HCURSOR;...
        //加载动画光标
        MyCursor := LoadCursorFromFile ( 'MMouse.ani );
        SetClassLong ( Form1.Handle, GCL_HCURSOR, MyCursor );
      

  2.   

    不好意思,看错了!
    不过直接画不好控制.给你两种方法:  
    1) 采用XOR画(我以前在DOS下画鼠标就是这么画的): 
      记下当前鼠标位置 -> 设置绘制方式为XOR方式 -> 画出鼠标
      鼠标移动后 -> 先在旧的地方画一个鼠标(这样自己就擦除了,XOR操作就是) -> 再再新位置画出,并记下当前的鼠标位置.
      为什么要用XOR方式就可以擦除呢?假设原来有一个点的像素值:10011001 要画到这个点的像素值:00011010
              XOR后 : 10000011
    再和原来的点XOR : 00011010
           变回来了 : 10011001 2) 如果不用这种方式,就在画之前,保存鼠标所在区域的图像,然后画上鼠标. 在下一次画之前,恢复原来地方的图像,再重新画.
      

  3.   

    先谢谢楼上的XD
    这样是可以实现的,但是经常由于某些原因,造成屏幕有残留的痕迹,还是需要重绘屏幕。
    再有,光标文件好像像素位数受限,画一个jpg图片比较好吧。
    那么 如何解决屏幕画一个jpg图片并跟随鼠标移动,并且部产生重叠? 谢谢。
      

  4.   

    得到鼠标上一次的横纵坐标,CRect r1(x-1,0,x+1,bottom);CRect r2(0,y-1,right,y+1);
    每次画之前InvalidateRect(&r1);InvalidateRect(&r2);
    一般都是移出窗口时会留下一个十字架,在移出时可以刷新窗口。