SetCursor возвращается после перемещения мыши

Ваша функция в настоящее время не работает. Например, если вы введете [1, 200, 3, 400], это приведет к 200, а не 400.

Цель этой задачи, кажется, состоит в том, чтобы заставить вас задуматься о том, как реализовать алгоритм для поиска максимального значения в массиве, отсюда и запрет на Math функции.

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

  1. Проверить, больше ли текущее число, чем текущее максимальное число.
  2. Если это так, установите максимальное число, равное текущему номеру.
  3. Если это не так, вам не нужно ничего делать. Вместо этого позвольте вашему циклу перейти к следующему числу в вашем массиве
  4. Повторяйте этот цикл, пока вы не посмотрите на все числа в вашем массиве.

Это основная схема работы вашего алгоритма. Тем не менее, вы можете столкнуться с несколькими проблемами с этим. Например, при взгляде на первое число в вашем массиве, что следует считать текущим максимальным числом (поскольку вы еще не видели никаких предыдущих значений)? Эту проблему можно решить, установив текущее максимальное число на первый элемент в вашем массиве в начале, а затем запустив алгоритм, чтобы найти любое число, превышающее максимальное число (первое число) и соответственно обновляет его значение (когда найдено большее число).

Принимая все это во внимание, ваша findMax() функция может быть переписана следующим образом (подробности см. В комментариях к коду):

function findMax(myArray) {
  var maxNumber = myArray[0]; // when we first start, we can set the first element in our array to be the max number - it might not be the max number in the end, but it is a number we can compare the rest of the numbers in our array off of.
  
  for (var i = 1; i < myArray.length; i++) { // loop through our array. (we can start i at 1, because we don't need to check the first element as we have set it to the maxNumber above)
    var currentNumber = myArray[i]; // get the current number from the array.
    if(currentNumber > maxNumber) { // if the current number is greater than our maximum number (which we initially set to the first number in our array) we can change our maxNumber to be the currentNumber:
      maxNumber = currentNumber
    }
  }
  // When we run this code our loop would've finished, meaning we have gone through our entire array and found the maxNumber
  return maxNumber;
}

console.log(findMax([1, 200, , 3, 400])); // Output: 400

[1130 ]

Теперь, если вы действительно педантичны в том, чтобы заставить вашу функцию работать точно так же, как Math.max(), вы можете увидеть этот ответ , который показывает реализацию этого метода в Chrome V8.

Здесь приведена лишь одна реализация того, как можно реализовать алгоритм для поиска наибольшего значения в массиве.

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

Решение, которое я здесь предоставил, имеет временную сложность из O (N) , где N - количество элементов в вашем массиве. Это означает, что для того, чтобы найти самый высокий элемент в вашем массиве, он должен проверить каждый элемент в вашем массиве. Это может показаться не слишком плохим, но если размер вашего массива увеличивается (скажем, он имеет 1 000 000 номеров), это может занять некоторое время для расчета. Однако, правда в том, что для того, чтобы найти наибольшее число в массиве , вам действительно нужно проверить каждый элемент.

Однако, с учетом вышесказанного, есть другие структуры данных (такие как max-heap ), которые вы можете реализовать, которые могут предоставить вам лучшую временную сложность и производительность. Если вы, например, использовали 'max-heap', и все, что вы хотели сделать, это найти максимальное число, вы можете использовать его таким образом, который позволит вам найти максимальное число (то есть получить корневой узел) в [ 1119] O (1) временная сложность. Это означает, что вы можете мгновенно получить максимальное число из вашей структуры данных. Это не то, что вам нужно реализовать само по себе, скорее это просто то, что нужно знать и иметь в виду.

8
задан Nathan 28 January 2009 в 00:35
поделиться

4 ответа

Кажется, что у меня есть две опции. Первым является тот, который Mark Ransom предложил здесь, который должен ответить на окна WM_SETCURSOR передайте и назовите SetCursor в то время на основе того, где мышь. Обычно окна только отправят Вас WM_SETCURSOR когда курсор по Вашему окну, таким образом, Вы только установили бы курсор в своем окне.

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

// defined somewhere
HWND windowHandle;
HCURSOR cursor;

SetCursor(cursor);
SetClassLong(windowHandle, GCL_HCURSOR, (DWORD)cursor);

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

10
ответ дан 5 December 2019 в 09:26
поделиться

Необходимо ответить на сообщение Windows WM_SETCURSOR.

5
ответ дан 5 December 2019 в 09:26
поделиться

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

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

2
ответ дан 5 December 2019 в 09:26
поделиться

Такое поведение должно быть таким. Я думаю, что самое простое решение: при создании вашего класса окна ( RegisterClass || RegisterClassEx ), установите WNDCLASS.hCursor || WNDCLASSEX.hCursor член NULL .

1
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: