Прокрутка области ввода [SendMessage, PostMessage, SCROLL]
К моему сожалению, не все возможности WinAPI воплощены в VCL. Поэтому иногда приходится прибегать к функциям WinAPI. Но иногда и в функциях не найдешь, то что нужно. Тогда последний вариант - сообщения.
Сообщения могут рассылаться функциями SendMessage и PostMessage. Отличия между ними в том, что первая не возвращает результат, пока сообщение не будет обработано, а вторая возврашается сразу же.
В этих функциях присутствуют параметры по порядку - оконный дескриптор, название сообщения, первый параметр, второй параметр. Параметры - указатели на структуры, или просто целые, в зависимости от типа сообщения.
Необходимо отметить, что почти то же самое предоставляет метод Perform объектов TControl, только он действует именно на сам объект.
Как пример. Иногда бывает необходимо послать окну сообщение прокрутиться, например, если это Memo. Для осуществления этой задачи в WinAPI довольно много есть сообщений всяких разных. Но для областей ввода - Edit Controls - лучше всего подходит сообщения EM_SCROLL, EM_SCROLLCARET, EM_LINESCROLL. Первая прокручивает по линии или по странице, вторая до выделенного места (и убирает выделение), третья вверх-вниз влево-вправо по символам.
void __fastcall TForm1::ScrollCaretClick(TObject *Sender)
{
SendMessage(Memo1->Handle,EM_SCROLLCARET,0,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LeftClick(TObject *Sender)
{
SendMessage(Memo1->Handle,EM_LINESCROLL,-1,0);
}
void __fastcall TForm1::RightClick(TObject *Sender)
{
SendMessage(Memo1->Handle,EM_LINESCROLL,1,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpClick(TObject *Sender)
{
Memo1->Perform(EM_SCROLL,SB_LINEUP,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DownClick(TObject *Sender)
{
Memo1->Perform(EM_SCROLL,SB_LINEDOWN,0);
}
//---------------------------------------------------------------------------
Половину я оформил как Perform, а другую половину - как SendMessage. Как видно, они по действию одинаковы. Но! Perform действует только на данный объект, а SendMessage на любой, чей HWND известен. Так что у каждого свои возможности. В листинге представлены варианты сообщений и аргументы к ним. Там, где значения wParam 1 и -1 - это прокрутка по горизонтали в разных направлениях.