Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
1-1128332198
andrey2
2005-10-03 13:36
2005.10.30
Макро-плейер


14-1128520916
NailMan
2005-10-05 18:01
2005.10.30
Сканер штрих-кодов: подключить!


4-1124892270
ArtemESC
2005-08-24 18:04
2005.10.30
Соединение с интернетом


14-1129048573
Santyago
2005-10-11 20:36
2005.10.30
Что пожелать начальнице?


14-1128586993
BURN
2005-10-06 12:23
2005.10.30
Пятнашки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский