![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить сообщения поступающие панели? [D7, WinXP]
DR0N © (2005-08-21 22:11:00)Собственно есть панель, к ней поступают мессаги кейпресс например и т.д. Как мне их перехватывать в процедуре?
DR0N (2005-08-23 20:54:00) [1]В смысле без VCL я имел в виду, что всегда обычно не связываюсь с формами =) Это первый раз пробовал ловить мессаги формы.
Пост [5] это кусок процедуры которая обрабатывает мессаги, теперь выглядит так:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
EngineMainDraw;
end;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
EngineProcessMessages(Msg);
end;
Хе а что я недоговариваю =)
Leonid Troyanovsky (2005-08-23 16:44:00) [2]
> DR0N © (22.08.05 23:55) [9]
> А вообще я без VCL работаю отсюда и дебильные наверное вопросы,
> за которые прошу прощения =)
Во-первых, чтобы извинить нужны основания.
Во-вторых, если уж работа идет без VCL, то, что за TForm1?
В-третьих, ты чего-то не договариваешь.
--
Regards, LVT.
Eraser (2005-08-23 16:31:00) [3]Leonid Troyanovsky © (23.08.05 15:45) [13]
Согласен, так даже проще.
Eraser (2005-08-23 16:30:00) [4]DR0N © (23.08.05 15:58) [14]
Как тогда понимать [5]?
DR0N (2005-08-23 15:58:00) [5]Я решил проблемму по своему, положил на форму TApplicationEvents и в обработчеке OnMessage вставляю код реакции на мессаги. Все работает корректно.
Leonid Troyanovsky (2005-08-23 15:45:00) [6]
> Eraser © (23.08.05 15:34) [12]
> Так перехватывай их в самой панели! Для этого прийдётся
> переопределить класс этой панели.
Достаточно замены WindowProc, см примеры в хелпе.
--
Regards, LVT.
Eraser (2005-08-23 15:34:00) [7]DR0N © (23.08.05 11:32) [11]
Так перехватывай их в самой панели! Для этого прийдётся переопределить класс этой панели.
DR0N (2005-08-23 11:32:00) [8]Ну фактически все мессаги поступающие окну программы, что бы затем выбрать какие из них панеле идут и затем - обрабатывать.
Eraser (2005-08-23 00:21:00) [9]DR0N © (22.08.05 23:55) [9]
мне надо как то перехватывать ВСЕ мессаги одной процедурой
Все "мессаги" чего? Приложения или окна верхнего уровня?
DR0N (2005-08-22 23:55:00) [10]Так я делал, это работает, но мне надо как то перехватывать ВСЕ мессаги одной процедурой? А не писать отдельную для каждой.
А вообще я без VCL работаю отсюда и дебильные наверное вопросы, за которые прошу прощения =)
Eraser (2005-08-22 22:20:00) [11]
...
private
procedure WMSize(var Message: TMessage); message WM_SIZE;
...
procedure TYourSuperFormClass.WMSize(var Message: TMessage);
begin
// код
end;
вообще VCL с исходниками идёт, иногда интересно глянуть, как что устроено.
DR0N (2005-08-22 21:41:00) [12]А как, никто не подскажет?
Eraser (2005-08-22 21:10:00) [13]DR0N © (22.08.05 19:55) [5]
Синхронные сообщения перехватываются по-другому.
Необходимо в классе формы реализовать обработчик, при пом. ключевого слова message.
см. Справку.
DR0N (2005-08-22 19:55:00) [14]Так стоп, код то похоже правильный но он у меня не работает, приложение просто не реагирует на поступающие мессаги =( Я вот как делаю:
procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.hwnd = Panel1.Handle) then
EngProc(Panel1.Handle,Msg.message,Msg.wParam,Msg.lParam);
if Assigned(OldOnMsg) then
OldOnMsg(Msg, Handled);
end;
function EngProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var i : integer; s:string;
begin
case (Msg) of
WM_CLOSE:
if not DrawToPanel then
begin
PostQuitMessage(0);
Result := 0
end;
WM_KEYDOWN:
begin
keys[wParam] := True;
Result := 0;
end;
WM_KEYUP:
begin
if wParam = 44 then PrintScreen;
keys[wParam] := False;
Result := 0;
end;
WM_CHAR:
begin
if textinput then
begin
if wParam in [32..255] then InputText:=InputText+chr(wParam) else
if wParam=8 then
begin
s:=InputText;
InputText:='';
for i:=1 to length(s)-1 do InputText:=InputText+s[i];
end;
end;
if (ConsoleActive) and (not ConGoUp) then
begin
if (wParam=ord('`')) or (wParam=ord('~')) or (wParam=ord('¨')) or (wParam=ord('¸')) then
if (not ConsoleDraw) then ConsoleDraw:=true else if ConY> InitResY div 3 then ConGoUp:=true;
if (wParam in [32..255]) and not (wParam in [ord('`'), ord('~')]) and (ConsoleDraw) then CurentString:=CurentString+chr(wParam);
end;
end;
WM_MOUSEMOVE:
begin
MouseMove := True;
MoveXcoord := LOWORD(lParam);
MoveYcoord := HIWORD(lParam);
Result := 0;
end;
WM_LBUTTONDOWN:
begin
ReleaseCapture();
SetCapture(h_Wnd);
MouseButton := 1;
MBLeft:=true;
Xcoord := LOWORD(lParam);
Ycoord := HIWORD(lParam);
Result := 0;
end;
WM_RBUTTONDOWN:
begin
ReleaseCapture();
SetCapture(h_Wnd);
MouseButton := 2;
и так далее в том же духе
а
nWidth:=GetDeviceCaps(DrawContext, HORZRES);
nHeight:=GetDeviceCaps(DrawContext, VERTRES);
это возвращают странные значения =/ но не верные
помогите!
Сразу говорю на создание формы присвоить обработчик событий не забыл =)
DR0N (2005-08-22 09:27:00) [15]Большое спасибо =)
Заходите ко мне на сайт http://dronprogs.mirgames.ru
Вжжжик (2005-08-22 02:39:00) [16]
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
OldOnMsg : TMessageEvent;
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
end;
procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if ((Msg.hwnd = Panel1.Handle) and (Msg.message = WM_KEYDOWN)) then
begin
// здесь делаете обработку WM_KEYDOWN для Вашей Panel1
end;
// как правило Application.OnMessage не определён по-умолчанию,
// но всё же...
if Assigned(OldOnMsg) then
OldOnMsg(Msg, Handled);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldOnMsg:=Application.OnMessage;
Application.OnMessage:=OnMessage;
end;
оригинал тут -- http://www.delphimaster.ru/cgi-bin/forum.pl?id=1124316897&n=5
ответ на второй вопрос:
nWidth:=GetDeviceCaps(DrawContext, HORZRES);
nHeight:=GetDeviceCaps(DrawContext, VERTRES);
DR0N (2005-08-21 23:13:00) [17]Хорошо, есть форма VCL не окно созданное на WinApi, там то проблемм нет, я знаю. На форме есть панель. Известен ее handle - естественно. Мне нужно перехватывать мессаги винды (вида WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_SIZE, WM_TIMER и т.д.) и сделать свой обработчик, т.е. выполнять определенные действия при поступление какой либо мессаги. Вот собственно и все?
Еще тут вопросик, как узнать Width и Height объекта зная его DrawContext?
SpyBoy (2005-08-21 22:12:00) [18]Поподробней.