我有一个分层窗口,具有屏幕大小,但几乎完全透明。 (除了用户点击的一个小十字架)
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) wnd_top_rect_proc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(hInst, IDC_CROSS);
wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName= L"POGO_WND_TOP";
RegisterClass(&wc);
hWnd = CreateWindowEx(
WS_EX_TOPMOST | WS_EX_LAYERED,
L"POGO_WND_TOP", //class name
NULL, //wnd name
WS_POPUP, //style
0, 0, //x, y
screen.right-screen.left,//w
screen.bottom-screen.top,//h
g_hWnd, //parent
NULL, //menu
hInst, //instance
NULL); //lparam
SetLayeredWindowAttributes(hWnd, WND_TOP_BG, 0, LWA_COLORKEY);
ShowWindow(hWnd, SW_SHOW);
如何为此窗口或整个桌面设置自定义光标?我在窗口类中指定了一个类游标,但它没有显示它(我希望这是因为透明度)
另外,我想知道在windows中实际上是如何实现透明的:如果鼠标位于窗口的透明区域,为什么我不能获得WM_LBUTTON
消息?难道没有办法让窗户的透明区域像彩色区域一样工作吗?
答案 0 :(得分:0)
要设置光标,请使用令人惊讶的明显命名的函数SetCursor
。
非常SetCursor(wc.hCursor)
应该这样做。
它是一个共享资源,因此您不应该更改自己窗口之外的区域的光标。或者,因为它放在链接中:
游标是共享资源。窗口应设置光标形状 仅当光标位于其客户区域或窗口时 捕获鼠标输入。在没有鼠标的系统中,窗口应该是 在光标离开客户区之前恢复上一个光标 或者在放弃对另一个窗口的控制之前。
此外:
如果您的应用程序必须在窗口中设置光标,请执行 确保指定窗口类的类游标设置为NULL。 如果类游标不为NULL,则系统将恢复类游标 每次移动鼠标。
我没有深入研究它,我希望窗口的完全透明区域实际上不会捕获鼠标点击,因为从那个窗口看不到任何东西[当然,理论上你可以点击隐形事情,但透明点之一是创建奇怪形状的窗口,如果你不得不让应用程序处理“它在我的窗口或我下面的人”的检测,你可以看到如何获得管理不善 - 因此,如果窗口没有对实际的“显示内容”做出贡献,则应将鼠标点击传递到下面的层,这将提供贡献(换句话说,不是100%透明)]。因此,根据评论,尝试将透明度值设置为“距离100%透明度仅一个档次”。