一个IDC_MYICON资源,通过DrawIconEx()可以把此图标显示在屏幕上,想要实现此图标跟随鼠标移动,并且屏幕没有明显延迟,请问如何实现? 谢谢!hdc = GetDesktopWindow();
...
...
DrawIconEx(hwnd, ...);
....

解决方案 »

  1.   

    用SetCursor、LoadCursor和MAKEINTRESOURCE来设置鼠标形状,而不是通过Draw来画。
      

  2.   


    HCURSOR cursor = (HCURSOR)LoadImage(hinstance, MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0, LR_DEFAULTCOLOR);

    SetCursor(cursor);
      

  3.   

    看看本版的界面版主xianglitian的一篇blog文章吧,很详细哦拖拽效果实现
      

  4.   

    HWND hWnd = GetDesktopWindow();
    HDC hDC = GetWindowDC(hWnd);
    HICON hIcon = ::LoadIcon(AfxGetApp()-> m_hInstance, MAKEINTRESOURCE(IDI_ICON_CURSOR));
    ::DrawIconEx(hDC, rgnX, rgnY, hIcon, 16, 16, 0, NULL, DI_NORMAL);不是把鼠标光标变成自定义图标,而是通过鼠标控制该图标的移动。
      

  5.   

    有个 colorcursor工程
    在codeproject网站
      

  6.   

    如下调用:// 负责生成坐标
    func1()
    {
      which (true)
     {
        x = y = 0;
        Draw(x, y);    
        x++; y++;
        if (x>500 || y>500)
          break;
      }
    }// 负责画图
    Draw(int x, int y)
    {
        HWND hWnd = GetDesktopWindow();
        //创建屏幕DC
        HDC hDC = GetWindowDC(hWnd);
        //创建内存DC
        HDC hMemDC = CreateCompatibleDC(hDC);    CBitmap hBitmap;
        hBitmap.LoadBitmap(IDB_BMP_CURSOR);
        HBITMAP oldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);    ::TransparentBlt(hDC, x, y, 32, 32, hMemDC, 0, 0, 32, 32, RGB(0,0,0));    ::SelectObject(hMemDC, oldBitmap);
        ::DeleteObject(hBitmap);
        //删除内存DC
        ::DeleteDC(hMemDC);
        //释放屏幕DC
        ::ReleaseDC(hWnd, hDC);
    }现在问题是,图片能显示出来,也能移动,但是没有清除以前画出来的图片,导致屏幕上显示了多个同样的图片。即:如何Draw(1,1)时把Draw(0,0)的图片清除掉并且不导致屏幕闪动?谢谢!
      

  7.   

    我说下原理你就明白了:分层窗口,你用gdi+绘制png,png是什么形状,最终的效果就是什么形状。
    至于code,百度一下,例子非常多,而且代码行不到30行。