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 (вывода сообщений, диалог ввода пароля и пр.) . Конечно данный
подход программирования не самый удачный, поскольку лишает нас гибкости в
программировании. Однако данный метод дает возможность узнать о простейших
реализациях создания окон. Всего доброго!