FreeBasic
Главная
Вход
Регистрация
Вторник, 15.10.2024, 09:55Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
  • 8
  • »
Баги или ошибки библиотеки
Billi_JoДата: Воскресенье, 15.01.2017, 20:00 | Сообщение # 31
Сержант
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: 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
Репутация: 49
Статус: Offline
WINAPI функции: TransparentBlt, AlphaBlend почему то так работают. Я это замечал и раньше, но так нифига с этим сделать ничего не получилось. Сейчас уже не помню, а если рисовать на изображении с последующей отрисовкой изображения на окне, такой же эффект? В любом случае , мне кажется лучше использовать раздел функций 2D_DrawA , там прозрачность вроде нормально реализована.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Billi_JoДата: Понедельник, 16.01.2017, 17:22 | Сообщение # 33
Сержант
Группа: Пользователи
Сообщений: 39
Репутация: 0
Статус: 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Завелось, спасибо!
 
DarkDemonДата: Вторник, 31.01.2017, 09:54 | Сообщение # 40
Полковник
Группа: Друзья
Сообщений: 194
Репутация: -2
Статус: Offline
У меня в моём проекте(1750 строк) возникала стрёмная ситуация. После вызова OpenFileRequester вывод в файл функциями
FreeBasic переставал работать(там открывал файл на бинарный вывод). Т.е. грубо говоря я убирал OpenFileRequester(или не
вызывал его в программе) и всё работало отлично, а с ним не работало, даже файл не создавался (хотя строки эти код
проходил, я проверял через банальное PRINT "*" ). Ситуацию на маленькой программе воспроизвести не удалось.

Проблему. безусловно, решил, создав отдельную прогу с OpenFileRequester которая печатает в консоль имя файла, а в
основной запустив отдельный поток(для перестраховки, хотя если даже прямо засовывать в поток OpenRequester - было
тоже самое - баг) в котором открыл пайп, но это конечно дичь.

Можно как-то проверить код OpenFileRequester'а. Конечно допускаю баги в своей проге(писалось впопыхах, кстати уже вторая
коммерч. прога на Window9, dollar ), но даже не знаю что сказать, на это могла повлиять ещё какая-либо функция
библиотеки(т.е. комплексный баг), есть подозрения на отрисовку 2DDraw.
Вообще вся методология передиралась под чистую с отлично работающей пограммы, по которой уже писал мини статью тут.

Стас если надо, то не проблема код проги скинуть в личку, просто там не рефакторено(читать может тяжело будет, но основные
моменты могу расписать).


Сообщение отредактировал DarkDemon - Вторник, 31.01.2017, 09:55
 
haavДата: Среда, 08.02.2017, 13:56 | Сообщение # 41
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Леха, извини, не видел этого сообщения почему-то. Если проблему не решил, скинь минимально возможный код без всяких лишних ресурсов и прочего.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
UilДата: Суббота, 09.03.2019, 13:41 | Сообщение # 42
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 2
Статус: 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
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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


  
Прикрепления: 8427612.jpg (311.2 Kb)
 
haavДата: Воскресенье, 21.04.2019, 19:34 | Сообщение # 45
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: 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
.......
.......


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 3 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
  • 8
  • »
Поиск: