Soft4Pc
Пятница, 10.05.2024, 13:08
Приветствую Вас Гость | RSS

Меню сайта


Adobe Photoshop [9]
Delphi [10]
Cisco [1]
Иностранные языки [1]
C# / C++ [0]

Интересные Ссылки

Последние статьи

Нестыковки "идеальной" игры
(Комментариев:0)


Критическая уязвимость в Adobe Reader
(Комментариев:5)


Советы по оптимизации Windows Vista
(Комментариев:2)


Десять причин, по которым Linux суждено одержать победу над Windows [Jack Wallen]
(Комментариев:0)


Десять непреложных законов безопасности
(Комментариев:0)


Два Windows на одном компьютере
(Комментариев:0)


Уменьшение времени загрузки программ в Windows
(Комментариев:0)


Наш опрос
Нужно ли менять дизайн сайта?
Всего ответов: 8

FAQ (вопрос/ответ)
Как качать с Ifolder.Ru
Как качать с Letitbit
Как качать с UPLOADBOX.COM
Как качать с uploadbox.ru
Как качать с Rapidshare.com

Праздники сегодня
Праздники сегодня

Главная » Статьи » Обучение » Delphi

Урок 2. Введение в низкоуровневое программирование в Delphi [Фрукт]

Событие, сообщение, ссылка

С понятием "событие" знаком каждый программист, использующий Delphi. Термин "сообщение" напрямую в концепции Delphi не используется.
Очень часто это синонимы одного и того же термина операционной системы, общающейся с приложениями (окнами) посредством посылки сигналов, называемых сообщениями.

Код, написанный в проекте Delphi как обработчик события OnCreate, выполняется при получении приложением сообщения WM_CREATE, сообщению WM_PAINT соответствует событие onPamt и т. д.
Такие события — аналоги сообщений операционной системы — используют мнемонику, сходную с мнемоникой сообщений, т. е. сообщения начинаются с префикса "WM_" (Windows Message), а аналогичные события начинаются с префикса "on".
Для того чтобы операционная система могла различать окна для осуществления диалога с ними, все окна при своем создании регистрируются в операционной системе и получают уникальный идентификатор, называемый "ссылка на окно". Тип этой величины в Delphi — HWND (Handle WiNDow) Синонимом термина "ссылка" является дескриптор.

Ссылка на окно может использоваться не только операционной системой, но и приложениями для идентификации окна, с которым необходимо производить манипуляции.

Можно проиллюстрировать смысл ссылки на окно на несложном примере.
Откомпилируйте минимальное приложение Delphi и начните новый проект. Форму назовите Form2, разместите на ней кнопку. Обработчик события нажатия кнопки OnClick приведите к следующему виду:


procedure. TForm2.ButtonlClick(Sender: TObject);
var
H : HWND; // ссылка на окно
begin
H := FindWindow ('TForml', 'Form1’);       // ищем окно 
If H <> 0 then ShowMessage ('Есть Forml!') // окно найдено
else ShowMessage ('Нет Forml!')   // окно не найдено
end;

Теперь при нажатии кнопки выдается сообщение, открыто ли окно класса, зарегистрированного в операционной системе как 'Tform1, имеющее заголовок 'Forml' Если одновременно запустить обе наши программы, то при нажатии кнопки будет выдано одно сообщение, а если окно с заголовком ‘Forml’ закрыть, то другое.
Здесь мы используем функцию Fmdwmdow, возвращающую величину типа HWND - ссылку на найденное окно либо ноль, если такое окно не найдено Аргументы функции -класс окна и его заголовок. Если заголовок искомого окна безразличен, вторым аргументом нужно задать mi
Итак, ссылка на окно однозначно определяет окно. Свойство Handle формы и есть эта ссылка, а тип THandie в точности соответствует типу HWND, так что в предыдущем примере переменную Н можно описать как переменную типа
THandle.

Рассмотрим подробнее некоторые выводы. Класс окна минимального приложения, созданного в Delphi, имеет значение 'Tform1', что полностью соответствует названию класса формы в проекте. Следовательно, то, как мы называем формы в проектах Delphi, имеет значение не только в период проектирования приложения, но и во время его работы. Начните новый проект, назовите форму каким-нибудь очень длинным именем и откомпилируйте проект. Сравните размер откомпилированного модуля с размером самого первого проекта, и убедитесь, что он увеличился — вырос только за счет длинного имени класса.
Также очень важно уяснить, что, если вы собираетесь распространять какие-либо приложения, необходимо взять за правило называть формы отлично от значения, задаваемого Delphi по умолчанию. Лучше, если эти названия будут связаны по смыслу с работой вашего приложения.

Имея ссылку на окно, операционная система общается с ним путем посылки сообщений — сигналов о том, что произошло какое-либо событие, имеющее отношение именно к данному окну. Если окно имеет намерение отреагировать на событие, операционная система совместно с окном осуществляет эту реакцию.
Окно может и, не имея фокус, получать сообщения и реагировать на них. Проиллюстрируем это на примере.
Обработчик события OnMouseMove формы приведите к следующему виду:

procedure TForm2.FormMouseMove(Sender: T0b3ect; Shift: TShiftState; X,
Y: Integer); 
begin Caption : = 'x=' + IntToStr (X) + ', y=' + IntToStr (Y) // X, Y -
// координаты курсора 
end;

При движении курсора мыши в заголовке формы выводятся его координаты.
Запустите два экземпляра программы и обратите внимание, что окно, не имеющее фокус, т. е. неактивное, тоже реагирует на перемещение указателя по своей поверхности и выводит в заголовке текущие координаты курсора в своей системе координат.
Имея ссылку на окно, приложение может производить с ним любые (почти) действия путем посылки ему сообщений.
Изменим код обработки щелчка кнопки 

procedure TForm2.ButtonlClick(Sender: TObject); 
var
H: HWND; 
begin
H := FindWindow ('TForml', 'Forml');
If H <> 0 then SendMessage (H, WM_CLOSE, 0, 0)//закрыть найденное окно 
end;

Если имеется окно класса 'TForm1' с заголовком 'Form1', наше приложение посылает ему сообщение WM_CLOSE — пытается закрыть окно. Для посылки сообщения используем функцию операционной системы (функцию API) SendMessage. Функция PostMessage имеет сходное назначение, но отличается тем, что не дожидается, пока посланное сообщение будет отработано. У этих функций четыре аргумента — ссылка на окно, которому посылаем сообщение, константа, соответствующая посылаемому сообщению, и два параметра сообщения, смысл которых определяется в каждом конкретном сообщении по-своему. Параметры сообщения называются wParam и lParam. При обработке сообщения WM_CLOSE эти значения никак не используются, поэтому здесь их можно задавать произвольно.

Одновременно могут быть зарегистрированы несколько окон класса 'TForm1', и необходимо закрыть их все. Пока наше приложение закрывает окна поодиночке при каждом нажатии на кнопку. Автоматизировать процесс можно разными способами, простейший из них заключается в том, что вызов FindWindow заключен в цикл, работающий до тех пор, пока значение переменной Н не станет равным нулю:

procedure TForm2.ButtonlClick(Sender: TObject); 
var
H : HWND; 
begin
Repeat
H := FindWindow ('TFormi', 'Forml'); 
If H <> 0 then SendMessage (H, WM_CLOSE, 0, 0) 
Until H = 0; 
end;

Для работы с приложениями, класс окна которых не известен, служит утилита Ws32, поставляемая с Delphi.


Вывод с использованием функций GDI

Если необходимо нарисовать что-либо на поверхности чужого окна, первым делом нужно получить ссылку на него.
Для начала попробуем рисовать на поверхности родного окна.
Разместите еще одну кнопку, обработку щелчка которой приведите к следующему виду:


procedure TForm2.Button2Click(Sender: TObject);
var
dc : HDC; // ссылка на контекст устройства
begin
dc := GetDC (Handle); // задаем значение ссылки
Rectangle (dc, 10, 10, 110, 110); // рисуем прямоугольник
ReleaseDC (Handle, dc);  // освобождение ссылки
DeleteDC (dc);          // удаление ссылки, освобождение памяти
end;


При запуске приложения после щелчка на добавленной кнопке на поверхности окна рисуется квадрат.
Для рисования в этом примере используем низкоуровневые функции вывода Windows, так называемые функции GDI (Graphic Device Interface, интерфейс графического устройства). Эти функции требуют в качестве одного из своих аргументов ссылку на контекст устройства.

Тип такой величины — HDC (Handle Device Context, ссылка на контекст устройства), значение ее можно получить вызовом функции API GetDC с аргументом-ссылкой на устройство вывода. В нашем примере в качестве аргумента указана ссылка на окно.
После получения ссылки на контекст устройства обращаемся собственно к функции, строящей прямоугольник. Первым аргументом этой функции является ссылка на контекст устройства.
После использования ссылки ее необходимо освободить, а в конце работы приложения — удалить для освобождения памяти.
Поставленная "клякса" будет оставаться на окне формы при изменении размеров окна и исчезнет только при его перерисовке, для чего можно, например, минимизировать окно формы, а затем вновь его развернуть. Исчезновение квадрата после такой операции объясняется тем, что за перерисовку окна отвечает его собственный обработчик. Теперь можно порисовать на поверхности чужого окна, для чего изменим только что написанный код:

procedure TForm2.Button2Click(Sender:   TObject); 
var
dc:   HOC; 
Window:   HWND; 
begin
Window   :=  FindWindow   ('TForml',    'Forml');
If Window <>  0  then begin //  окно найдено
 dc   := GetDC   (Window); //  ссылка на  найденное  окно
Rectangle   (dc,   10,   10,   110,   110);             // квадрат на чужом окне
ReleaseDC   (Window,   dc);                                     //  освобождение  ссылки
DeleteDC   (dc);                                                       // удаление ссылки
end;
end;

Теперь при щелчке на кнопке, если в системе зарегистрировано хотя бы одно окно класса ‘TForm1’ с заголовком ‘Form1’, вывод (рисование квадрата) будет осуществляться на него.
При щелчке на кнопке квадрат рисуется на поверхности чужого окна.
Заметим, что если закрыть Project1.exe и загрузить в Delphi соответствующий ему проект, то при щелчке на кнопке прямоугольник будет рисоваться на поверхности окна формы, что будет выглядеть необычно
Этот эксперимент показывает, что окна, создаваемые Delphi во время проектирования, такие же равноправные окна, как и любые другие, т.е. они регистрируются в операционной системе, идентифицируются, и любое приложение может иметь к ним доступ. Если попытаться минимизировать окно класса 'TForm1', окно формы будет отрабатывать эту команду точно так же, как полученную от пользователя.
Окно со значением ссылки, равным нулю, соответствует окну рабочего стола.
Во всех примерах этого раздела для вывода мы использовали функции GDI потому, что если для вывода на родном окне Delphi и предоставляет удобное средство — методы свойства формы canvas, то для вывода на чужом окне мы этими методами воспользоваться не сможем в принципе.
Разберем основные детали вывода с помощью функций GDI. В проекте из подкаталога Ех12 оконная функция минимальной программы дополнилась обработкой сообщения WM_PAINT. Вывод заключен между строками с вызовом функций BegmPamt и EndPamt, первая из которых возвращает ссылку на контекст устройства, т. е. величину типа нос, требуемую для функций вывода GDI. Еще раз повторю, что после использования ссылки ее необходимо освободить и удалить по окончании работы — это необходимо для корректной работы приложения.

DLL

Файлы DLL (Dynamic Link Library, библиотека динамической компоновки) являются основой программной архитектуры Windows и отличаются от исполняемых файлов фактически только заголовком.
Но это не означает, что если переименовать DLL-файл, то он станет исполняемым: имеется в виду заголовочная информация файла.
Для загрузки операционной системы необходимо запустить файл win.com, имеющий размер всего 25 Кбайт. Как легко догадаться, в файл такого размера невозможно поместить код, реализующий всю ту гигантскую работу, которая производится по ходу выполнения любого приложения. Этот файл является загрузчиком ядра операционной системы, физически размещенным в нескольких DLL-файлах.

Помимо кода, DLL-файлы могут хранить данные и ресурсы. Например, при изменении значка (ярлыка) пользователю предлагается на выбор набор значков из файла SHELL32.DLL.
Для создания любой программы Windows, имеющей собственное окно, в проекте необходимо подключать как минимум два модуля: windows и Messages. Первый из этих файлов содержит прототипы функций API и GDI. Посмотрим на прототип одной из них:
function CreateDC; external gdi32 name 'CreateDCA';
Здесь величина gdi32 — константа, описанная в этом же модуле:
const
gdi32  =   'gdi32.dll';

Таким образом, функция CreateDC физически размещена в файле gdi32.dll и каждое приложение, использующее функции GDI, обращается к этой библиотеке.

Приблизительно так же выглядят прототипы остальных функций и процедур, но указываемые в прототипе имена библиотек индивидуальны для каждой из них.
Использование DLL, в частности, позволяет операционной системе экономить память.
Приложение не умеет ни создавать окно, ни выводить в него информацию и не содержит кода для этих действий. Все запущенные приложения (клиенты) передают соответствующие команды файлу gdi32.dll (серверу), который отрабатывает их, осуществляя вывод на устройство, ссылку на контекст которого передается в качестве первого аргумента функции. При этом клиентов обслуживает единственная копия сервера в памяти.
Помимо важности DLL как основы программной архитектуры операционной системы, представление о динамических библиотеках необходимо иметь каждому разработчику программных систем. Многие программные системы строятся по следующему принципу: основной код и данные размещаются в динамических библиотеках, а исполняемому файлу отводится роль загрузчика.
Библиотека OpenGL физически также размещена в виде двух DLL-файлов: opengl23.dll и glu32.dll. Первый из этих файлов и есть собственно библиотека OpenGL. Назначение его — осуществление взаимодействия с акселератором или программная эмуляция ускорителя за счет центрального процессора Поддержка 3D-акселерации осуществляется с помощью полного (устанавливаемого) клиентского драйвера (Installable Client Driver, ICD) и мини-драйвера (Mini-Client Driver, MCD).
Библиотека OpenGL реализована по клиент-серверной схеме, т. е. ее одновременно может использовать несколько приложений при единственной копии сервера в памяти или вообще при удаленном расположении сервера (сервер в принципе может располагаться и не на компьютере клиента).
Для просмотра списка функций и процедур, размещенных в конкретном файле DLL  можно воспользоваться либо утилитой быстрого просмотра, поставляемой в составе операционной системы, либо утилитой tdump.exe, поставляемой в составе Delphi.
Для вызова утилиты быстрого просмотра установите курсор мыши на значок нужного файла и нажмите правую кнопку. В появившемся меню должен присутствовать пункт "Быстрый просмотр", если этого пункта нет, то требуется установить компонент операционной системы "Быстрый просмотр".


Контекст устройства и контекст воспроизведения

Мы уже знаем, что ссылка на контекст устройства — это величина типа HDC. Для ее получения можно вызвать функцию GetDC, аргументом которой является ссылка на нужное окно.
Ссылке на контекст устройства соответствует свойство Canvas.Handle формы, принтера и некоторых компонентов Delphi.
Например, строки программы


Forml.Canvas.Ellipse (0, 0, 100, 100); И
Printer.BeginDoc ;
Printer.Canvas.Ellipse (0, 0, 100, 100);
Printer.EndDoc;

рисуют один и тот же круг, как на поверхности формы, так и в распечатываемом документе, т. е. на различных устройствах, причем если мы будем выводить разноцветную картинку на монохромный принтер, он справится с этой задачей, передавая цвета оттенками серого.
Такие вопросы приложение перекладывает на плечи операционной системы, решающей их посредством использования драйверов устройств.
Для того чтобы воспользоваться функциями воспроизведения Windows, приложению необходимо только указать ссылку на контекст устройства, содержащий средства и характеристики устройства вывода.
Справочный файл Win32 Programmer's Reference фирмы Microsoft, поставляемый в составе Delphi, о контексте устройства сообщает следующее:
"Контекст устройства является структурой, которая определяет комплект графических объектов и связанных с ними атрибутов и графические режимы, влияющие на вывод. Графический объект включает в себя карандаш для изображения линии, кисть для закраски и заполнения, растр для копирования или прокрутки частей экрана, палитру для определения комплекта доступных цветов, области для отсечения и других операций, маршрут для операций рисования".
В OpenGL имеется аналогичное ссылке на контекст устройства понятие ссылка на контекст воспроизведения.
Графическая система OpenGL, как и любое другое приложение Windows (хоть и размещенное в DLL), также нуждается в ссылке на устройство, на которое будет осуществляться вывод. Это специальная ссылка на контекст воспроизведения — величина типа HGLRC (Handle OpenGL Rendering Context, ссылка на контекст воспроизведения OpenGL).
В частности, упомянутые контексты являются хранилищами состояния системы, например, хранят информацию о текущем цвете карандаша.
Категория: Delphi | Добавил: LimansK (09.09.2009)
Просмотров: 4757 | Комментарии: 3 | Рейтинг: 0.0/0 |
Всего комментариев: 3
3 Спешу поделиться хорошей новостью!  
0
Здравствуйте! :)
Вы слышали про новую социальную сеть, которая называется - ГДЕ И ВСЕ?
Это инновационная сеть! Зарегистрируйся и получай деньги на карту! 120 тыс. за месяц, далеко не предел. Все участники объеденины в в громадную единую сеть и безвозмездно помогают друг-другу.
Я не зазываю Вас, но это супер проект, если вас заинтересовало, и хотите стать финансово независимыми, то ознакомьтесь пожалуйста подробнее - http://www.gdeiwse.ru

2 Пошли своего начальника  
0
Привет!
Вы уже тут или работаете на своего босса? Пока еще есть такой шанс, станьте финансово независимыми!
Я не заставляю, но если вам интересно, то ознакомьтесь подробнее пока еще дается такая возможность - http://youmyprofi.ru/5/index.html

1 Wrenililurora  
0
ОДНОКЛАССНИКИ ЗНАКОМСТВА

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Логин:
Пароль:

Реклама
Заработок на сайте uCoz

Web-IP.ru - Система Активной Рекламы

Контекстная Реклама на Link.ru

WMmail.ru - сервис почтовых рассылок



Graffiti Decorations(R) Studio (TM) Site Promoter

Первая бесплатная система раскрутки сайта

Последние файлы

Hamachi 2.0.1.66
(Комментариев:48)
(Загрузок:357)


Генератор Календарей 2.27
(Комментариев:3)
(Загрузок:288)


Desktop Icon Toy 4.0
(Комментариев:1)
(Загрузок:288)


Vista Codec Package 5.4.6
(Комментариев:1)
(Загрузок:260)


SnagIt_9.0.1.122_Rus
(Комментариев:1)
(Загрузок:350)


CleanCenter v.2.4.1.1
(Комментариев:1)
(Загрузок:1)


Arachnophilia 5.4.2382
(Комментариев:0)
(Загрузок:270)


GameGain 2 2.10
(Комментариев:0)
(Загрузок:281)


CDBurnerXP 4.2.6
(Комментариев:1)
(Загрузок:352)


EVEREST Ultimate Edition 5.30 Build 1900
(Комментариев:1)
(Загрузок:291)


Поиск по Сайту

Друзья сайта
  • Destination.ucoz.net

  • N.S.P. WMmail.ru - сервис почтовых рассылок
    hackersoft - ჰაკერული პროგრამები Этот сайт защищен «Site Guard»
         Обмен Ссылками

    Статистика
    Rambler's Top100
    CY and PR
    webgari.com Рейтинг сайтов
    Besucherzahler russian mail order brides
    счетчик посещений

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Зарег. на сайте
    Всего: 25126
    Новых за месяц: 7
    Новых за неделю: 1
    Новых вчера: 0
    Новых сегодня: 0
    Из них
    Администраторов: 1
    Модераторов: 2
    Проверенных: 1
    Обычных юзеров: 25122

    Сегодня нас посетили :

    Soft4PC.3dn.ru © 2024
                                                     Все материалы размещенные на сайте пренадлежат их владельцам и предоставляются исключительно в ознакомительных целях. 
                                                    Администрация этого сайта не несет ответственность за использование материалов,ссылок и информации находящихся на этом сайте. 
                                                           !!! Все авторские права принадлежат только настоящим владельцам всех файлов которые публикуются на этом сайте!!!