Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WM_VSCROLL [D6, Win2k]


МИФИст ©   (2002-09-18 19:32:00) 

Объясните, почему при вертикальной прокрутке RichEdit"а я не могу поймать сообщение WM_VSCROLL или WM_COMMAND->EN_VSCROLL?
Какое событие соответствует нажатию клавиши вниз или вверх?


MBo   (2002-09-19 09:41:00) [1]

с приведенной системой перехвата придется MakeObjectInstance делать, как сказал Alx2, но можно и проще - RichEdit1.WndProc подменять своей процедурой, не забыв сохранить и вызвать старую


Alx2   (2002-09-19 08:43:00) [2]

>return CallWindowProc((FARPROC)Form1->OldWindowProc, hWnd, msg, w, l);

Вот это место: Form1->OldWindowProc
кривое. Нарушается классовая концепция :)

Лучше использовать
function MakeObjectInstance(Method: TWndMethod): Pointer;
Которая метода объекта позволяет использовать как оконную ф-ю.

PS
type
TWndMethod = procedure(var Message: TMessage) of object;


Alx2   (2002-09-19 08:36:00) [3]

>Не подскажите как её использовать, это то?
Скорее всего то. В частности, для Memo.


МИФИст   (2002-09-18 23:35:00) [4]

Не подскажите как её использовать, это то?
class TForm1 : public TForm
{
__published: // IDE-шные компоненты
TMemo *Memo1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // Пользовательские объявления

public: // Пользовательские объявления
__fastcall TForm1(TComponent* Owner);

WNDPROC OldWindowProc;
};

CPP file:

LRESULT CALLBACK NewWindowProc(HWND hWnd, UINT msg, WPARAM w,
LPARAM l)
{

//Обрабатываем нужное нам сообщение
if (msg == WM_VSCROLL)
ShowMessage("The vertical scrollbar is scrolling!");

//Если нам необходимо прекратить дальнейшую обработку сообщения,
//то выходим и возвращаем ноль

//Вызываем старую оконную процедуру,
//которая обработает сообщение.
return CallWindowProc((FARPROC)Form1->OldWindowProc, hWnd, msg, w, l);
}
//----------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldWindowProc = (WNDPROC)SetWindowLong(Memo1->Handle,
GWL_WNDPROC, (long)NewWindowProc);
}
//----------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
SetWindowLong(Memo1->Handle, GWL_WNDPROC, (long)OldWindowProc);
}
//----------------------------------------------------------------------


MBo   (2002-09-18 23:09:00) [5]

Естественно, что сообщение прокрутки Richedit не приходит ФОРМЕ.
см. WindowProc


МИФИст   (2002-09-18 22:00:00) [6]

type
TForm2 = class(TForm)
...
protected
procedure WMCOM(var Mes: TMessage); message WM_COMMAND;
procedure WMSCR(var Mes: TMessage); message WM_VSCROLL;


Song   (2002-09-18 21:27:00) [7]

Непонятно что у Вас за класс. Это наследник?


МИФИст   (2002-09-18 20:20:00) [8]

protected
procedure WMCOM(var Mes: TMessage); message WM_COMMAND;
procedure WMSCR(var Mes: TMessage); message WM_VSCROLL;

первая процедура ловит другие сообщения, кроме EN_VSCROLL, вторая ничего не ловит


Song   (2002-09-18 19:42:00) [9]

А как ловите?


Наверх

Титульная страница Поиск, карта сайта Написать письмо