gpt4 book ai didi

c++ - 设置游标不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:48 24 4
gpt4 key购买 nike

我正在使用 SDL2 开发 Windows 应用程序。我想更改光标显示。我使用示例创建了光标,完全复制自 SDL_CreateCursor然后在 SDL_MOUSEMOTION 事件中调用 SDL_SetCursor,但似乎运气不好。

所以我直接跳进:

SDL_Cursor * cursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); 
SDL_SetCursor(cursor);

官方 wiki 将 SDL_CreateSystemCursor 报告为 TODO 状态。我查看了源代码,它似乎已经实现并且可以创建一个有效的游标。但是,光标显示也没有改变。

我该怎么办?

最佳答案

在您提出问题九年后,我在这里寻找对此的答复,因为我遇到了同样的问题。我的问题,我也确信你的问题如下:我通过 SDL_CreateWindowFrom 从现有的 HWND 窗口创建了一个 SDL_Window。现有的 HWND 窗口首先使用 RegisterClassEx 注册,并配置为将十字线作为鼠标指针。

后来,创建了现有 HWND 的 SDL_Window,当我将鼠标指针移到窗口中时,它瞬间变为箭头,然后立即变为十字准线。对于这种情况不会发生,在创建 SDL_Window 之后我添加了:

SDL_Cursor* cursor;
cursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR);
SDL_SetCursor(cursor);

完整代码如下:

#include <SDL.h>
#include <SDL_syswm.h>
#include <iostream>

#define WINDOW_CLASS_NAME L"WindowClassName"
#define APP_ICON L"AppIcon.ico"

UINT const WMAPP_NOTIFYCALLBACK = WM_APP + 1;
HINSTANCE g_hInst = NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WMAPP_NOTIFYCALLBACK:
switch (lParam)
{
case WM_RBUTTONUP:
// Right mouse button upped
break;
case WM_MBUTTONUP:
// Middle button upped
break;
case WM_LBUTTONUP:
// Left button upped
break;
}
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}

void RegisterWindowClass(PCWSTR pszClassName, PCWSTR pszMenuName, WNDPROC lpfnWndProc)
{
WNDCLASSEX wcex = { sizeof(wcex) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = lpfnWndProc;
wcex.hInstance = g_hInst;
wcex.hIcon = LoadIcon(g_hInst, APP_ICON);
wcex.hCursor = LoadCursor(NULL, IDC_CROSS); // <-- CROSSHAIR AS MOUSE POINTER
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = pszMenuName;
wcex.lpszClassName = pszClassName;
RegisterClassEx(&wcex);
}

int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
std::cout << "SDL_Init error: " << SDL_GetError() << std::endl;
return 1;
}

g_hInst = GetModuleHandle(NULL);
RegisterWindowClass(WINDOW_CLASS_NAME, NULL, WndProc);

HWND hwnd = CreateWindow(WINDOW_CLASS_NAME, L"TEST", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 250, 200, NULL, NULL, g_hInst, NULL);

SDL_Window* window = SDL_CreateWindowFrom(hwnd);
SDL_UpdateWindowSurface(window);
SDL_ShowWindow(window);

// THIS IS NECESSARY FOR THE MOUSE CURSOR ESTABLISHED IN RegisterWindowClass TO BE MAINTAINED
SDL_Cursor* cursor;
cursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_CROSSHAIR);
SDL_SetCursor(cursor);
//

bool running = true;
SDL_Event e;
while (running)
{
while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT) running = false;
}
}

SDL_DestroyWindow(window);
DestroyWindow(hwnd);
UnregisterClass(WINDOW_CLASS_NAME, g_hInst);
SDL_Quit();

return 0;
}

如您所见,调用 SDL_SetCursor 后,不必在循环的每次迭代中都调用它。

关于c++ - 设置游标不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com