Форум: "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.041 c