Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Как перехватить сообщения поступающие панели?   Найти похожие ветки 

 
DR0N ©   (2005-08-21 22:11) [0]

Собственно есть панель, к ней поступают мессаги кейпресс например и т.д. Как мне их перехватывать в процедуре?


 
SpyBoy ©   (2005-08-21 22:12) [1]

Поподробней.


 
DR0N ©   (2005-08-21 23:13) [2]

Хорошо, есть форма VCL не окно созданное на WinApi, там то проблемм нет, я знаю. На форме есть панель. Известен ее handle - естественно. Мне нужно перехватывать мессаги винды (вида WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_SIZE, WM_TIMER и т.д.) и сделать свой обработчик, т.е. выполнять определенные действия при поступление какой либо мессаги. Вот собственно и все?
Еще тут вопросик, как узнать Width и Height объекта зная его DrawContext?


 
Вжжжик   (2005-08-22 02:39) [3]


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://delphimaster.net/view/4-1124316897/

ответ на второй вопрос:


 nWidth:=GetDeviceCaps(DrawContext, HORZRES);
 nHeight:=GetDeviceCaps(DrawContext, VERTRES);


 
DR0N ©   (2005-08-22 09:27) [4]

Большое спасибо =)
Заходите ко мне на сайт http://dronprogs.mirgames.ru


 
DR0N ©   (2005-08-22 19:55) [5]

Так стоп, код то похоже правильный но он у меня не работает, приложение просто не реагирует на поступающие мессаги =( Я вот как делаю:

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);
это возвращают странные значения =/ но не верные

помогите!
Сразу говорю на создание формы присвоить обработчик событий не забыл =)


 
Eraser ©   (2005-08-22 21:10) [6]

DR0N ©   (22.08.05 19:55) [5]

Синхронные сообщения перехватываются по-другому.
Необходимо в классе формы реализовать обработчик, при пом. ключевого слова message.
см. Справку.


 
DR0N ©   (2005-08-22 21:41) [7]

А как, никто не подскажет?


 
Eraser ©   (2005-08-22 22:20) [8]

...
private
 procedure WMSize(var Message: TMessage); message WM_SIZE;
...
procedure TYourSuperFormClass.WMSize(var Message: TMessage);
begin
 // код
end;


вообще VCL с исходниками идёт, иногда интересно глянуть, как что устроено.


 
DR0N ©   (2005-08-22 23:55) [9]

Так я делал, это работает, но мне надо как то перехватывать ВСЕ мессаги одной процедурой? А не писать отдельную для каждой.

А вообще я без VCL работаю отсюда и дебильные наверное вопросы, за которые прошу прощения =)


 
Eraser ©   (2005-08-23 00:21) [10]

DR0N ©   (22.08.05 23:55) [9]
мне надо как то перехватывать ВСЕ мессаги одной процедурой


Все "мессаги" чего? Приложения или окна верхнего уровня?


 
DR0N ©   (2005-08-23 11:32) [11]

Ну фактически все мессаги поступающие окну программы, что бы затем выбрать какие из них панеле идут и затем - обрабатывать.


 
Eraser ©   (2005-08-23 15:34) [12]

DR0N ©   (23.08.05 11:32) [11]

Так перехватывай их в самой панели! Для этого прийдётся переопределить класс этой панели.


 
Leonid Troyanovsky ©   (2005-08-23 15:45) [13]


> Eraser ©   (23.08.05 15:34) [12]

> Так перехватывай их в самой панели! Для этого прийдётся
> переопределить класс этой панели.


Достаточно замены WindowProc, см примеры в хелпе.

--
Regards, LVT.


 
DR0N ©   (2005-08-23 15:58) [14]

Я решил проблемму по своему, положил на форму TApplicationEvents и в обработчеке OnMessage вставляю код реакции на мессаги. Все работает корректно.


 
Eraser ©   (2005-08-23 16:30) [15]

DR0N ©   (23.08.05 15:58) [14]

Как тогда понимать [5]?


 
Eraser ©   (2005-08-23 16:31) [16]

Leonid Troyanovsky ©   (23.08.05 15:45) [13]

Согласен, так даже проще.


 
Leonid Troyanovsky ©   (2005-08-23 16:44) [17]


> DR0N ©   (22.08.05 23:55) [9]

> А вообще я без VCL работаю отсюда и дебильные наверное вопросы,
> за которые прошу прощения =)


Во-первых, чтобы извинить нужны основания.
Во-вторых, если уж работа идет без VCL, то, что за TForm1?
В-третьих, ты чего-то не договариваешь.

--
Regards, LVT.


 
DR0N ©   (2005-08-23 20:54) [18]

В смысле без 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;

Хе а что я недоговариваю =)



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
9-1118732054
String
2005-06-14 10:54
2005.10.30
DirectX: Цикл обновления сцены


2-1128506267
alpine
2005-10-05 13:57
2005.10.30
Проблемма с SQL запросом.


2-1127924062
Starcom
2005-09-28 20:14
2005.10.30
Реестр! Изменить значение строкового(ых) параметра(ов)?


14-1128953044
БарЛог
2005-10-10 18:04
2005.10.30
Телевидение через локальную сеть, как?


14-1128918658
WondeRu
2005-10-10 08:30
2005.10.30
Опрос: А вы заглядываете под крышку колы?