2016-07-03 2 views
0

Я пытаюсь написать краткую и простую программу на C++, которая изменяет значок курсора на пользовательское изображение из каталога. Dev Center для Windows, кажется, some fairly straightforward documentation on how to do this in C++, откуда я пришел с этим кодом:C++: Правильное использование функций LoadImage и SetCursor

#include <iostream> 
#include <chrono> 
#include <thread> 
#include <Windows.h> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    //HINSTANCE hInst = GetModuleHandle(NULL); 
    HINSTANCE hInst = NULL; 
    HCURSOR cursor = (HCURSOR)LoadImage(hInst, "Image.bmp", IMAGE_BITMAP, 
        32, 32, LR_LOADFROMFILE); //Also tried LR_SHARED 
    cout << "Initializing\n"; 
    Sleep(1500); 
    SetCursor(cursor); 
    //Also tried SetSystemCursor(cursor, 32512); 
    cout << "Setting cursor\n"; 
    Sleep(1500); 
    DestroyCursor(cursor); 
    cout << "Restoring cursor\n"; 
    Sleep(2000); 
    return 0; 
} 

программа должна изменить курсор к растровому изображению, а затем изменить его обратно, а затем выйти. Сообщения печатаются, когда я запускаю его, но курсор не изменяется, как следует. Я не совсем уверен, связана ли моя проблема с функцией LoadImage, с функцией SetCursor или с чем-то еще. Я пробовал различные типы HINSTANCE для параметра HINSTANCE функции LoadImage, я пробовал разные флаги для последнего аргумента для функции LoadImage, и я также попытался использовать функцию SetSystemCursor вместо функции SetCursor.

Все, что я хочу сделать, это изменить изображение курсора мыши. Похоже, это должно быть очень просто, но оказалось, что это сложнее, чем я думал. Я намерен экспортировать этот код как DLL для использования с Java Native Interface для Java-проекта, который я использую, поскольку JVM не может изменить курсор вне окна программы.

Я искал повсюду и увидел здесь несколько похожих вопросов, но никто из них не ответил на вопрос, который у меня есть. Я видел, как некоторые люди упоминают, что мне нужно вызвать функцию SetCursor в ответ на сообщение WM_SETCURSOR, но я не совсем уверен, что они означают (у меня мало опыта на C++, поэтому, пожалуйста, несите меня). Надеюсь, вы, ребята, можете мне помочь. Благодарю.

+0

Это гораздо более активное участие. Страница MSDN на [с помощью курсоров] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms648380 (v = vs.85) .aspx # _win32_Creating_a_Cursor) должна указывать вас в правильном направлении. –

+0

'LoadImage' нужен файл * .cur, а не растровое изображение. Вы можете сделать * .cur файл в редакторе ресурсов Visual Studio. Здесь у вас есть консольная программа. 'WM_SETCURSOR' и' WNDCLASS/LoadCursor' используются в программе Windows, в которой вместо этого есть точка входа WinMain. Курсор обычно ограничен окном. «SetSystemCursor» изменит курсор на весь рабочий стол, но это не очень хороший вариант, потому что пользователь должен делать это с панели управления. Вы можете попробовать 'SetCapture' /' ReleaseCapture' в оконной программе или вашей программе Java, если она имеет что-то подобное. Существует также опция drag & drop ... –

+0

Вопрос, который у меня есть, заключается в следующем: в чем причина, по которой вы хотите изменить курсор за пределами собственного окна? Это для drag + drop или для чего-то еще? Решение может быть другим. Что касается вашего последнего абзаца, Windows использует дизайн передачи сообщений для своего пользовательского интерфейса. 'WM_'_something_ - это оконное сообщение. См. [This] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927.aspx) для обзора сообщений и того, для чего они используются. – theB

ответ

0

Я не думаю, что вы можете изменить курсор на окне консоли. Если вместо этого появилось диалоговое окно, я думаю, что курсор изменится. Я никогда не видел изменения курсора в окне консоли в Windows.

Смежные вопросы