платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Предыдущая тема Следующая тема Перейти вниз

платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  electrik в Вс Июн 28, 2009 5:34 pm

Win32 API. урок 2. MessageBox

В этом Уроке мы создадим полнофункциональную Windows программу, которое выводит сообщение "Win32 FreeBasic is great!".

Теория:

Windows предоставляет огромное количество ресурсов Windows-программам через Windows API (Application programming Interface). Windows API - это большая коллекция
очень полезных функций, располагающихся непосредственно в операционной системе, готовые для использования программами. Эти функции находятся в нескольких
динамически подгружаемых библиотек (DLLs), таких как kernel32.dll, user32.dll и gdi32.dll. Kernel32.dll содержит API функции, взаимодействующие с памятью
и управляющие процессами. User32.dll контролирует пользовательский интерфейс. Gdi32.dll ответственен за графические операции. Кроме этих трех "основных", существуют также другие dll, которые вы можете использовать, при условии, что вы обладаете достаточным количеством информации о нужных API функциях.
Windows программы динамически подсоединяются к этим библиотекам, то есть код API функций не включается в исполняемый файл. Информация находится в библиотеках импорта.
Вы должны слинковать ваши программы с правильными библиотеками импорта, иначе они не смогут найти эти функции. Когда Windows программа загружается в память, Windows читает информацию, сохраненную в программе. Эта информация включает имена функций, которые программа использует и DLL-ей, в которых эти функции располагаются. Когда Windows находит подобную информацию в программе, она вызывает библиотеки и исправляет в программе вызовы этих функций, так что контроль
всегда будет передаваться по правильному адресу. Существует две категории API функций: одна для ANSI и другая для Unicode. На конце имен API функций для
ANSI стоит "A", например, MessageBox. В конце имен функций для Unicode находится "W". Windows 95 от природы поддерживает ANSI и Windows NT Unicode. Мы
обычно имеем дело с ANSI строками (массивы символов, оканчивающиеся NULL-ом. размер ANSI-символа - 1 байт. В то время как ANSI достаточна для европейских языков, она не поддерживает некоторые восточные языки, в которых есть несколько тысяч уникальных символов. Вот в этих случаях в дело вступает UniCode.
размер символа UNICODE - 2 байта, и поэтому может поддерживать 65536 уникальных символов. но по большей части, вы будете использовать include-файл, который может определить и выбрать подходящую для вашей платформы функцию. Просто обращайтесь к именам API функций без постфикса.
если вы хотите работать конкретно с юникодом, во FreeBasic нужно использовать следующий макрос:
#define unicode
также можно писать без постфиксов.

Большинство прототипов для WindowsAPI-функций содержатся в include-файлах, находящихся в директории
"FreeBasic/inc/win"
Файлы подключения имеют расширение .bi.
Связующий файл windowsApi "windows.bi", находиться в директории
"FreeBasic/inc"

пример:
#include "windows.bi"

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

Отметьте новую препроцессор команду "#include". После нее в кавычках следует имя файла, который вы хотите вставить в то место, где эта команда располагается. В примере выше, когда FreeBasic обрабатывает строку
#include "windows.bi"
он открывает windows.bi, находящийся в директории
"FreeBasic/inc"
и далее анализирует содержимое windows.bi
так, как будто вы "вклеили" подключаемый файл.

Теперь мы готовы создать окно с сообщением. функция, которая нам для этого необходима следующая:
function  MessageBox (byval as HWND, byval lрText as LPCSTR, byval lpCaption as LPCSTR, byval uType as UINT) as integer

первый параметр, hwnd - это хэндл родительского окна. Вы можете считать хэндл числом, представляющим окно, к которому вы обращаетесь. Его значение для вас не важно. Вы только должны знать, что оно представляет окно. Когда вы захотите сделать что-нибудь с окном, вы должны обратиться к нему, используя его хэндл.
второй параметр, lpText- это указатель на текст, который вы хотите отобразить в клиентской части окна сообщения. Указатель - это адрес чего-либо. Указатель на текстовую строку == адрес этой строки.
третий параметр, lpCaption- - это указатель на заголовок окна сообщения.
четвертый параметр, uType- устанавливает иконку, число и вид кнопок окна.

Давайте создадим msgbox.bas для отображения сообщения.
Код:

#include "windows.bi"
dim as zstring * 23 MsgBoxCaption = >"Iczelion Tutorial No.2"
dim as zstring * 26 MsgBoxText = >"Win32 FreeBasic is Great!"
MessageBox( NULL, MsgBoxText, MsgBoxCaption, MB_OK)

компилировать:
fbc -s gui msgbox.bas
ключь -s - указывает компилятору, какую подсистему мы используем. поскольку мы создаем win32 графическое(gui) приложение, после ключа -s, мы пишем gui.

также, этот пример можно переписать проще:

Код:

#include "windows.bi
MessageBox( NULL, "Win32 FreeBasic is Great!", "Iczelion Tutorial No.2", MB_OK)

еще один вариант. предположим мне влом объявлять переменную, и расчитывать ее длину, а один и тот-же текст дублировать не охото, да и зачем бинарник засорять. можно воспользоваться препроцессор командой #define.
Код:

#include "windows.bi"
#define MsgBoxCaption "Iczelion Tutorial No.2"
#define MsgBoxText "Win32 FreeBasic is Great!"

MessageBox( NULL, MsgBoxText, MsgBoxCaption, MB_OK)

[C] Iczelion, пер. Aquila.


Последний раз редактировалось: electrik (Вт Май 23, 2017 5:23 pm), всего редактировалось 2 раз(а)

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  Eric-S в Чт Июл 16, 2009 5:59 am

Вот сейчас читаю и фигею. Толи я так конкретно забыл freebasic, толи это глюк в тексте.
Код:

dim as zstring * 23 MsgBoxCaption = >"Iczelion Tutorial No.2"

Что означает запись:
>"text"
Я имею в виду знак, больше.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  tux в Чт Июл 16, 2009 7:28 pm

не ">" а "=>", ет такой оператор есть
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgZstring
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  Eric-S в Пт Июл 17, 2009 5:17 am

Спасибо! Вот ё-моё, оказываеться пропустил этот момент.
Я даже и не обращал раньше внимания на такую запись.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  Eric-S в Пн Июл 27, 2009 5:48 am

На счёт хэндла родительского окна.
Во всех случаях старайтесь его использовать.
Только в одном случае можно позволить себе вольность и написать NULL - тогда когда у вашей программы нет окна вообще.

А если у вас есть главное окно и вы создаёте дочернее или диалоговое окно, обязательно указывайте им хэндл родительского окна.

Поясню, почему.

    [li]окна могут взаимодействовать между собой. Особенно дочерние или модальные.[/li]
    [li]Взаимоействие двухстороннее. И родительское окно и дочернее обмениваються сообщениями. Можно управлять дочерним окном из родительского.[/li]
    [li]Взаимодействия пользователя с окном упрощаеться. В частности фокус перемещаемый с клавиатуры.[[/li]


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

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  Eric-S в Пн Июл 27, 2009 6:04 am

Теперь о юникоде.
Возможно это, в том числе и моя вина. Когда я путал людей с терминологией, сам не разобравшись.

Дело в том, что windows и соответственно WinAPI юникод не поддерживают!

Во freebasic есть тип wstring. Это строка содержащая расширенные символы.
Отчасти она похожа на формат utf-16le, но в том-то всё дело, что это именно другой формат.

И кстати не факт, что символ занимает 2 байта. Если это сурогатная пара, то она может занимать и 4 байта. Например кирилические буквы "ё" и "й" в некоторых случаях.

Причём, касательно wstring под linux отдельный разговор.
А все ноги ростут от типа WCHAR языка C. Так вот спецификация говорит о том, что он может быть любой, на усмотрение разработчика компилятора. От 1 байта и более!


Дальше Электрик пишет, что компилятор сам определяет, какие функции ему пользовать. Заканчивающиеся на "w" или "a".
Но это не совсем так. Нужно сделать однозначное указание макросом.

Код:

#define UNICODE
Именно этот макрос включает функции с расширенными символами.

И тут всё тоже хитро.

Если прога делаеться для win nt или для международных... То нужно включать. Заморочки могут быть с windows 9x.

А вот если вы делаете именно для windows 9x, причём локализованную прогу, то расширенные символы есть смысл выключить.

Функции windows nt, windows 2000, windows 2003, windows xp, получая ascii строку конвертируют её в расширенную и вызывают соответствующую функцию.

А windows 95, windows 98 и windows melenium, поступают наоборот. Они конвертируют расширенные символы в ascii. Причём если они пропадчены соответствующим образом.

А вот windows mobile вообще не поддерживает ascii функций. Они были логично выброшены, чтобы не захламлять и так убогие ресурсы.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  electrik в Чт Июл 30, 2009 8:21 pm

да, совершенно верно, сейчас потправлю по поводу #define unicode. просто я так подумал, что народ поймет.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 2 - MessageBox

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения