API и FreeBasic. #32770

Цикл статей , который я решил преподнести , будет направлен  на краткое ознакомление с API (интерфейс программирования приложений) .

Windows располагает превосходным и достаточно большим арсеналом для разработки программ (создание диалогов, звук, видео, графика, управление различными устройствами, и пр.). Этих средств чаще всего хватает, однако есть немало программистов, привыкших делать по принципу заметного отличия от принятых стандартов. В итоге переходят на "самопальные средства", которые дают более красивый интерфейс, но часто это делает программу слишком ресурсоемкой. Хотя кто сейчас думает о расходе памяти, имея мощные компьютеры? Я же предпочитаю в первую очередь малое потребление ресурсов компьютера, а потом уже красоту. Именно поэтому я люблю API и даже нестандартный интерфейс стараюсь делать средствами API.

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

  • создание структурированной переменной MSG
  • создание окна
  • обработка сообщений в цикле

Теперь код:

#INCLUDE "windows.bi"
'Создание структурированной переменной MSG
Dim msg As MSG
'Создание окна
CreateWindowEx(0,"#32770","Первое окно",WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,0,0)
'Обработка сообщений в цикле
While GetMessage(@msg,0,0,0)
    DispatchMessage(@msg)
    If msg.message=WM_COMMAND Then Exit While
Wend


Как видите создание простейшего окна состоит всего из 7 строчек. Поскольку мы работаем с API , нам по любому придется подключать стандартные библиотечные файлы Windows. Самый простой способ изложен в примере выше с помощью макроса #include "windows.bi". 

В итоге компилятору становится известно о функциях:

 CreateWindowEx - создание окна (ее параметры):

  • dwExStyle -  расширенный стиль окна
  • lpClassName -  указатель на строку с именем класса окна
  • lpWindowName -  указатель на строку с именем окна (отражается в заголовке)
  • dwStyle - стиль окна
  • X - расположение по оси Х в экранных координатах
  • Y - расположение по оси Y в экранных координатах
  • nWidth -  ширина окна  в экранных координатах
  • nHeight -  высота окна в экранных координатах
  • hWndParent -  хэндл родительского окна
  • hMenu  -  хэндл меню или идентификатор дочернего окна
  • hInstance - хэндл модуля
  • lpParam - указатель на данные создания окна (используется для MDI)

GetMessage - получение сообщения из очереди (ее параметры):

  • lpMsg -  указатель на структуру MSG
  • hWnd -  хендл окна чьи сообщения нужно обрабатывать
  • wMsgFilterMin - целочисленная величина самого маленького значения сообщения, которое будет извлечено
  • wMsgFilterMax -  целочисленная величина самого большого значения сообщения, которое будет извлечено

DispatchMessage - пересылка полученного сообщения в процедуру, которая управляет нашим окном. (ее параметр):

  • lpMsg -  указатель на структуру MSG

Так же известно о структуре MSG (поля структуры):

  • hwnd - хендл окна, которому послано сообщение
  • message - само сообщение
  • wParam - дополнительный параметр 1
  • lParam - дополнительный параметр 2
  • time  - время, в которое была произведена отправка сообщения
  • pt - позиция курсора в экранных координатах

и константах:

  • "#32770" - класс диалогового окна
  • WM_COMMAND  - отправляется тогда, когда пользователь выбирает командный пункт из меню, когда орган управления отправляет уведомительное сообщение своему родительскому окну, или когда транслируется нажатие клавиши - ускорителя
  • WS_VISIBLE и WS_OVERLAPPEDWINDOW - стили окна

Вы можете (более того я вам советую) поэкспериментировать с функцией CreateWindowEx , изменяя ее параметры, в соответствии со справочником по API. Если у вас его нет, советую скачать (можно с моего сайта) . Кроме функции CreateWindowEx есть меньший собрат для создания окна: CreateWindow. Их отличия только в наличии или отсутствии первого параметра dwExStyle. Функция возвращает хендл созданного окна, либо вернет FALSE при невозможности создать.
В цикле WHILE происходят итерации только до тех пор, пока GetMessage не вернет FALSE , либо не будет получено сообщение WM_COMMAND. Как только поступит сообщение , например пользователь нажмет на левую клавишу мыши, функция GetMessage его выловит, и заполнит структуру MSG. Далее функция DispatchMessage вытащит из структуры MSG сообщение с остальными нужными параметрами и передаст оконной процедуре. Если номер этого сообщения будет равен константе WM_COMMAND , то произойдет выход из цикла и как следствие - завершение программы. У нас в примере используется класс окон, за создание процедуры которой, отвечает сама система (именно поэтому наш код имеет небольшой размер). Некоторые сообщения в этой процедуре обрабатываются должным образом. Так например, у этого диалогового окна нельзя изменить цвет окна. В остальном вроде работает как обычное окно. Я часто видел в программах использование окон с классом #32770 (вывода сообщений, диалог ввода пароля и пр.) . Конечно данный подход программирования не самый удачный, поскольку лишает нас гибкости в программировании. Однако данный метод дает возможность узнать о простейших реализациях создания окон.  Всего доброго!

содержание | вперед