Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 16:

Форма

Windows message

Прежде всего, Message – это СТРУКТУРА, представляющая в .NET сообщения Windows, те самые, которые адресуются приложению и используются системой как средство уведомления выполняющихся в Windows приложений.

Эта структура используется также для формирования собственных сообщений, которые могут формироваться "в обход системы" и передаваться для последующей их обработки оконным процедурам приложений. Это стандартный интерфейс обмена информацией между приложениями. Важно, чтобы приложение "понимало" смысл происходящего.

Объект – представитель Message structure, может быть создан с использованием метода Create (создать – не означает отправить).

Список членов Message structure:

Члены Объявление
Свойство HWnd. Get, set. Дескриптор окна (window handle) public IntPtr HWnd(get; set;)
Свойство Msg. Get, set. ID сообщения public int Msg {get; set;}
Свойство WParam. Get, set. Поле WParam сообщения. Значение этого поля зависит от конкретного сообщения. Поле WParam обычно используется для фиксирования небольших фрагментов информации, например, значений флагов public IntPtr WParam {get; set;}
Свойство LParam property. Get, set. Поле LParam зависит от типа сообщения. Значением поля может быть ссылка на объект ( object ) public IntPtr Lparam {get; set;}
Свойство Result. Специфицирует значение, которое возвращает Windows после перехвата сообщения public IntPtr Result {get; set;}
Метод Create. Создает новое сообщение — представитель структуры Message
public static Message Create (
IntPtr hWnd,
int msg,
IntPtr wparam,
IntPtr lparam);
operator ==. Сравнивает два сообщения на предмет определения их идентичности
public static Boolean
operator ==(
Message left,
Message right);
operator !=. Сравнивает два сообщения на предмет определения их различия
public static Boolean
operator !=(
Message left,
Message righ);
Метод Equals. Сравнивает два сообщения для определения их эквивалентности
public override bool
Equals(object o)
Метод GetHashCode. Вычисляет hash код дескриптора (handle) сообщения
public override int
GetHashCode();

При этом IntPtr – это platform-specific тип, который используется для представления указателей или дескрипторов. Предназначен для представления целочисленных величин, размеры которых зависят от характеристик платформы ( is platform-specific ). То есть ожидается, что объект этого типа будет иметь размер 32 бита на 32-разрядных аппаратных средствах и операционных системах, и 64 бита — на аппаратных средствах на 64 бита и операционных системах.

Тип IntPtr может использоваться языками, которые поддерживают механизм указателей, и как общее средство для обращения к данным между языками, которые поддерживают и не поддерживают указатели.

Объект IntPtr может быть также использован для поддержки дескрипторов.

Например, объекты IntPtr используются в классе System.IO.FileStream для работы с дескрипторами файлов.

Существует еще один экзотический тип – UIntPtr, который, в отличие от IntPtr, не является CLS-compliant типом.

Только IntPtr -тип используется в common language runtime.

UIntPtr тип разработан в основном для поддержки архитектурной симметрии (to maintain architectural symmetry) с IntPtr -типом.

Примеры перехвата сообщений

В данном приложении очередь сообщений запускается без использования дополнительных классов. Выполняется в режиме отладки. Причина, по которой приложение не реагирует на сообщения системы при запуске в обычном режиме, в настоящее время мне не известна.

using System;
 using System.Windows.Forms;

 namespace MessageLoop01
 {
 // A message filter.
 public class MyMessageFilter : IMessageFilter 
 {
 long nMess = 0;
 public bool PreFilterMessage(ref Message m) 
 {
 nMess++;
 Console.WriteLine
 ("Processing the messages:{0}–{1}:{2}",m.Msg,nMess,Application.MessageLoop);
 return false;
 }
 }


 // Summary description for Class1.

 class Class1
 {

 // The main entry Point for the application.


 static void Main(string[] args)
 {
 Application.AddMessageFilter(new MyMessageFilter());
 Application.Run();
 }
 }
 }
Листинг 16.6.

В следующем примере объект – представитель класса Form связан с оконной процедурой, в рамках которой и запускается цикл обработки сообщений. Замечательное сочетание консольного приложения с окном формы.

using System;
 using System.Windows.Forms;

 namespace MessageLoop01
 {

 // A message filter.
 public class MyMessageFilter : IMessageFilter 
 {
 long nMess = 0;
 public bool PreFilterMessage(ref Message m) 
 {
 nMess++;
 Console.WriteLine
 ("Processing the messages:{0}–{1}:{2}>{3}", m.Msg,m.LParam,m.WParam,nMess);
 return false;
 }
 }

 class MyForm:Form
 {
 public MyForm()
 {

 if (Application.MessageLoop) Console.WriteLine("Yes!");
 else Console.WriteLine("No!");
 Application.AddMessageFilter(new MyMessageFilter());
 }
 }


 // Summary description for Class1.

 class Class1
 {

 // The main entry Point for the application.

 static void Main(string[] args)
 {
 if (Application.MessageLoop) Console.WriteLine("Yes!");
 else Console.WriteLine("No!");

 Application.Run(new MyForm());
 }
 }
 }
Листинг 16.7.
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2