Операционная система Microsoft Windows 3.1 для программиста© Александр Фролов, Григорий ФроловТом 11, М.: Диалог-МИФИ, 1993, 269 стр. 6.2. Сообщения для внутренней области окнаЭти сообщения генерируются в том случае, если при обработке сообщения WM_HITTEST функция DefWindowProc вернула значение HTCLIENT. Для всех сообщений из этой группы параметр lParam содержит координаты курсора мыши, а параметр wParam - значение, с помощью которого можно определить, какие клавиши на мыши и клавиатуре были нажаты в тот момент, когда произошло событие, связанное с сообщением. Младшее слово параметра lParam содержит горизонтальные координаты курсора мыши, старшее - вертикальные. Параметр wParam может состоять из отдельных битовых флагов, перечисленных ниже.
Анализируя параметр wParam, приложение может определить, были ли в момент события нажаты какие-либо клавиши мыши или клавиши <Control> и <Shift>, расположенные на клавиатуре. Следует учесть, что вы можете нажать клавишу мыши, когда курсор находится над одним окном, затем переместить курсор в другое окно и там отпустить клавишу мыши. В этом случае одно из сообщений о том, что была нажата клавиша мыши (WM_LBUTTONDOWN, WM_RBUTTONDOWN или WM_MBUTTONDOWN), попадет в функцию первого окна, а сообщение о том, что клавиша мыши была отпущена (WM_LBUTTONUP, WM_RBUTTONUP или WM_MBUTTONUP), - во второе. Когда мы работали с клавиатурными сообщениями, вслед за сообщением о том, что клавиша была нажата, всегда следовало сообщение о том, что клавиша была отпущена. При обработке сообщений мыши ваша функция окна может получить сообщение о том, что клавиша мыши была отпущена без предварительного сообщения о том, что она была нажата. Аналогично, вы можете никогда не дождаться сообщения об отпускании клавиши мыши после прихода сообщения о том, что клавиша мыши нажата: это сообщение может уйти в другое окно. Следует сделать особое замечание относительно сообщений о двойном щелчке мыши. Это сообщения WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK и WM_RBUTTONDBLCLK. Двойным щелчком (double click) называется пара одиночных щелчков, между которыми прошло достаточно мало времени. Изменить значение интервала, в течение которого должны поступить два одиночных щелчка, чтобы система распознала их как один двойной щелчок, проще всего при помощи стандартного приложения Windows с именем Control Panel. Еще одно условие распознавания двойного щелчка менее очевидно и заключается в том, что за интервал между двумя одиночными щелчками курсор мыши не должен переместиться на слишком большое расстояние. С помощью функции GetSystemMetrics в Windows версии 3.1 вы можете определить размеры прямоугольника, внутри которого должны быть сделаны два щелчка мышью, для того чтобы они могли распознаваться как один двойной щелчок. Для этого ей надо передать в качестве параметра значения SM_CXDOUBLECLK (ширина прямоугольника) и SM_CYDOUBLECLK (высота прямоугольника). Кроме всего этого, для того чтобы окно могло получать сообщения о двойном щелчке мышью, при регистрации класса окна необходимо определить стиль класса окна CS_DBLCLKS. Если выполнить двойной щелчок левой клавишей мыши в окне, для класса которого не определен стиль CS_DBLCLKS, функция окна последовательно получит следующие сообщения: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDOWN WM_LBUTTONUP Если же сделать то же самое в окне, способном принимать сообщения о двойном щелчке, функция окна в ответ на двойной щелчок получит следующую последовательность сообщений: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONUP Как нетрудно заметить, перед сообщением WM_LBUTTONDBLCLK функция окна получит сообщение WM_LBUTTONDOWN. Дело в том, что после первого щелчка Windows еще не знает, будет ли следом обычный или двойной щелчок, - все зависит от интервала времени и перемещения курсора. Обычно правильно спроектированное приложение по двойному щелчку выполняет ту же самую операцию, которую оно бы выполнило по второму щелчку из серии. Например, по одиночному щелчку мыши приложение может выбрать команду из меню. Для выбранной команды одиночный щелчок может запустить ее на выполнение. Тогда двойной щелчок должен сразу запускать команду на выполнение. В этом случае одиночный щелчок выберет команду, а двойной - запустит ее. Если вы соберетесь сделать двойной щелчок, а получится два одиночных, ничего особенного не произойдет - приложение будет вести себя так, как вы и ожидаете, а именно, запустится выбранная вами команда. Сообщение WM_MOUSEMOVE извещает приложение о перемещении курсора мыши. С помощью этого сообщения приложение может, например, рисовать в окне линии вслед за перемещением курсора. Последнее сообщение из группы сообщений для внутренней области окна имеет имя WM_MOUSEACTIVATE. Оно посылается функции неактивного окна, когда вы помещаете в это окно курсор мыши и делаете щелчок левой или правой клавишей. Если передать это сообщение функции DefWindowProc, в ответ на него Windows сделает указанное окно активным. Сообщение WM_MOUSEACTIVATE передает параметры wParam и lParam. Параметр wParam содержит идентификатор окна, которое будет активным. Если активным становится окно, имеющее дочерние окна, передается идентификатор самого старшего, родительского окна. Младшее слово параметра lParam содержит результат обработки сообщения WM_NCHITTEST функцией DefWindowProc. Мы описали возможные значения, когда рассказывали о сообщении WM_NCHITTEST. Старшее слово параметра lParam содержит код сообщения мыши, соответствующий способу, которым данное окно было выбрано. Это может быть код сообщений типа WM_LBUTTONDOWN, WM_RBUTTONDOWN и т. п. Для сообщения WM_MOUSEACTIVATE определен код возврата:
|