Почему функция не корректно работает в графическом режиме?
|
|
ExE | Дата: Пятница, 20.05.2016, 18:39 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 21
Статус: Offline
| Прошу разъяснить мне ситуацию, ибо моих познаний в конкретном ЯП, да и программировании вообще, явно не хватает. Вот использую я в своих нескольких находящихся в разработке проектах одни и те же функции для работы с мышью, и решил собрать их все (и дополнить теми, которых не хватает) в одну небольшую библиотеку. Проблема возникла с процедурой WaitMouse(), которая должна приостанавливать программу до нажатия кнопки мыши. Проблем с ней не было, до тех пор, пока я не решил ее усовершенствовать, ведь изначально она давала ход программе только при нажатии левой кнопки мыши. Я решил расширить ее возможности, добавив отклик на остальные клавиши. Вот что было: А вот что стало: Собственно баг состоит вот в чем: Процедура приостанавливает программу как в консольном, так и в графическом режиме. Но! Откликается на клавиши мыши только в консольном. Объявление функций очевидно правильное, ибо компилятор ошибок не выдает. Поясните мне, неграмотному, глупому и недостойному рукожопу, что я написал не так?
Добавлено (20.05.2016, 18:39) --------------------------------------------- Как было:
Sub WaitMouse() Export Dim but As Byte Dim res As Integer Dim buttons As Integer Dim x As Integer Dim y As Integer Do res = GetMouse(x_1,y_1,,buttons) If buttons And 1 Then but = 1 Loop Until but = 1 but = 0 End Sub
Как стало:
Sub WaitMouse Alias "WaitMouse" (button As String) Export Dim but As Byte Dim res As Integer Dim buttons As Integer Dim x As Integer Dim y As Integer If button = "L" Or button = "R" Or button = "M" Or button = "A" Then Do res = GetMouse(x,y,,buttons) Select Case button Case "A" If buttons And 1 Then but = 1 If buttons And 2 Then but = 1 If buttons And 4 Then but = 1 Case "R" If buttons And 2 Then but = 1 Case "M" If buttons And 4 Then but = 1 Case "L" If buttons And 1 Then but = 1 End Select Loop Until but = 1 Else Print "Error, you must use 'R', 'L', 'M', or 'A' as argument in WaitMouse()" End If End Sub
Почему то спойлеры сработали как то странно. Может конечно я такой рукожоп.
Сообщение отредактировал ExE - Пятница, 20.05.2016, 18:41 |
|
| |
haav | Дата: Пятница, 20.05.2016, 19:27 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| попробуй так:
Код Screen 1
Sub WaitMouse Alias "WaitMouse" (button As String) Export Dim but As Byte Dim res As Integer Dim buttons As Integer Dim x As Integer Dim y As Integer If button = "L" Or button = "R" Or button = "M" Or button = "A" Then Do res = GetMouse(x,y,,buttons) If res = 0 Then ' если функция отработала нормально Select Case button Case "A" If buttons And 1 Then but = 1 If buttons And 2 Then but = 1 If buttons And 4 Then but = 1 Case "R" If buttons And 2 Then but = 1 Case "M" If buttons And 4 Then but = 1 Case "L" If buttons And 1 Then but = 1 End Select EndIf Loop Until but = 1 Else Print "Error, you must use 'R', 'L', 'M', or 'A' as argument in WaitMouse()" End If End Sub
WaitMouse("R") ? "OK" sleep
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ExE | Дата: Пятница, 20.05.2016, 20:17 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 21
Статус: Offline
| Цитата haav ( ) попробуй так: Попробовал, работает! Я вижу, баг разрешился с добавлением условия, что мышь находится внутри окна программы (т.е. выдает ноль, а не -1)? В таком случае, почему не работал мой код? Ведь программа должна постоянно обновлять данные с мыши, разве нет? А на значение -1 и вовсе не обращать внимания, и начинать цикл заново, или я что то не понимаю? Можешь пояснить?
|
|
| |
haav | Дата: Пятница, 20.05.2016, 21:25 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата ExE ( ) Попробовал, работает! Я вижу, баг разрешился с добавлением условия, что мышь находится внутри окна программы (т.е. выдает ноль, а не -1)? В таком случае, почему не работал мой код? Ведь программа должна постоянно обновлять данные с мыши, разве нет? А на значение -1 и вовсе не обращать внимания, и начинать цикл заново, или я что то не понимаю? Можешь пояснить?
Я понимаю твою логику: ты думаешь, что если ты передал в функцию параметр buttons, то после некорректного выполнения функции данный параметр не меняется и должен содержать ноль. Ну во первых параметр buttons передается по ссылке, то есть значение переменной buttons может изменяться в функции. А во вторых, GetMouse имеет свою определенную логику работы. Посмотри на ее внутренности:
Код int fb_GfxGetMouse(int *x, int *y, int *z, int *buttons, int *clip) { int failure = TRUE; int temp_z, temp_buttons, temp_clip;
FB_GRAPHICS_LOCK( );
if (!z) z = &temp_z; if (!buttons) buttons = &temp_buttons; if (!clip) clip = &temp_clip; if ((__fb_gfx) && (__fb_gfx->driver->get_mouse)) { DRIVER_LOCK(); failure = __fb_gfx->driver->get_mouse(x, y, z, buttons, clip); DRIVER_UNLOCK(); }
FB_GRAPHICS_UNLOCK( );
if (failure) { *x = *y = *z = *buttons = *clip = -1; return fb_ErrorSetNum(FB_RTERROR_ILLEGALFUNCTIONCALL); } return fb_ErrorSetNum( FB_RTERROR_OK ); }
Обрати внимание на строчки:
Код if (failure) { *x = *y = *z = *buttons = *clip = -1; return fb_ErrorSetNum(FB_RTERROR_ILLEGALFUNCTIONCALL); }
То есть , если ошибка в работе функции (неважно какая: системная или пользовательская) , то в buttons заносится -1 . Поэтому сравнения:
Код If buttons And 1 Then but = 1 If buttons And 2 Then but = 1 If buttons And 4 Then but = 1
будут всегда срабатывать, если мышка находится за пределами окна или вообще не подключена в системе или может еще что...
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
ExE | Дата: Пятница, 20.05.2016, 21:55 | Сообщение # 5 |
Сержант
Группа: Пользователи
Сообщений: 21
Статус: Offline
| Цитата haav ( ) Я понимаю твою логику: ты думаешь, что если ты передал в функцию параметр buttons, то после некорректного выполнения функции данный параметр не меняется и должен содержать ноль. Ну во первых параметр buttons передается по ссылке, то есть значение переменной buttons может изменяться в функции. А во вторых, GetMouse имеют свою определенную логику работы. Посмотри на ее внутренности: Честно говоря, во внутренностях я ничего не понимаю. Кроме того что мой мозг не способен с первого раза адекватно воспринять этот код, (я гуманитарий, и столько абстрактных символов для меня СЛОЖНА), так там еще и множество указателей, смысл которых даже из твоего гайда я не очень понял, а затем забил на них, до поры пока не пригодятся.
Я попытался поломать мозг над этим, почему да как, но то ли это на ночь глядя не думается, то ли я такой даун, но я решил просто принять пока на веру, что если функция выдает ошибку, то она выдает ИСТИНА всегда. Завтра попробую еще раз глянуть.
Лан, спасибо, сам бы никогда не догадался.
|
|
| |
n99_ru | Дата: Суббота, 18.06.2016, 23:05 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Мне не дало создать тему, напишу здесь.
Всем привет,
интересует работа с изображениями, самый простой, по возможности, способ (ВинАпи?)
Пытался "приручить" FbPng -
C:/FreeBasic/bin/win32/ld.exe: cannot find -lfbpng C:/FreeBasic/bin/win32/ld.exe: cannot find -lz
Пытался использовать Jpeg4FB -
undefined reference to `JPEG2SCREEN@12'
lz.a это часть MinGW, который я даже установить толком не смог..
Также, вопрос по выводу TTF шрифтов, кроме как способ приведенный на http://www.freebasic.net/forum/viewtopic.php?t=23343, существует ли нормальный способ это сделать? (в примере, ладно что inline asm, оно не понимает русского, и замена Times New Roman на название с добавлением Cyr не помогает).
Спасибо за ответы и ваше время.
Сообщение отредактировал n99_ru - Суббота, 18.06.2016, 23:06 |
|
| |
haav | Дата: Воскресенье, 19.06.2016, 07:09 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Привет n99_ru!
Цитата Мне не дало создать тему, напишу здесь.
Что значит не дало, другие же создают темы без проблем. Никаких ограничений на данное действие нет.
Цитата n99_ru ( ) C:/FreeBasic/bin/win32/ld.exe: cannot find -lfbpng C:/FreeBasic/bin/win32/ld.exe: cannot find -lz
Компилятор не находит библиотеки: 1) libz.a 2) libfbpng.a и связанные с ней другие библиотеки
Выход: положить в папку с исходным кодом данные библиотеки, либо положить в папку с компилятором в \lib\win32.
Самый лучший способ использовать библиотеку xfont
Чтобы не заморачиваться, скачай мою сборку. Распакую в любое место на жестком диске. Там все настроено и ты сможешь легко использовать fbpng, zlib и многие другие библиотеки. Так же сможешь использовать библиотеку xfont для работы со шрифтами. Даже если тебе не понравится сборка, просто посмотри как там все настроено в плане библиотек, проанализируй и сделай примерно так же у себя. Примеры xfont , zlib, fbpng и многие другие лежат в папке examples. Поначалу , пока не разобрался, запускай примеры в редакторе FbEdit , который идет в сборке. Сам редактор связан с компилятором , идущим так же в сборке, так что практически все примеры , интересующие тебя должны запуститься.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
n99_ru | Дата: Воскресенье, 19.06.2016, 10:39 | Сообщение # 8 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Большое спасибо!
Темы не дает создавать, потому что менее 3х сообщений написано.
Насчет .a файлов, понятно что их подложить было нужно, вопрос был где этих красавцев найти/скачать. :)
Примеры находил в штатной поставке, но что-то не задавалось. FbPNG/Jpeg качал с http://free-basic.ru/download.html
Еще раз - благодарность
|
|
| |
WQ | Дата: Воскресенье, 19.06.2016, 13:20 | Сообщение # 9 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Вот что плохо во Freebasic, так работа с изображениями не расписана для новичков, одни библиотеки есть в стандартном архиве, других нет, описания, что нужно использовать, нет. Для win - какие-то библиотеки есть, для linux - нет
Если только нужно загружать jpg, png, bmp, подойдет эта библиотека: http://www.freebasic.net/forum/viewtopic.php?f=14&t=24105
Не знаю, почему автор ее скомпилировл только как dll, я лично себе переделал как .a файл Прекрасно работает как под Win и linux, и размер самый маленький Добавили бы, что ли, в стандартный архив Еще можно пример посмотреть отсюда http://freebasic.ucoz.com/forum/18-314-1 DevIL вещь хорошая, но размер кода не радует, да и под linux завести не удалось
А так я себе собрал универсальную функцию для Win и linux, загружающую jpg, png, bmp, gif, tiff с нужной высотой и шириной, и пути с юникодом поддерживает. Чистый код после упаковки upx - 350кб, и большая часть - для чтения tiff Будет время - оформлю как нужно и выложу архив.
Сообщение отредактировал WQ - Воскресенье, 19.06.2016, 13:24 |
|
| |
n99_ru | Дата: Воскресенье, 19.06.2016, 15:26 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Вам тоже спасибо. FBImage оказался легкоюзабельным (легко-собирабельным).
Png, недалеко я так понял ушел от Bmp, и ничто не мешает его грузить вручную, разбирая заголовок.
Вопрос по нормальному выводу TrueType через тот же GDI (верно понимаю?) остается открытым.
Чтобы как белый человек, взять и использовать штатные Courier, Arial, Times из штатной поставки Windows.
Сообщение отредактировал n99_ru - Воскресенье, 19.06.2016, 15:33 |
|
| |
haav | Дата: Воскресенье, 19.06.2016, 15:30 | Сообщение # 11 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата n99_ru ( ) Темы не дает создавать, потому что менее 3х сообщений написано.
Раньше такого не было, видать юкоз обновлял движок и внес такую фичу. Сейчас исправил это, надеюсь впредь такого не случится.
Цитата n99_ru ( ) Насчет .a файлов, понятно что их подложить было нужно, вопрос был где этих красавцев найти/скачать
Так вроде все более-менее нормальные библиотеки я выкладывал на своем сайте. Если чего-то нет, может есть в моей сборке. Или искать по оф. сайтам, и компилировать (если конечно умеешь это делать)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Воскресенье, 19.06.2016, 15:32 | Сообщение # 12 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата n99_ru ( ) Чтобы как белый человек, взять и использовать штатные Courier, Arial, Times из штатной поставки Windows.
Ну так я предложил библиотеку xFont, чем не нравится?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
n99_ru | Дата: Воскресенье, 19.06.2016, 15:35 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Насколько я понял, XFont работает только со своим форматом шрифтов, XF.
|
|
| |
haav | Дата: Воскресенье, 19.06.2016, 15:40 | Сообщение # 14 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата n99_ru ( ) Насколько я понял, XFont работает только со своим форматом шрифтов, XF.
Ну да, но создает то она их из шрифтов системы. Я видно забыл положить в моей сборке конвертер... В общем скачай с моего сайта архив с данной либой, там есть утилита xfconv , ей как раз шрифты конвертируются в понятный для библиотеки формат.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Среда, 10.08.2016, 22:07 | Сообщение # 15 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: Offline
| Из имеющегося писать строки можно или средствами WinApi (по ссылке там с freebasic.net вполне нормальный пример) или, действительно, использовать XFont для заранее известных шрифтов, или использовать библиотеку FreeType на низком уровне ( примеры char.bas и drawstr.bas из стандартного архива папка с FreeBASIC\examples\graphics\FreeType ) или библиотеку Cairo (под win нужно несколько мегабайт dll) или использовать средства библиотек создания интерфейсов (хотя там обычно тоже все через FreeType )
У каждого метода свои достоинства и недостатки, зависит от задачи
Добавлено (10.08.2016, 22:07) --------------------------------------------- На счет библиотеки FBImage для загрузки картинок Здесь
http://www.freebasic.net/forum/viewtopic.php?f=14&t=24909
D.J.Peters обновил примеры к библиотеке TinyGL, и там в архиве (1 сообщение) теперь есть статическая версияFBImage для Win и Linux А архив в теме самой FBImage почему-то не обновил Я не проверял ее работу, т.к. у меня есть своя несколько измененная скомпилированная статическая библиотека
haav Не смотрел, а в твоей сборке она есть, статическая или динамическая? Если нет, то, возможно, стоит добавить в следующую сборку?
Сообщение отредактировал WQ - Среда, 10.08.2016, 22:14 |
|
| |
|