Четверг, 24.05.2018, 22:08
Приветствую Вас Гость

LabSoft

Меню сайта
Категории каталога
Статьи по кодингу [24]
Материалы по кодингу
КреатиFF [144]
Рассказы, истории, анекдоты...
Разное [8]
Советы, трюки, полезные рекомендации, статьи о новом и забытом старом...
Наш опрос
Какой язык программирования Вы используете?
Всего ответов: 40
Главная » Статьи » Статьи по кодингу

Прелести WinApi
Делать ночью нечего, поэтому попробую немного рассказать о программировании приложений на WinAPI (вы не знаете что такое WinAPI? тогда поищите на форуме или в интернете). Вы спросите, почему на WinAPI? Да потому что это самый лучший способ создать безглючное приложение (разве что глюки могут быть по вине криворукости программиста) и которое будет иметь минимальный размер (в десятки раз меньше чем если бы мы писали на VCL).
Кстати, предполагается что вы хотя бы знакомы с VCL Delphi хоть на каком-то уровне.
Особой целью задаваться не будем, напишем простейшее приложение, которое будет иметь окно и кнопку для закрытия.
Запускаем Delphi 7.0 (предпочитаю пользоваться именно этим компилятором), выбираем File > New > Application. Появилась VCL форма, нам она нафиг не нужна, идем в меню View > Project Manager, запустилось окно менеджера проекта. Кликаем на плюсик под Project1.exe, выделяем Unit1 и смело жмем на кнопку Remove, расположенную чуть выше на панели менеджера. Подтверждаем удаление, и закрываем менеджер проекта. Все исчезло? не страшно, идите в меню Project > View Source, покажется окно проекта, самый важный элемент проекта
В нем мы видим следующий код:
Code
program Project1;
     
uses
   Forms;
     
{$R *.res}
     
begin
   Application.Initialize;
   Application.Run;
end.

Вы видите подключенный модуль VCL - Forms, затем в операторных скобках begin end происходит инициализация приложения и запуск (если скомпилировать и запустить, то приложение почти сразу же закроется, так как никаких функций сейчас оно не выполняет).
Если вы попробуете скомпилировать данный проект сейчас (Project > Build Project1), вы получите файл размером чуть менее 400 кб (у меня 358 кб). Много? Очень много, скажу я вам, мы пришли сюда заниматься минимизацией и оптимизацией, а не ламерством страдать
Поэтому возвращаемся в окно проекта и удалаяем все пережитки VCL и добавляем модуль, где хранятся функции Windows API и модуль, где хранятся константы сообщений. В итоге у нас должно получиться следующее:
Code
program Project1;
     
uses
   Windows,Messages;
     
     
begin
     
end.

Скомпилируйте приложение. Вы получите exe-файл размером 14 кб. И хотя наше приложение ничего не делает, но вы почуствовали разницу между VCL и WinAPI? Если нет, идем дальше. Если да... все равно идем дальше
Теперь нам надо создать ресурс, в котором будут окно приложения и элементы, расположенные на нем. Я предпочитаю помещать визуальные элементы в ресурсы, а не создавать их динамически (это я на случай, если посыпятся вопросы профи), так как считаю этот вариант более стабильным (а с динамическим созданием контролов мы как нибудь познокомимся, может быть).
В общем, в папке где сохранен проект (а я надеюсь что проект сохранен, если нет, то бегом сохраняйте - кнопочка Save All, сохраняйте каждый свой проект в отдельной папке!!!), создаем файл dialog.rc и открываем его в блокноте.
Пишем в него следующее:
Code
MAIN_WINDOW DIALOG 86, 26, 192, 116
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Пример приложения на WinAPI"
LANGUAGE LANG_RUSSIAN, 0x1
FONT 8, "MS SHELL DLG"
{
   CONTROL "Программа демонстрирует простейшие возможности WinAPI", -1, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 10, 12, 172, 32   
   CONTROL "Закрыть", 100, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 126, 88, 60, 14   
}

Теперь нам надо преобразовать файл rc в файл ресурса RES. Это делается с помощью консольной утилиты brcc32.exe, входящей в пакет Delphi. Я препочитаю сразу класть в папку с проектом bat-файл для автоматического создания ресурсов. Для этого создайте в папке с проектом файл run.bat и впишите в него следующее:
Код:"D:\Program Files\Borland\Delphi7\bin\brcc32" dialog.rc

Соответсвенно поставьте тот путь к Delphi, по которому она у вас установлена. Сохраните bat-файл и запустите его. Если вы все сделали правильно, у вас в папке с проектом должен появится файл dialog.RES, если не появился - перечитайте все вышеизложенное и проверьте правильность указания путей и имен файлов. Если все равно не появляется - стучите мне в аську, пишите на форум, постараюсь помочь разобраться с проблемой.
Итак, файл ресурса создали, теперь его необходимо поместить в программу. Для этого впишем ресурс в код программы, в итоге у нас должно получиться:

Code
program Project1;
uses
   Windows,Messages;
     
{$R dialog.RES}//Подключаем ресурс диалогового окна
     
begin
     
end.

Компилируем, если компилятор не выдает ошибок, идем дальше (если выдает - перечитайте все вышеизложенное и проверьте правильность своих действий). Теперь необходимо инициализировать и запустить приложение, грубо говоря - написать функцию, которая достает оконные ресурсы из приложения и создает окно, которое может обрабатывать простейшие события операционной системы и действия пользователя
Сразу привожу листинг что у нас должно получиться:
Code
program Project1;
uses
   Windows,Messages;
     
{$R dialog.RES}//Подключаем ресурс диалогового окна
     
//Функция, обрабатывающая все команды от элементов управления окна
function DlgProc(hWin: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM): bool; stdcall;
begin
   Result := False;
   case uMsg of
   //Здесь мы инициализируем диалоговое окно и можем писать что должно произойти при запуске
   WM_INITDIALOG:; // ничего не указываем
   //Обработка получаемых команд от ОС или пользователя
   WM_COMMAND:
   begin
   case LoWord(wp) of
   //При нажатии на кнопку с идентификатором 100 закрываем программу
   100: EndDialog(hWin, 0);
   end;
   end;
   //При нажатии на кнопку "Х" в шапке программы закрываем приложение
   WM_DESTROY, WM_CLOSE: PostQuitMessage(0);
   end;
end;
     
begin   
   //Открываем диалоговое окно MAIN_WINDOW (достаем окно из ресурсов)
   DialogBox(hInstance, 'MAIN_WINDOW', 0, @DlgProc);
end.

В коде программы я написал комментарии, если что-то остается неясным, ищите информацию по WinAPI. Немного пробежимся по тексту программы и я расскажу что программа делает. Программа создает окно и при нажатии на кнопку "Закрыть", которое имеет идентификатор ID=100 (смотрите файл dialog.rc), закрывает диалоговое окно и посылает приложению команду WM_CLOSE, в обработчике которой мы пишем PostQuitMessage(0) - сигнал о завершении работы приложения.
На окне диалога помимо кнопки "Закрыть" я разместил еще текст в элементе STATIC (смотрите файл dialog.rc).
Компилируем программу и запускаем. Если вы все сделали правильно, то компилятор не должен ругаться и в папке проекта должен появиться файл Project1.exe, при запуске которого вы увидите окно программы:

Попробуйте нажать кнопку "Закрыть", приложение закроется (а вы что думали?)
Теперь посмотрим размер файла Project1.exe, у меня он весит 14848 байт (15 кб). А теперь сравните с тем файлом программы, который был вначале при использовании VCL (358 кб) - 358/14 ~ 26. Выигрыш в 26 раз! Программа стала весить на 96% меньше!
Если файл Project1.exe сжать каким-нибудь упаковщиком, например UPX, то программа и вовсе станет размером в 8 кб (у меня 8704 байт), выигрыш в 45 раз, программа стала весить на 98 % меньше, чем при использовании VCL. Вот такая арифметика. И это еще не предел (вопрос о том как сделать программу еще меньше в этой теме я рассматривать не буду).
Вы еще не поняли всех прелестей WinAPI? Тогда мы идем к вам!
Исходники прилагаю.

Автор: Voyager

Категория: Статьи по кодингу | Добавил: Jimmy (16.02.2008) | Автор: Voyager
Просмотров: 1518 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Друзья сайта
Статистика

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