FreeBasic
Главная
Вход
Регистрация
Воскресенье, 19.11.2017, 22:41Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 3 из 3«123
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Баги или ошибки библиотеки (Баги или ошибки библиотеки)
Баги или ошибки библиотеки
Billi_JoДата: Воскресенье, 15.01.2017, 20:00 | Сообщение # 31
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
WINAPI функции: TransparentBlt, AlphaBlend почему то так работают. Я это замечал и раньше, но так нифига с этим сделать ничего не получилось. Сейчас уже не помню, а если рисовать на изображении с последующей отрисовкой изображения на окне, такой же эффект? В любом случае , мне кажется лучше использовать раздел функций 2D_DrawA , там прозрачность вроде нормально реализована.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Billi_JoДата: Понедельник, 16.01.2017, 17:22 | Сообщение # 33
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: 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
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: 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
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: 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
Сержант
Группа: Пользователи
Сообщений: 37
Репутация: 0
Статус: Offline
Завелось, спасибо!
 
DarkDemonДата: Вторник, 31.01.2017, 09:54 | Сообщение # 40
Сержант
Группа: Друзья
Сообщений: 35
Репутация: 1
Статус: 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
Генерал-лейтенант
Группа: Администраторы
Сообщений: 793
Репутация: 34
Статус: Offline
Леха, извини, не видел этого сообщения почему-то. Если проблему не решил, скинь минимально возможный код без всяких лишних ресурсов и прочего.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Баги или ошибки библиотеки (Баги или ошибки библиотеки)
Страница 3 из 3«123
Поиск: