Избавление от минусов написания программ на WinAPI или «Верните дискеты!»

Избавление минусов написания программ на WinAPI


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

Помните ли вы времена, когда компьютеры были большими, а мониторы маленькими? Не надо вздыхать, ностальгируя по тем временам, сейчас все исправим. Ну… Все, конечно вернуть я не смогу, но постараюсь вернуть одну крайне полезную вещь из того времени — дискету со 100-ми играми на борту.

Интересно? Читайте дальше!

Шаг первый — «спискота»
Итак, постараемся сначала понять, как же нам вернуть дискеты и системные требования, сравнимые со Спектрумом.

Вариант первый — разбить все компьютеры и достать из сырых подземелий Commodore и Atari.

Не слишком хороший вариант, но, в принципе, можно и его на заметку взять.

Вариант второй — попробовать писать на чистом WinAPI.

Если пользоваться блокнотом и MSDN, в принципе время выполнения приближается к времени выполнения первого варианта.

Что делать? Давайте сперва рассмотрим плюсы и минусы написания программ на чистом WinAPI.

+ Малый размер программ. Если даже писать на Lazarus`е (что как бы и должны делать честные обыватели вроде нас с вами), то размер такой программы при правильно настроенных флагах — 20 кб.
+ Огромное быстродействие по сравнению с VCL\MFC программами. Попробуйте при помощи VCL средств (Canvas.Pixels) обработать картинку 10 000 х 10 000, к примеру, заменив в ней красный цвет на зеленый. Или используйте Get\SetDibBits и обработайте её за пару секунд даже на втором «пне».
+ «Голая логика». Никакого создания лишних объектов в памяти, отладка (при грамотном подходе) занимает в разы меньше времени, чем при VCL, где объекты создаются\уничтожаются каждые пару секунд.

Много писанины. Да, код программы будет километра 2 в длину. Ведь даже на элементарное действие, которое заменяется одной командой в VCL (Application.Run, например) нужно будет написать около 50-ти строк кода, регистрируя, создавая, освобождая, следя, перемещая и одновременно с этим пытаясь уследить за логикой программы.
Никакой визуальности! А вы что хотели? Это вам не VCL\MFC это чистый API код. У него нет понятия «форма» или «кнопка». Там каждое бревно есть окно.

Что, уже расхотелось писать на ВыньАпи? Читаем дальше.

Шаг второй — «минус на минус дает плюс»
Что, если избавиться взять руку и положить её на монитор, закрыв минусы. Что вы видите? Нет, не жирные пятна на мониторе. Вы видите плюсы! А за такие плюсы можно и побороться. Итак, постараемся избавиться от минусов.

Вариант первый — APIx
Позволяет нам избавиться от второго минуса.
image
Интерфейс практически не отличается от Дельфийского.

НО… Но нажав на «посмотреть код» видим чистый код на Выне, что в принципе и хорошо и плохо одновременно. Хорошо тем, что скопировав в среду разработки (или указав путь к компилятору прямо в программе) мы получим чистый код на ВинАПИ, чего мы и добивались. А вот плохо это потому, что за разъяснением каждой функи придется бегать в MSDN, и дабы понять, что куда писать придется долго и долго курить мануалы и жевать горькие как ягоды калины летом сорцы.

Вариант второй — GRAY FUR
Позволяет нам избавиться от первого минуса
Что есть GRAY FUR? Это просто-напросто DLL, в которой экспортированы функции для быстрого и легкого создания программ. А в самой DLL эти функции держатся на основе WinAPI и внутренней собственной структуре.

begin
 CreateApplication;

CreateForm(FALSE, 'Form1');
 ResizeForm('Form1', 200, 100);
 MoveForm('Form1', 100, 100);
 ShowForm('Form1', TRUE);

SetFormFont('Form1', 'Small fonts', 9, $000000, TRUE);

CreateButton('Form1','Button1');
 SetButtonPos('Button1', 100, 30);
 SetButtonSize('Button1', 80, 30);
 SetButtonCaption('Button1', 'Just button');

CreateButtonImage('Button1', BTN_IMAGE_NORMAL);
 CreateButtonImage('Button1', BTN_IMAGE_HOVER);
 CreateButtonImage('Button1', BTN_IMAGE_PRESSED);
 CreateButtonImage('Button1', BTN_IMAGE_DISABLED);
 CreateButtonImage('Button1', BTN_IMAGE_SELECTIONMARK);

SetButtonProc('Button1', DestroyApplication);

BufferDraw('Form1');

CollectMessages;
end.

И совсем не страшно, верно?

Единственный минус такого подхода — это отсутствие визуализации, но постараюсь в скором времени избавиться от этого минуса.

Шаг третий — «литературная спискота»
Где все это искать:


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.