В приложениях, разработанных в среде С++Builder, можно непосредственно производить обработку соответствующих сообщений WM_*. Однако среда С++Builder упрощает обработку аппаратного ввода для визуальных компонентов с помощью механизма событий. Как уже отмечалось выше, все визуальные компоненты (наследники TControl) имеют возможность обработки событий от мыши. Все же оконные компоненты (наследники TWinControl) имеют также возможность обработки событий от клавиатуры. Рассмотрим основные из этих событий более подробно.

6.1. Интерфейс работы с мышью в C++Builder

Событие void TControl::OnMouseMove (__fastcall * (__closure)(TObject* Sender, TShiftState Shift, int X, int Y)) возникает при перемещении курсора мыши над органом управления. Принцип работы механизма событий был описан в главе 4. В отличие от стандартных событий, событие OnMouseMove имеет три дополнительных параметра: Shift, X, Y. Параметры X и Y определяют координаты курсора мыши в клиентской области объекта Sender. Параметр Shift - это переменная типа множество, определяющая состояние функциональных клавиш Alt, Ctrl и Shift, а также кнопок мыши в момент постановки сообщения в очередь. Множество может содержать различные комбинации следующих флагов: ssShift – нажата клавиша Shift, ssAlt - нажата клавиша Alt, ssCtrl - нажата клавиша Ctrl, ssLeft - нажата левая кнопка мыши, ssRight - нажата правая кнопка мыши, ssMiddle - нажата средняя кнопка мыши, ssDouble - произведено двойное нажатие кнопки мыши.

Событие void TControl::OnMouseDown (__fastcall * (__closure)(TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y)) возникает при нажатии кнопки мыши. Параметры Shift, X, Y аналогичны предыдущему событию. Параметр Button - переменная типа перечисление, определяет, какая кнопка мыши была нажата. Он может содержать один из следующих флагов: mbLeft - нажата левая кнопка мыши, mbRight - нажата правая кнопка мыши, mbMiddle - нажата средняя кнопка мыши.

НЕ нашли? Не то? Что вы ищете?

Событие void TControl::OnMouseUp (__fastcall * (__closure)(TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y)) возникает при отпускании кнопки мыши. Параметры аналогичны событию OnMouseDown.

Событие void TControl::OnDblClick (__fastcall * (__closure)(TObject* Sender)) возникает при двойном нажатии левой кнопки мыши над объектом Sender. Данное событие доступно только для компонентов с установленным флагом csDoubleClicks в свойстве ControlStyle. В противном случае двойное нажатие будет интерпретироваться как два одинарных нажатия кнопки мыши.

Событие void TControl::OnClick (__fastcall * (__closure)(TObject* Sender)) возникает когда пользователь выполняет действие “click” (щелчок) над объектом Sender. Обычно это происходит при нажатии и отпускании левой кнопки мыши над компонентом. Однако к аналогичному результату приводят и другие действия пользователя. Например, для кнопки это нажатие клавиши “Spacebar” если кнопка находилась в фокусе ввода, для кнопки-переключателя (“CheckBox”) – изменение значения свойства Checked. Таким образом, данное событие связано не только с обработкой сообщений от мыши.

6.2. Интерфейс работы с клавиатурой в C++Builder

Событие void TWinControl::OnKeyDown (__fastcall * (__closure)(TObject* Sender, unsigned short &Key, TShiftState Shift)) возникает при нажатии клавиши на клавиатуре для компонента, имеющего фокус ввода. Параметр Shift аналогичен одноименному параметру для событий от мыши. Параметр Key содержит код нажатой клавиши. Для алфавитно-цифровых клавиш код совпадает с ASCII кодом соответствующего клавише символа, приведенного к верхнему регистру. Например, ‘S’ , ‘7’ и т. д. Для остальных клавиш используется виртуальный код клавиши, задаваемый константами VK_*. Например, VK_F1, VK_TAB, VK_RETURN и т. д. Заметим, что параметр Key передается по ссылке и может быть изменен в обработчике.

Событие void TWinControl::OnKeyUp (__fastcall * (__closure)(TObject* Sender, unsigned short &Key, TShiftState Shift)) возникает при отпускании ранее нажатой клавиши на клавиатуре. Параметры аналогичны предыдущему сообщению.

Событие void TWinControl::OnKeyPress (__fastcall * (__closure)(TObject* Sender, char &Key)) возникает при нажатии и отпускании алфавитно-цифровой клавиши на клавиатуре. Параметр Key содержит ASCII символ, сгенерированный в результате нажатия клавиши. Заметим, что нажатие функциональных клавиш, таких как Ctrl или F10 не приводит к генерации данного события. Кроме того, параметр Key будет всегда содержать получившийся ASCII код, независимо от способа его получения. Например, нажатие комбинации клавиш Shift-‘S’ при выключенном режиме CapsLock или клавиши ‘S’ при включенном приведут к генерации этого события с ASCII кодом ‘S’. Причем нажатие клавиши Shift не приведет к генерации OnKeyPress. Аналогично предыдущим событиям, параметр Key передается по ссылке и может быть изменен в обработчике. Таким образом можно, например, производить фильтрацию ввода и ограничить набор доступных для ввода символов.

При обработке событий от клавиатуры для формы есть один нюанс. Напомним, что события от клавиатуры генерируются именно для того компонента, который имеет фокус ввода. Таким образом, клавиатурные события для формы будут сгенерированы только в том случае, если ни один компонент на ней не имеет фокуса ввода. Однако существует специальное свойство KeyPreview компонента TForm. Если оно содержит значение true, то все клавиатурные события будут сначала сгенерированы для формы, владеющей компонентом с фокусом ввода, а потом повторно сгенерированы для этого компонента.

6.3. Пример использования событий мыши и клавиатуры в C++Builder

Рассмотрим небольшой пример, показывающий практическое применение всех рассмотренных выше событий. Форма содержит компонент TestStringGrid типа TStringGrid, для которого определены обработчики OnMouseDown, OnMouseUp и OnMouseMove. Обработчики этих событий реализуют возможность обмена содержимого ячеек. Для этого необходимо, нажав клавиши Ctrl и Alt и удерживая правую кнопку мыши, перетащить одну ячейку решетки на место другой. Также на форме содержится компонент TestMemo типа TMemo, для которого определен обработчик OnKeyDown. В данном обработчике реализованы следующие действия: удаление текущей строки при нажатии комбинации Ctrl-Y, выделение всего текста при нажатии комбинации Ctrl-A и изменение типа выравнивания текста при нажатии клавиши F2. На форме содержится компонент TestEdit типа TEdit, для которого определен обработчик OnKeyPress. Данный обработчик позволяет вводить в поле ввода только цифры и буквы для шестнадцатеричного представления числа. Кроме того, ввод возможен как в русской, так и в английской раскладке и в любом регистре. Во всех случаях ввод будет преобразован в прописные латинские символы. А для самой формы определен обработчик OnKeyUp, который позволяет завершить работу приложения при нажатии комбинации клавиш Ctrl-Alt-Q. Свойство KeyPreview должно быть установлено в true. Ниже приведен исходный код данного примера.

Листинг 6.1. Использование событий мыши и клавиатуры в приложениях

//*************testinput. h *******************

typedef struct TTr

{char from;

char to;

} *PTr;

class TTestForm : public TForm

{__published: // IDE-managed Components

TStringGrid *TestStringGrid;

TMemo *TestMemo;

TEdit *TestEdit;

void __fastcall FormCreate(TObject *Sender);

void __fastcall TestStringGridMouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall TestStringGridMouseMove(TObject *Sender,

TShiftState Shift, int X, int Y);

void __fastcall TestStringGridMouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall TestEditKeyPress(TObject *Sender, char &Key);

void __fastcall TestMemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);

void __fastcall FormKeyUp(TObject *Sender, WORD &Key,

TShiftState Shift);

private: // User declarations

bool Moving;

TPoint MovedCell;

TTr TrChar[28];

TAlignment algn[3];

public: // User declarations

__fastcall TTestForm(TComponent* Owner);

};

extern PACKAGE TTestForm *TestForm;

//*************testinput. cpp *******************

TTestForm *TestForm;

__fastcall TTestForm::TTestForm(TComponent* Owner) : TForm(Owner)

{ int i;

Moving=false;

MovedCell. x=0;MovedCell. y=0;

algn[0]=taLeftJustify;

algn[1]=taCenter;

algn[2]=taRightJustify;

for (i='a';i<='f';i++)

TrChar[i-'a'].from=i;

for (i='A';i<='F';i++)

{TrChar[i-'A'].to=i;TrChar[i-'A'+6].to=i;TrChar[i-'A'+12].to=i;}

TrChar[6].from='ф';TrChar[12].from='Ф';

TrChar[7].from='и';TrChar[13].from='И';

TrChar[8].from='с';TrChar[14].from='С';

TrChar[9].from='в';TrChar[15].from='В';

TrChar[10].from='у';TrChar[16].from='У';

TrChar[11].from='а';TrChar[17].from='А';

for (i='0';i<='9';i++)

{TrChar[i-'0'+18].from=i;TrChar[i-'0'+18].to=i;}

}

void __fastcall TTestForm::FormCreate(TObject *Sender)

{ randomize();

TestStringGrid->FixedCols=0;TestStringGrid->FixedRows=0;

for (int i=0 ;i<TestStringGrid->RowCount;i++)

for (int j=0 ;j<TestStringGrid->ColCount;j++)

TestStringGrid->Cells[i][j]=rand() %100;

}

void __fastcall TTestForm::TestStringGridMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)

{ if (Button==mbRight && Shift. Contains(ssCtrl) && Shift. Contains(ssAlt))

{ int tx, ty;

TGridRect tgr;

Moving=true;

TestStringGrid->MouseToCell(X, Y,tx, ty);

MovedCell. x=tx;MovedCell. y=ty;

tgr. Left=tx;tgr. Top=ty;tgr. Right=tx;tgr. Bottom=ty;

TestStringGrid->Selection=tgr;

}

}

void __fastcall TTestForm::TestStringGridMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)

{ if (Moving) TestStringGrid->Cursor=crHandPoint; }

void __fastcall TTestForm::TestStringGridMouseUp(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{ if (Moving && Button==mbRight)

{ int tx, ty;

AnsiString tstr;

Moving=false;

TestStringGrid->Cursor=crDefault;

TestStringGrid->MouseToCell(X, Y,tx, ty);

tstr=TestStringGrid->Cells[tx][ty];

TestStringGrid->Cells[tx][ty]=TestStringGrid-> Cells[MovedCell. x][MovedCell. y];

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14