Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2008, 15:54   #1
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию разобраться с сообщениями. Основы.

Решил научится работать ОСОЗНАННО с сообщениями. Понять их структуру и методы работы с ними. Что такое сообщение я нашел:
"Сообщение - это извещение о некотором имевшем место событии, посылаемое системой Windows в адрес приложения." И еще я даже нашел, что любое сообщение - это запись,описанная в модуле windows.
Итак вот как описано сообщение:
Код:
type
  TMsg =  packed record
     hwnd: HWND;      // Дескриптор окна-получателя
     message: UINT;   // Идентификатор сообщения
     WParam: WPARAM;  // 32 Бита дополнительной информации
     LParam: LPARAM;  // Ещё 32 бита дополнительной информации
     time: DWORD;     // Время создания сообщения
     pt: TPoint;      // Положение указателя мыши в момент создания сообщения
end;
Вопрос1: зачем нужны эти lparam и wparam? Как их использовать можно?
Вопрос2: чем отличаются SendMessage от PostMessage? И в каких случаях чем из них пользоваться?? Набор параметров у обоих одинаков...
я вот так отправлял сообщение на закрытие формы:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
HD: Thandle;
begin
HD:= Form1.Handle;
PostMessage(HD, WM_CLOSE, 0, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
HD: Thandle;
begin
HD:= Form1.Handle;
SendMessage(HD, WM_CLOSE, 0, 0);
end;
и оба метода работают. Так в чем отличие?
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 08.12.2008, 16:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

почитай статьи и книги и многие вопросы отпадут сами.
Цитата:
Сообщение от Roof Посмотреть сообщение
Вопрос1: зачем нужны эти lparam и wparam? Как их использовать можно?
сам подумай зачем они нужны. когда мы отправляем какое-либо сообщение иногда надо же передавть какие-то данные. Например, WM_SETTEXT, по хотим задать текст окна, а какой текст? Для передачи самого текста используется lparam.

Цитата:
Сообщение от Roof Посмотреть сообщение
Вопрос2: чем отличаются SendMessage от PostMessage? И в каких случаях чем из них пользоваться??
отличие команды SendMessage от PostMessage в том, что SendMessage ожидает ответа от того окна, которому высылается сообщение. PostMessage не ждет ничего, функция возвращается сразу же.
rpy3uH вне форума Ответить с цитированием
Старый 08.12.2008, 16:34   #3
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 rpy3uH - почитал уже. Но вопросы не отпали, а появились. Их и задал. Втрой вопрос ты мне разъяснил очень хорошо. А вот с первым не ясно. lparam - я использовал, допустим. A wparam? в него тоже можно впихнуть любые данные взависимости от типа сообщения??
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 08.12.2008, 17:38   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

в каких-то сообщениях используется только lparam, в каких-то (когда не хватает одного параметра) и wparam и lparam (например, WM_CHAR)
rpy3uH вне форума Ответить с цитированием
Старый 08.12.2008, 21:36   #5
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 rpy3uH - огромное спасибо. теперьм немного понял.
еще вопрос - опиши, пожалуйста, пару примеров (кодом тоже) использования WM_USER - не могу понять, как его правильно использовать. Мне простые примеры нужны, дальше разберусь.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 08.12.2008, 21:45   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

некоторые говорят что сообщение WM_USER использовать не рекомендуется, а надо использовать сообщения больше чем WM_USER
создаём обработчик сообщения WM_USER+1, в обработчике выводим сумму lparam и wparam
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure MyProc(var Msg:TMessage); message WM_USER+1;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyProc(var Msg: TMessage);
begin
  showmessage('lparam+wparam=  '+IntToStr(Msg.WParam+Msg.LParam));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Handle,WM_USER+1,12,34)
end;

end.
для удобства можно объявить константу
WM_MyMESSAGE = WM_USER +1;
и её потом использовать

также про диапазоны сообщений написано здесь

Последний раз редактировалось rpy3uH; 08.12.2008 в 21:52.
rpy3uH вне форума Ответить с цитированием
Старый 08.12.2008, 22:04   #7
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

2 rpy3uH - в примере разобрался ссылку читаю спасибо.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Основы терминологии и часто используюемых слов в программировании Trojan-PSW.Win32 Свободное общение 6 28.01.2008 15:40
ADO основы... Roof БД в Delphi 14 10.12.2007 21:28
обновление в блоге - Справочник - Основы Delphi программирования Pblog Обсуждение статей 0 23.06.2007 17:20