C++:WinAPI.当标准光标在程序屏幕的工作表面之外时,将其转换为您自己的光标
C++: WinAPI. Convert the standard cursor to your own when it is outside the working surface of the program screen
当标准光标在程序屏幕的工作面之外时,我需要将其转换为自己的光标。最初,当我离开窗口时,光标在屏幕上是标准的——我自己的,应该是这样。我把它放回——又是标准的。但当我再次走出窗户时,它不再变成我的了。也就是说,它只起作用一次。错误在哪里?
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
TRACKMOUSEEVENT tme;
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static BOOL bMouseInside;
switch (message)
{
case WM_CREATE:
{
RECT rt;
POINT pt = { 0, 0 };
GetClientRect(hWnd, &rt);
ClientToScreen(hWnd, &pt);
OffsetRect(&rt, pt.x, pt.y);
GetCursorPos(&pt);
bMouseInside = PtInRect(&rt, pt);
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER;
tme.hwndTrack = hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_MOUSEMOVE: {
tme.cbSize = sizeof(tme);
tme.hwndTrack = hWnd;
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
if (!bMouseInside)
{
SetSystemCursor(def_arrow_cur, 32512);
DestroyCursor(def_arrow_cur);
bMouseInside = TRUE;
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
}
break;
case WM_MOUSELEAVE:
tme.cbSize = sizeof(tme);
tme.hwndTrack = hWnd;
tme.dwFlags = TME_HOVER;
tme.dwHoverTime = HOVER_DEFAULT;
_TrackMouseEvent(&tme);
if (bMouseInside)
{
SetSystemCursor(my_cur, 32512);
DestroyCursor(my_cur);
bMouseInside = FALSE;
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
原生游标和标准游标是这样创建的:
HCURSOR def_arrow_cur = CopyCursor(LoadCursor(0, IDC_ARROW));
HCURSOR my_cur = LoadCursorFromFile(TEXT("my.cur"));
来自文档:
备注
DestroyCursor
函数会破坏非共享游标。请勿使用此函数销毁共享游标。共享游标的有效性为只要从中加载它的模块保留在存储器中。这个以下函数获得共享光标:
LoadCursor
LoadCursorFromFile
LoadImage
(如果使用LR_SHARED
标志(CopyImage
(如果使用LR_COPYRETURNORG
标志并且hImage参数是共享光标(
但你仍然这么做。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在Qt C++中更改光标
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 如何将光标(鼠标指针对象)转换为bmp图像的自动序列