游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2522|回复: 3

大家来讨论一下,如何实现大于32×32尺寸的硬件光标?

[复制链接]

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2014-7-27 16:11:34 | 显示全部楼层 |阅读模式
本帖最后由 书径尘 于 2014-7-31 09:09 编辑

1406700085_125117.png
有些游戏的光标远可以显示40×40尺寸的硬件光标,不知道它们用了什么技术...
光标的体验,对游戏来说太重要....

光标最好是能够自绘,只有自绘才能任意控制图像效果,
但是硬件光标又要独立于渲染帧之外,也就是即便主线程卡死,光标依然能顺畅的显示.

我今天尝试了一下,用独立的win32层级窗口(WS_EX_LAYERED) + 独立线程渲染光标.思路就是实时的获取光标位置,然后更新窗口的位置.

但是效果差强人意,鼠标的移动,等价于窗口的移动,移动起来,还是有点慢,

不过如果能让其移动速度达到和"SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOVE|HTCAPTION, 0)"一样的效果,那么就可以接受了。
简单的SetWindowPos()跟不上光标的移动.

2

主题

14

帖子

151

积分

注册会员

Rank: 2

积分
151
发表于 2014-7-27 22:50:52 | 显示全部楼层
自定义cursor图标不可以吗?

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2014-7-27 23:11:05 | 显示全部楼层
ibundy 发表于 2014-7-27 22:50
自定义cursor图标不可以吗?

怎么个自定义法?
没试过

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2014-7-31 08:22:15 | 显示全部楼层
最终的方案:
  1. // 参考代码:http://support.microsoft.com/kb/318876/zh-cn
  2. HCURSOR CreateAlphaCursor(UINT* pBmp, int width, int height)
  3. {
  4.         HBITMAP hBitmap = NULL;

  5.         // 创建hBitmap
  6.         {
  7.                 HDC hDC = GetDC(NULL);
  8.                 hBitmap = CreateCompatibleBitmap(hDC, width, height);
  9.                 ReleaseDC(NULL, hDC);

  10.                 // 设置像素
  11.                 {
  12.                         BITMAPINFO bitmapInfo = { 0 };
  13.                         bitmapInfo.bmiHeader.biSize                        = sizeof(BITMAPINFOHEADER);
  14.                         bitmapInfo.bmiHeader.biWidth                = width;
  15.                         bitmapInfo.bmiHeader.biHeight                = height;
  16.                         bitmapInfo.bmiHeader.biPlanes                = 1;
  17.                         bitmapInfo.bmiHeader.biCompression        = BI_RGB;
  18.                         bitmapInfo.bmiHeader.biBitCount                = 32;

  19.                         ::SetDIBits(NULL, hBitmap, 0, height, pBmp, &bitmapInfo, DIB_RGB_COLORS);
  20.                 }
  21.         }

  22.         // Create an empty mask bitmap.
  23.         HBITMAP hMonoBitmap = CreateBitmap(width, height, 1, 1, NULL);

  24.         ICONINFO ii;
  25.         ii.fIcon = FALSE;  // Change fIcon to TRUE to create an alpha icon
  26.         ii.xHotspot = 0;
  27.         ii.yHotspot = 0;
  28.         ii.hbmMask = hMonoBitmap;
  29.         ii.hbmColor = hBitmap;

  30.         // Create the alpha cursor with the alpha DIB section.
  31.         HCURSOR hAlphaCursor = CreateIconIndirect(&ii);

  32.         DeleteObject(hBitmap);         
  33.         DeleteObject(hMonoBitmap);

  34.         return hAlphaCursor;
  35. }
复制代码
唯一遗憾的是,用这种方法创建出来的光标只是静态的,如果要做动画光标,恐怕得用个独立的线程,不停的SetCursor()。

如果有人知道更好的方法,希望能告知一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 01:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表