绘制类似系统的光标,最顶层,任何地方

时间:2010-09-17 17:30:43

标签: c++ windows winapi drawing cursor

我需要绘制一个类似系统的光标,我只能控制它的位置。 换句话说,我需要绘制一个看起来就像系统光标的透明图像,我需要将它渲染到所有其他窗口之上。 我尝试了多种方法,但它们似乎都有一些缺点。

我已经想通过使用LoadImage()并传递资源OCR_NORMAL并将其转换为HBITMAP来加载光标图像。

HICON NormalCursor = (HICON)LoadImage(NULL, MAKEINTRESOURCE(OCR_NORMAL), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);

然后获得“桌面”HDC

hDC = GetDC(NULL);

然后我可以尝试使用DrawIconEx()

绘制它
DrawIconEx(hDC, (int)x, 0, NormalCursor, 0, 0, NULL, NULL, DI_DEFAULTSIZE | DI_NORMAL);

DI_NORMAL标志应该结合DI_IMAGE& DI_MASK标志给我一个透明的图像/图标/光标,但这是我在桌面上的结果:

Image

更不用说如果它移动就会创建路径。

使用SetLayeredWindowAttributes 制作透明窗口,如下所示:

SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 50, LWA_COLORKEY);

我的窗口背景颜色为黑色,我可以从窗口中删除背景。但由于基于颜色做alpha,我的光标图标周围会出现难看的黑色像素。

我可以使用彩色蒙版以其他方式使窗口的背景透明吗?

如何在所有窗口的顶部正确绘制透明光标?

2 个答案:

答案 0 :(得分:0)

我建议您制作自己的窗口,并执行http://www.codeproject.com/KB/GDI-plus/CsTranspTutorial3.aspx所述的操作。它在C#中,但大多数只是win32调用。它在可变透明度方面也做得很好,不仅仅是0%/ 100%。

答案 1 :(得分:0)

光标的轮廓是不是黑色?问题只是你使轮廓透明吗?为什么不直接将透明度颜色(和窗口的背景颜色)更改为其他而不是黑色或白色?