Что такое код setcursor


Почему setCursor() не работает?

Я тестирую новый аспект java, пытаясь создать пользовательский курсор для своей игры, но кажется, что я столкнулся с проблемой, когда в моем коде setCursor(); приводит к ошибке компилятора по той причине, что он не рассматривается как правильный фрагмент кода. Я следил за учебниками и разными руководствами, которые привели к одной и той же проблеме, и я не нашел ответа на мой запрос.

Надеюсь, кто-то может мне помочь, спасибо заранее. Заметки:

  • На данный момент я запускаю последнюю JRE (1.8).
  • Полученная ошибка компилятора выглядит следующим образом:

Исключение в потоке «AWT-EventQueue-0» java.lang.Error: проблема неразрешенной компиляции: метод setCursor (Cursor) не определен для типа Main

Проблема была решена благодаря последнему комментарию MadProgrammer:

Затем вам нужно вызвать setCursor с экземпляром JPanel — пример выполнения будет упрощен.

Что такое код setcursor

Сообщение WM_SETCURSOR посылается окну, если мышь вынуждает курсор двигаться внутри окна, а ввод данных от мыши не перехватывается.

Параметры
hwnd
Значение wParam. Идентифицирует окно, которое содержит курсор.
nHittest
Значение младшего слова lParam. Определяет код местоположения курсора.
wMouseMsg
Значение старшего слова lParam. Определяет идентификатор сообщения мыши.

Действие по умолчанию
Функция DefWindowProc, перед обработкой, передает сообщение WM_SETCURSOR родительскому окну. Если родительское окно возвращает ИСТИНА (TRUE), дальнейшая обработка останавливается. Передача сообщения родительскому окну дает ему контроль над установкой курсора в дочернем окне. Функция DefWindowProc также использует это сообщение для того, чтобы установить курсор в виде стрелке, если он не в рабочей области, или в виде зарегистрированного курсора класса, если он находится в рабочей области. Если младшее слово параметра lParam — HTERROR, а старшее слово lParam определяет, что одна из кнопок мыши нажата, DefWindowProc вызывает функцию MessageBeep.

Замечания
Старшее слово lParam имеет значение ноль тогда, когда окно вводит режим меню.

Смотри также
DefWindowProc, MessageBeep

Размещение и совместимость WM_SETCURSOR

Что такое код setcursor

Сообщение выполняется при скольжении курсора мыши в окне.

Указанные параметры передаются системой.

$wParam Дескриптор окна или элемента, над которым находится курсор
$lParam Двойное слово содержит:
младшее слово = Код, определяющий в какой области находится курсор
старшее слово = Сообщение от мыши, нажатие и отпуск

Смотрите функцию GUIRegisterMsg.


Global $assot [ 19 ][ 2 ] = [ _
[ 1 , ‘1 — Клиентская область’ ], _
[ 2 , ‘2 — Заголовок’ ], _
[ 3 , ‘3 — Иконка’ ], _
[ 5 , ‘5 — Меню’ ], _
[ 6 , ‘6 — Горизонтальная прокрутка’ ], _
[ 7 , ‘7 — Вертикальная прокрутка’ ], _
[ 8 , ‘8 — Свернуть’ ], _
[ 9 , ‘9 — Развернуть’ ], _
[ 10 , ’10 — Левый грань’ ], _
[ 11 , ’11 — Правая грань’ ], _
[ 12 , ’12 — Верхняя грань’ ], _
[ 13 , ’13 — Левый верхний угол’ ], _
[ 14 , ’14 — Правый верхний угол’ ], _
[ 15 , ’15 — Нижняя грань’ ], _
[ 16 , ’16 — Левый нижний угол’ ], _
[ 17 , ’17 — Правый нижний угол’ ], _
[ 18 , ’18 — Рамка’ ], _ ; если стиль без возможности изменения размера окна (-1)
[ 20 , ’20 — Закрыть’ ], _
[ 21 , ’21 — Знак вопроса’ ]]

Global $k = 0 , $Byfer
$hGui = GUICreate ( «WM_SETCURSOR» , 510 , 140 , — 1 , — 1 , BitOR ( $WS_OVERLAPPEDWINDOW , $WS_HSCROLL , $WS_VSCROLL ), $WS_EX_TOPMOST )
GUICtrlCreateLabel ( ‘Функция WM_SETCURSOR выполняется при скольжении курсора мыши в окне.’ , 5 , 3 , 400 , 17 )
$Button = GUICtrlCreateButton ( ‘Button’ , 10 , 25 , 70 , 25 )
$StatusBar = GUICtrlCreateLabel ( » , 5 , 55 , 270 , 74 )
GUISetState ()

Func WM_SETCURSOR ( $hWnd , $Msg , $wParam , $lParam )
$k += 1
$Hittest = BitAND ( $lParam , 0xFFFF ) ; _WinAPI_LoWord
$MouseMsg = BitShift ( $lParam , 16 ) ; _WinAPI_HiWord
WinSetTitle ( $hGui , » , ‘Вызов ‘ & $k )

Илон Маск рекомендует:  Тег body

$info_ID = ‘?’
For $i = 0 To 18
If $Hittest = $assot [ $i ][ 0 ] Then
$info_ID = $assot [ $i ][ 1 ]
ExitLoop
EndIf
Next
$Tmp = $info_ID & @LF & ‘hWnd= ‘ & $wParam & @LF & ‘ > & _WinAPI_GetDlgCtrlID ( $wParam ) & @CRLF & ‘ MouseMsg = ‘ & $MouseMsg
If $Tmp <> $Byfer Then
GUICtrlSetData ( $StatusBar , $Tmp )
$Byfer = $Tmp
EndIf
Return $GUI_RUNDEFMSG
EndFunc

Вопрос по windows, user-interface &#8211 SetCursor возвращается после перемещения мыши

Я использую SetCursor, чтобы установить системный курсор на собственное изображение. Код выглядит примерно так:

Когда я делаю это, курсор меняется, но при первом сообщении о перемещении мыши он снова превращается в системный курсор по умолчанию. Это единственный код в проекте, который устанавливает курсор. Что мне нужно сделать, чтобы курсор остался таким, каким я его установил?

проблема возникает из курсора, определенного на RegisterClass или же RegisterClassEx вызов. Вы, вероятно, имеете такой код:

где wndcls.hCursor говорит, какой курсор будет использоваться, когда WM_SETCURSOR сообщение брошено; это происходит каждый раз, когда происходит движение мыши и не только.

Я решил похожую проблему следующим образом:

В карте сообщений класса добавьте запись для WM_SETCURSOR сообщение:

Добавить метод OnSetCursor , который переопределит реализацию родительского класса:

Пояснение: когда SomeCondition() верно, вы не будете называть реализацию родителя. Может быть, вы всегда хотите, чтобы курсор не заменял поведение родительского класса, поэтому вам просто нужен еще более короткий метод:

И объявление метода в заголовочном файле:

чтобы ваша ручка HCURSOR не выходила за рамки. Когда мышь перемещается, сообщения Windows начинают летать повсюду, и это сотрет вашу ручку (в примере выше).

Сделайте HCURSOR закрытым членом класса и используйте этот дескриптор при вызове LoadCursor . () и SetCursor (). Когда вы закончите, не забудьте освободить его и очистить, иначе у вас будет утечка ресурсов.

у меня есть два варианта. Первый — это тот, который предложил Марк Рэнсом, который должен реагировать на окна. WM_SETCURSOR сообщение и вызовите SetCursor в это время в зависимости от того, где находится мышь. Обычно окна будут отправлять только вам WM_SETCURSOR когда курсор находится над вашим окном, вы можете установить курсор только в своем окне.

Другой вариант — установить курсор по умолчанию для дескриптора окна одновременно с вызовом. SetCursor , Это меняет курсор, установленный обработчиком по умолчанию на WM_SETCURSOR , Этот код будет выглядеть примерно так:

Если вы используете второй метод, вы должны вызвать оба SetCursor а также SetClassLong или ваш курсор не будет обновляться до следующего перемещения мыши.


Что может сбросить форму курсора, кроме SetCursor?

Я поддерживаю приложение C++, который использует флэш OCX для воспроизведения SWF-файла.

Когда пользователь наводит курсор на кнопку в SWF, вспышки внутри делает вызов WinAPI SetCursor функция для установки IDC_HAND курсор — Я вижу, что, когда я контролирую WinAPI вызовов функции курсора, связанные с помощью API Monitor V2 (rohitab.com). Тем не менее, в моем случае курсор не меняется, то есть пребывание IDC_ARROW .

Приложение само по себе не вызывает SetCursor вообще. Окно прикладных процессов WM_SETCURSOR сообщение следующим образом, т.е. не восстанавливает курсор:

Может кто-нибудь пожалуйста, дайте мне знать, кто может сбросить/изменить форму курсора в этом случае?

Обновление: Интересная часть является тот факт, что у меня есть 2 подобных установок, которые производят противоположные результаты.

Приложение I сохранить фактически устанавливает WH_GETMESSAGE зацепить «SysListView32» и запускает поток, который создает Flash-плеер. Таким образом, установка не так прямолинейно.

Тем не менее, если я просто создать простой пример, который создает игрок в, в основном, WinMain, то код выше работает отлично и курсор становится изменен.

Илон Маск рекомендует:  Дублирование содержимого переменнной конструктор copy

Поэтому кажется, что что-то сбросить состояние курсора в первом случае. Как узнать, что сбрасывает курсор?

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

SetCursor

Функция SetCursor устанавливает курсор.

HCURSOR SetCursor (

HCURSOR hCursor // дескриптор курсора

Параметры

hCursor — идентифицирует курсор. Курсор должен быть создан функцией CreateCursor или загружен функциями LoadCursor или LoadImage . Если значение этого параметра равно NULL, курсор убирается с экрана.

Windows 95: Ширина и высота курсора должны быть значениями, возвращаемые функцией GetSystemMetrics для параметров SM _ CXCURSOR и SM _ CYCURSOR . В дополнение, глубина цвета курсора должна совпадать с глубиной цвета экрана, или курсор будет монохромным.


Возвращаемые значения

Возвращается дескриптор предыдущего курсора, если таковой имеется.

Если предыдущего курсора нет, возвращается NULL .

Комментарии

Курсор устанавливается, только если он отличен от предыдущего курсора. В противном случае, функция возвращает управление немедленно.

Курсор является разделяемым ресурсом. Окно должно устанавливать курсор только в том случае, если он находится в его клиентской области и окно перехватывает ввод мыши. В системах без мыши, окно должно восстанавливать предыдущий курсор перед тем, как он покинет клиентскую область окна.

Если ваше приложение должно устанавливать курсор, когда он находится в окне, будьте уверены, что курсор класса для указанного класса окна установлен в NULL . Если курсор класса не NULL, система восстанавливает курсор класса каждый раз, когда перемещается мышь.

Курсор не отображается на экране, если внутренний счетчик отображений меньше нуля. Это происходит, если приложение использует функцию ShowCursor для скрытия курсора большее число раз, чем оно показывает курсор.

См. также

CreateCursor, GetCursor, GetSystemMetrics, LoadCursor, LoadImage, SetCursorPos, ShowCursor .

SetCursorPos() и GetCursorPos()

Written on 11 Февраля 2007 .

Устанавливает курсор в определенную позицию на экране:

При успешном выполнении функция вернет ненулевое значение.

Вторая функция получает позицию курсора на экране:

При успешном выполнении функция вернет ненулевое значение.

Запустите пример ниже. Курсор убежит в левый верхний угол, после истечения времени вернется на место.

При копировании материалов наличие активной индексируемой ссылки на сайт обязательно.

5.11.1.10 — Функция SetCursor / Курсоры / Win32 API


5.11.1.10 — Функция SetCursor

Функция SetCursor устанавливает форму курсора.

Параметры
hCursor
Идентифицирует курсор. Курсор, должен быть создан функцией CreateCursor или загружен функцией LoadCursor или LoadImage. Если этот параметр имеет значение ПУСТО (NULL), курсор удаляется с экрана.
Windows 95: ширина и высота курсора должны быть значениями, возвращенными функцией GetSystemMetrics для SM_CXCURSOR и SM_CYCURSOR. Кроме того, битовая глубина резко изображаемого пространства курсора должна соответствовать битовой глубине резко изображаемого пространства дисплея, или курсор должен быть одноцветен.

Возвращаемые значения
Возвращаемое значение — дескриптор предыдущего курсора, если тот имелся.
Если не было никакого предыдущего курсора, возвращаемое значение ПУСТО (NULL).

Замечания
Курсор устанавливается только тогда, если новый курсор отличается от предыдущего курсора; иначе, функция немедленно возвращает значение.
Курсор — общедоступный ресурс. Окно должно устанавливать форму курсора только тогда, когда курсор находится в его рабочей области или когда окно захватило ввод мыши. В системах без мыши, окно должно восстановить предыдущий курсор до того, как курсор оставит рабочую область или до того, как система предоставит управление другому окну.
Если ваша прикладная программа должна установить курсор, в то время когда оно находится в окне, удостоверитесь, что курсор класса в классе определяемого окна установлен в значение ПУСТО (NULL). Если курсор класса не ПУСТО (NULL), система восстанавливает курсор класса, каждый раз, когда перемещается мышь.
Курсор не показывается на экране, если внутренний счетчик отображения курсора — меньше чем нуль. Это происходит тогда, если прикладная программа использует функцию ShowCursor для сокрытия курсора большее количество времени, чем для показа курсора.

Илон Маск рекомендует:  Области и api функции работы с ними

Смотри также
CreateCursor, GetCursor, GetSystemMetrics, LoadCursor, LoadImage, SetCursorPos, ShowCursor

Размещение и совместимость SetCursor

Значение SetCursor (X, Y) координаты

В этом примере эскиз показывает, как использовать метод SetCursor (), чтобы переместить курсор. Для перемещения курсора, просто вызовите SetCursor () с строками и столбцами положения. Например, для дисплея 2×16:

Я не в состоянии понять выше code.Can кто-то пожалуйста дать разъяснения по тем же?

Линия lcd.setCursor() перемещает курсор. Курсор положение lertter вы хотите текст , чтобы начать показ в. lcd.setCursor() принимает два значения: x положение и y положение. Он принимает их в таком порядке: lcd.setCursor(x, y) .

2×16 Дисплей означает , что она имеет 2 строки и 16 столбцов символов, или 2 y значения и 16 x значений.

В Arduino коде и в большинстве языков с-типа вы начинаете отсчет с 0, то это означает , что для получения первого столбца Вы должны сказать Arduino , чтобы посмотреть на x 0. Или положить письмо в последней колонке на первой строке вас должны были бы сказать Arduino , чтобы переместить курсор к: (15, 0) .

Почему не работают функции WINAPI: HideCaret, ShowCaret, ShowCursor, SetCursor?

Попытка применить в советнике библиотечные функции WINAPI

HideCaret(int hWnd) — скрыть курсор,

ShowCaret(int hWnd) — показать курсор,

ShowCursor(int bShow) — скрыть и показать курсор,


SetCursor(int hCur) — установить форму курсора

не дают ни ошибки, ни обещанного результата.

Пример. Для тестконтроля я использовал простейший код:

int GetCursor(); //handle текущего кусора
int HideCaret(int hWnd); //скрывает курсор
int ShowCaret(int hWnd); //показывает курсор

HideCaret(hCursor); //скрывает курсор
Sleep(5000);
ShowCaret(hCursor); //показывает курсор

Не работает. Может быть, есть какие-то особенности в применении этих функций в МТ4?

Не знаю, можно ли использовать для обозначенных целей встроенную WinUser32.mqh?

Буду признателен за ответ знатоков.

Сделать можно фсё, останавливает цена вопроса.

Из любопытства — к чему такие потуги, просто украсить торговый терминал ?

Судя по объявлению функций опыт программирования в виндах отсутствует,

а без этого в это случае никак.

Судя по написанию функций опыт программирования в виндах отсутствует,

а без этого в это случае никак.

Хорошо бы, что б по сути. А опытные люди странным образом когда-то были неопытными, работой опыт нажили. И какой же Вы умный, что Вы по двум строчкам кода определяете квалификацию. На бирже так же дела?

Спасибо. Если можно, чуть подробнее об «окна отлавливать».

Сделать можно всё, это точно. Сам недавно написал библиотеку, с применением WinAPI, для автоматизации торговли, в случае, когда автоматическая торговля запрещена. Библиотека просто вызывает нужные менюшки, отправляет и редактирует ордера через пользовательский интерфейс, в обход прямого вызова торговых функций. Приведённых Вами функций не использовал. Но и со своими тоже много глюков ловил. И глюки были на уровне паранормальных :-). Некоторые так и не получилось локализовать, хорошо, что есть обходные, рабочие, пути. Зато теперь автоматическая торговля, при её запрете, прям из mql советника, безо всяких сторонних DLL.

Не могу представить в каком случае понадобилось скрывать и показывать курсор для редактирования текста (На сколько знаю, HideCaret(int hWnd) и ShowCaret(int hWnd) служат именно для этого).

Про WinUser32.mqh могу добавить, что всегда использовал свои описания всех используемых API функций, переписанных с сишных хедеров виндового SDK, так как, во первых в WinUser32.mqh мало что есть, во вторых бывает необходимость вызова некоторых функции с разными описаниями (прототипами). А так как перегрузки функций в mql4 нету (незнаю как там в mql5. ) то пришлось её делать самому, в обход, применяя разные прототипы для одних и тех же функций.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL