Аппаратно-программные сведения

Таймер

Захват мыши

Если пользователь щелкнет левой кнопкой мыши в рабочей области окна (которая включает в себя клиентскую и не клиентскую области), Windows сделает активным окно, в котором вы произвели щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN. Обычно, сообщения WM_LBUTTONDOWN и WM_LBUTTONUP приходят парой, однако возможны исключения. Например, это может случиться, если кнопка мыши нажимается в одном окне, мышь перемещается в ваше окно, и кнопка отпускается. в этом случае, первое окно получит только сообщение WM_LBUTTONDOWN, а ваше окно получит сообщение WM_LBUTTONUP.

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

Для захвата мыши используется функция:

SetCapture(hWnd);

После вызова этой функции, Windows посылает все сообщения мыши в оконную процедуру того окна, описателем которого является hWnd. Сообщения мыши в этом случае всегда будут оставаться сообщениями рабочей области, даже, если мышь перемещается в нерабочей области окна. Координаты мыши все равно передаются в оконных координатах, в связи с чем они могут принимать отрицательное значение (если мышь окажется выше или левее рабочей области окна). Для освобождения мыши программа обязательно должна вызвать функцию:

ReleaseCapture();

Эта функция возвращает обработку мыши в нормальный режим.

Таймер в Windows является устройством ввода информации, которое периодически извещает о том, что истек заданный интервал времени. Ваша программа задает Windows интервал, через который приходят эти извещения.

Таймер используется в Windows в нескольких целях:

- Многозадачность – программа может использовать таймер для параллельного вызова подзадач.

- Поддержка обновления информации о состоянии программы и ее частей.

- Реализация авто сохранения.

- Завершение демонстрационный версий программ.

- Задания темпа изменения информации на экране.

- Программы мультимедиа

- и.т.п.

Системная плата компьютера имеет микросхему таймера. ROM BIOS компьютера инициализирует эту микросхему так, чтобы она генерировала аппаратное прерывание. Это прерывание называют "тиком таймера". Они генерируются каждые 54,925 миллисекунды или примерно 18,2 раза в секунду. Таким образом, устанавливается правило: в обычной ситуации программа не может получать сообщения от таймера чаще, чем 18,2 раз в секунду. Далее вы научитесь устанавливать время срабатывания таймера для вашей программы. Так вот, исходя из ограничения на частоту, можно отметить, что ваша программа физически не может получать сообщения от таймера через интервал, меньший 55 миллисекунд.

Windows получает от таймера аппаратное прерывание (каждые 18,2 секунды). Все программы, использующие таймер, не могут использовать аппаратное прерывание (за исключением программ, работающих под DOS и перехватывающих прерывания). Программы могут использовать таймер двумя способами: периодически получая сообщения от таймера WM_TIMER (фактически – от Windows) либо установив вызов какой либо процедуры приложения в зависимости от таймера. В первом случае, по истечению заданного интервала времени, Windows ставит в очередь сообщений к приложению синхронное сообщение WM_PAINT (это приводит к тому, что программа может получить сообщение несколько позже срока, а если, очередь сообщений переполнена, то и гораздо позже). Во втором случае, вы сообщаете Windows адрес своей процедуры и периодичность ее вызова. Все остальное Windows делает автоматически.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: