Баги или ошибки библиотеки
|
|
Billi_Jo | Дата: Воскресенье, 15.01.2017, 20:00 | Сообщение # 31 |
Сержант
Группа: Пользователи
Сообщений: 39
Статус: Offline
| Здравствуйте.
При рисовании BoxDraw() с прозрачностью и координатами, выходящими за границы окна рисования, прямоугольник не прорисовывается.
Код #Include "window9.bi"
dim as HWND hwnd=OpenWindow("",10,10,300,300)
WindowStartDraw(hwnd,0,0,300,300) BoxDraw(-30,-30,100,100,&h00ff00,&h00ff00,1) BoxDraw(20,20,100,100,&hff8000,&hff8000,1,,120) BoxDraw(130,30,200,50,&h0080ff,&h0080ff,1,,120) ' не прорисовывается StopDraw
Do var event=WaitEvent() If event=eventclose Then End Loop Добавлено (15.01.2017, 20:00) --------------------------------------------- Тот же эффект возникает если в параметрах ширина и высота BoxDraw() указать отрицательные числа и задать прозрачность.
|
|
| |
haav | Дата: Воскресенье, 15.01.2017, 21:34 | Сообщение # 32 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| WINAPI функции: TransparentBlt, AlphaBlend почему то так работают. Я это замечал и раньше, но так нифига с этим сделать ничего не получилось. Сейчас уже не помню, а если рисовать на изображении с последующей отрисовкой изображения на окне, такой же эффект? В любом случае , мне кажется лучше использовать раздел функций 2D_DrawA , там прозрачность вроде нормально реализована.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Billi_Jo | Дата: Понедельник, 16.01.2017, 17:22 | Сообщение # 33 |
Сержант
Группа: Пользователи
Сообщений: 39
Статус: Offline
| Значит, буду использовать 2D_DrawA. Спасибо.
Кстати, в BoxDrawA() тоже нельзя задавать отрицательные ширину и высоту. Мне это сейчас не нужно, но, может когда-нибудь пригодиться) Станислав, может, подумаете о такой возможности?Добавлено (16.01.2017, 17:22) --------------------------------------------- Процедуры MouseX, MouseY выдают верные координаты только при нажатии кнопок мыши. При перемещении курсора, они возвращают нули. Также, при вращении колеса прокрутки они возвращают экранные, а не оконные координаты.
Код #Include "window9.bi" #define TXT_ZOOM 100
dim shared as HWND hwnd dim shared as integer zoom,event hwnd=OpenWindow("",10,10,200,200) TextGadget(TXT_ZOOM,10,10,140,20,str(zoom))
do event = WaitEvent() select case event case eventclose exit do end select SetGadgetText(TXT_ZOOM,str(MouseX)&" : "&str(MouseY)) loop
|
|
| |
haav | Дата: Понедельник, 16.01.2017, 17:41 | Сообщение # 34 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата Billi_Jo ( ) Процедуры MouseX, MouseY выдают верные координаты только при нажатии кнопок мыши. При перемещении курсора, они возвращают нули. Также, при вращении колеса прокрутки они возвращают экранные, а не оконные координаты.
Получать значения MouseX, MouseY нужно в сообщении EventMouseMove
Код #Include "window9.bi" Dim As Integer hwnd hwnd=OpenWindow("",10,10,200,200)
Do Var event=WaitEvent Select Case event Case EventClose End Case EventMouseMove ? MouseX & " " & MouseY End Select Loop
Цитата Кстати, в BoxDrawA() тоже нельзя задавать отрицательные ширину и высоту. Мне это сейчас не нужно, но, может когда-нибудь пригодиться) Станислав, может, подумаете о такой возможности?
Функции GDI+ не поддерживают отрицательные значения , а городить ничего не хочется. Требуется это оооочень редко, а лишние проверки в функциях нафиг не нужны (и так GDI не блещет быстродействием) Реализовать это самому в своей программе вообще не проблема.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Billi_Jo | Дата: Понедельник, 16.01.2017, 18:11 | Сообщение # 35 |
Сержант
Группа: Пользователи
Сообщений: 39
Статус: Offline
| Цитата haav ( ) Получать значения MouseX, MouseY нужно в сообщении EventMouseMove Спасибо, буду знать.
А как получить верные координаты при вращении колеса прокрутки? Сейчас, я использую подстановки:
Код #define MouseWndX (GlobalMouseX-WindowX(hwnd)-x0) #define MouseWndY (GlobalMouseY-WindowY(hwnd)-y0) Вообще, хотелось бы, чтоб эти процедуры возвращали координаты курсора по-вызову, как GlobalMouseX, а не только при наступлении каких-то событий.
|
|
| |
haav | Дата: Понедельник, 16.01.2017, 18:36 | Сообщение # 36 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата Billi_Jo ( ) А как получить верные координаты при вращении колеса прокрутки? Сейчас, я использую подстановки: Код #define MouseWndX (GlobalMouseX-WindowX(hwnd)-x0) #define MouseWndY (GlobalMouseY-WindowY(hwnd)-y0)
Вообще, хотелось бы, чтоб эти процедуры возвращали координаты курсора по-вызову, как GlobalMouseX, а не только при наступлении каких-то событий.
Нормальный метод, я сам тоже таким пользуюсь. Главное, что это работает в любых случаях. Я сейчас уже не помню, но у MouseX, MouseY есть ограничения (вроде они не возвращают результат , если курсор находится над дочерними окнами). Изначально были только функции MouseX, MouseY , но потом я понял их ущербность и внес в библиотеку GlobalMouseX, GlobalMouseY , а функции MouseX, MouseY просто не стал удалять.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Billi_Jo | Дата: Пятница, 20.01.2017, 17:02 | Сообщение # 37 |
Сержант
Группа: Пользователи
Сообщений: 39
Статус: Offline
| Здравствуйте, Станислав. По вашему совету использую функции 2D_DrawA. Вот пример кода:
Код #Include "window9.bi"
dim as HWND hwnd dim as Integer event 'dim shared as pvoid font = CreateFontDrawA("Courier New",16,0,2) hwnd=OpenWindow("",10,10,200,200)
sub DrawTxt(wnd as HWND) dim as pvoid font = CreateFontDrawA("Courier New",16,0,2) WindowStartDrawA(wnd,0,0,200,200,1,&hff320000) TextDrawA("Текст",50,50,font,&ha000ff00,,0) StopDrawA end sub
DrawTxt(hwnd) do event = WaitEvent() Select Case event case EventLBDown DrawTxt(hwnd) case eventclose Exit Do End Select loop Я полагаю, что объявление:Код dim as pvoid font = CreateFontDrawA("Courier New",16,0,2) внутри процедуры снижает быстродействие программы (т.к. приходится каждый раз, при вызове процедуры, создавать шрифт). Но при попытке объявить переменную font как глобальную вылезают ошибки. Как быть?
|
|
| |
haav | Дата: Пятница, 20.01.2017, 19:51 | Сообщение # 38 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Код #Include "window9.bi"
dim as HWND hwnd dim as Integer event Dim shared as pvoid font font = CreateFontDrawA("Courier New",16,0,2) hwnd=OpenWindow("",10,10,200,200)
sub DrawTxt(wnd as HWND) WindowStartDrawA(wnd,0,0,200,200,1,&hff320000) TextDrawA("Текст",50,50,font,&ha000ff00,,0) StopDrawA end sub
DrawTxt(hwnd) do event = WaitEvent() Select Case event case EventLBDown DrawTxt(hwnd) case eventclose Exit Do End Select Loop
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Billi_Jo | Дата: Пятница, 20.01.2017, 21:02 | Сообщение # 39 |
Сержант
Группа: Пользователи
Сообщений: 39
Статус: Offline
| Завелось, спасибо!
|
|
| |
DarkDemon | Дата: Вторник, 31.01.2017, 09:54 | Сообщение # 40 |
Полковник
Группа: Друзья
Сообщений: 194
Статус: Offline
| У меня в моём проекте(1750 строк) возникала стрёмная ситуация. После вызова OpenFileRequester вывод в файл функциями FreeBasic переставал работать(там открывал файл на бинарный вывод). Т.е. грубо говоря я убирал OpenFileRequester(или не вызывал его в программе) и всё работало отлично, а с ним не работало, даже файл не создавался (хотя строки эти код проходил, я проверял через банальное PRINT "*" ). Ситуацию на маленькой программе воспроизвести не удалось.
Проблему. безусловно, решил, создав отдельную прогу с OpenFileRequester которая печатает в консоль имя файла, а в основной запустив отдельный поток(для перестраховки, хотя если даже прямо засовывать в поток OpenRequester - было тоже самое - баг) в котором открыл пайп, но это конечно дичь.
Можно как-то проверить код OpenFileRequester'а. Конечно допускаю баги в своей проге(писалось впопыхах, кстати уже вторая коммерч. прога на Window9, ), но даже не знаю что сказать, на это могла повлиять ещё какая-либо функция библиотеки(т.е. комплексный баг), есть подозрения на отрисовку 2DDraw. Вообще вся методология передиралась под чистую с отлично работающей пограммы, по которой уже писал мини статью тут.
Стас если надо, то не проблема код проги скинуть в личку, просто там не рефакторено(читать может тяжело будет, но основные моменты могу расписать).
Сообщение отредактировал DarkDemon - Вторник, 31.01.2017, 09:55 |
|
| |
haav | Дата: Среда, 08.02.2017, 13:56 | Сообщение # 41 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Леха, извини, не видел этого сообщения почему-то. Если проблему не решил, скинь минимально возможный код без всяких лишних ресурсов и прочего.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Uil | Дата: Суббота, 09.03.2019, 13:41 | Сообщение # 42 |
Рядовой
Группа: Пользователи
Сообщений: 11
Статус: Offline
| haav, когда разбирались с отладчиком, забыл сказать о следующем. При сборке Window9 новой версией fbc (1.06) в AESCRYPT.bas выдает ошибки на использование Chr$, Mid$ и Hex$. Оказывается, в 1.06 ввели следующее - The string type suffix "$" is forbidden in the -lang fb dialect.
|
|
| |
haav | Дата: Суббота, 09.03.2019, 18:34 | Сообщение # 43 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата Uil ( ) При сборке Window9 новой версией fbc (1.06) в AESCRYPT.bas выдает ошибки на использование Chr$, Mid$ и Hex$.
Я в своей локальной версии не нашел в файле AESCRYPT.bas команд с суффиксами. В реале я сейчас взял за основу код библиотеки от Joshy, чтобы была полная поддержка win64. Есть конечно ошибки, видать Джоши почти не тестировал, просто правил код , добиваясь совместимости с win64. У меня сейчас довольно тягомотная будет занятость. Надо не только тестировать каждую функцию , но и переписывать справку , чтобы корректно были описаны функции с учетом поддержки Linux. Месяца на 2-3 точно буду занят , может даже больше. Зато потом самому приятно станет работать в Linux со своей библиотекой. Надеюсь у меня все получится.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
serg266 | Дата: Воскресенье, 21.04.2019, 16:45 | Сообщение # 44 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Здравствуйте! Спасибо за window9, очень помогает "чайнику" (писал обычно только расчётные модули), не владеющему английским. Но столкнулся с такой проблемой. Не могу заставить корректно работать стандартный ScrollBar. При движении бегунка вниз/вправо всё нормально, а обратно начинает искажать. Как бы не успевает перерисовывать, т.к. если двигать медленно, то нормально. Увеличение задержки в SetTimer в принципе помогает при больших величинах, но тогда и передвижение идёт с явно видимыми задержками. Протестировал на примере из window9. Перед кнопкой "Hello" вставил из своей программы. "Глюк" сразу проявился.Код #Include "window9.bi" Dim Shared As HWND hw Dim As Integer ev Dim Shared As RECT rect hw=OpenWindow("",1300,10,300,240,WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_VSCROLL Or WS_HSCROLL): WindowColor(hw,&hff0000) GetClientRect(hw,@rect) ButtonGadget(3,100,100,200,200,"Hello")
ButtonGadget(75,5,5,190,20,"Íñòðîèòü îêíî/Ïðèíÿòü"): SetGadgetFont(75,CINT(LoadFont("arial",9,,1))) ButtonGadget(70,160,27,100,20,"Îòêðûòü", BS_DEFPUSHBUTTON Or BS_MULTILINE): SetGadgetFont(70,CINT(LoadFont("arial",10,,1))) ',BS_LEFT Or BS_BOTTOM) ButtonGadget(71,280,27,100,20,"Ñîõðàí.", BS_DEFPUSHBUTTON Or BS_MULTILINE): SetGadgetFont(71,CINT(LoadFont("arial",10,,1))) ',BS_LEFT Or BS_BOTTOM) ButtonGadget(72,400,27,100,20,"Ñîõð.êàê", BS_DEFPUSHBUTTON Or BS_MULTILINE): SetGadgetFont(72,CINT(LoadFont("arial",10,,1))) ',BS_LEFT Or BS_BOTTOM) ButtonGadget(73,520,27,100,20,"Ðàñ÷¸ò", BS_DEFPUSHBUTTON Or BS_MULTILINE): SetGadgetFont(73,CINT(LoadFont("arial",10,,1))) ',BS_LEFT Or BS_BOTTOM) ButtonGadget(74,640,27,100,20,"Âûõîä", BS_DEFPUSHBUTTON Or BS_MULTILINE): SetGadgetFont(74,CINT(LoadFont("arial",10,,1))) ',BS_LEFT Or BS_BOTTOM) TextGadget(63,760,10,90,17,"",SS_CENTER) '/ TextGadget(60,200,5,520,20,"ÑÈËÎÂÎÉ ÐÀÑ×¨Ò ØÀÐÎÂÎÃÎ ÊÐÀÍÀ Ñ ÏÐÎÁÊÎÉ Â ÎÏÎÐÀÕ",SS_CENTER)
SetScrollGadgetRange(hw,0,630,0):SetScrollGadgetRange(hw,0,470,1) SetScrollGadgetPage(hw,rect.right-rect.left,0) SetScrollGadgetPage(hw,rect.bottom-rect.top,1)
Sub size() Static As Integer width_scroll , height_scroll , sizewinX ,sizewinY GetClientRect(hw,@rect) If rect.right-rect.left<>sizewinX Then sizewinX=rect.right-rect.left If sizewinX<=GetScrollGadgetRange(hw,1,0) Then ShowScrollBar(hw,0,1) SetScrollGadgetPage(hw,sizewinX,0) Else ShowScrollBar(hw,0,0) EndIf EndIf If rect.bottom-rect.top<>sizewinY Then sizewinY=rect.bottom-rect.top If sizewinY<GetScrollGadgetRange(hw,1,1) Then ShowScrollBar(hw,1,1) SetScrollGadgetPage(hw,sizewinY,1) Else ShowScrollBar(hw,1,0) EndIf EndIf If width_scroll<>GetScrollGadgetPos(hw,0) Or height_scroll<>GetScrollGadgetPos(hw,1) Then width_scroll=GetScrollGadgetPos(hw,0):height_scroll=GetScrollGadgetPos(hw,1) ResizeGadget(3,100-width_scroll,100-height_scroll) ResizeGadget(75,5-width_scroll,5-height_scroll) ResizeGadget(63,760-width_scroll,10-height_scroll) ResizeGadget(60,200-width_scroll,5-height_scroll) ResizeGadget(70,160-width_scroll,27-height_scroll) ResizeGadget(71,280-width_scroll,27-height_scroll) ResizeGadget(72,400-width_scroll,27-height_scroll) ResizeGadget(73,520-width_scroll,27-height_scroll) ResizeGadget(74,640-width_scroll,27-height_scroll) EndIf End Sub SetTimer(hw,1,700,Cast(TIMERPROC,@size))
Do ev=WaitEvent Loop Until ev=EventClose
|
|
| |
haav | Дата: Воскресенье, 21.04.2019, 19:34 | Сообщение # 45 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Привет Serg266!
Я могу посоветовать добавить функцию INVALIDATERECT после изменения размеров в процедуре Size. Единственно только данная функция не кроссплатформенна , то есть только для Windows. Возможно на Linux с прорисовкой не будет проблем. Но если что, там тоже должна быть функция для обновления окна.
Примерно так:
Код ...... ...... ResizeGadget(72,400-width_scroll,27-height_scroll) ResizeGadget(73,520-width_scroll,27-height_scroll) ResizeGadget(74,640-width_scroll,27-height_scroll) invalidaterect(hw,0,true) EndIf End Sub ....... .......
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|