FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 20:16Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Вопрос по GDI
Вопрос по GDI
ShadExДата: Понедельник, 02.09.2013, 23:36 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Можно ли как-то без ImageStartDraw и StopDraw считывать пиксели и рисовать сразу на двух и больше битмапах? Ну типа, как например -
Код

Dim Shared hbitmap_png As HBITMAP = Load_image(pngPath)
Dim Shared hbitmap_jpg As HBITMAP = Load_image(jpgPath)
Dim Shared hbmap_tmp As HBITMAP

' название функции GetDIB_array, SetPixelXY  и GetPixelXY придумано просто для примера
var hd_iarr_png = GetDIB_array(hbitmap_png)  
var hd_iarr_jpg  = GetDIB_array(hbitmap_jpg)
var pix_png = GetPixelXY(x, y, hbitmap_png)
SetPixelXY(pix_png, x, y,  hbitmap_jpg)
SAVE_image(hbitmap_jpg,"1.jpg")
Free_Image(hbitmap_png)
Free_Image(hbitmap_jpg)
 
haavДата: Вторник, 03.09.2013, 07:20 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (ShadEx)
Можно ли как-то без ImageStartDraw и StopDraw считывать пиксели и рисовать сразу на двух и больше битмапах? Ну типа, как например -


Если работа ведется с форматом BMP , то надо будет читать в массив напрямую по смещениям с помощью обычных функций работы с файлами. Отсюда хотя бы частичное изучение формата BMP. И далее для рисования так же вручную менять пиксели по массиву.
Если работа ведется с другими форматами, то еще "интереснее". Нужно будет распаковать сжатую информацию (вручную если знаешь эти форматы или с помощью соответствующих либ типа fbpng...) Далее для рисования так же вручную менять пиксели по массиву.

Тебе все еще интересен этот подход? biggrin

Есть другой вариант для быстрого доступа к пикселям, который ты как я понял отверг:

Код
#Include "window9.bi"

Dim As HBITMAP hbitmap, hbitmap1
Dim As UByte Ptr bmbits ' массив для пикселей

hbitmap=Create_Image(320,240) 'создаем 1 изображение
hbitmap1=Create_Image(320,240) 'создаем 2 изображение

' выделяем память под массив
bmbits = Allocate(320*240*4)

Var hdc = ImageStartDraw(hbitmap) 'начинаем рисование
   CircleDraw(150,100,50,255,255) ' рисуем круг
   'инициализируем структуру BITMAPINFO
   Dim As BITMAPINFO bi
   bi.bmiHeader.biSize = sizeof(bi.bmiHeader)
   bi.bmiHeader.biWidth = 320
   bi.bmiHeader.biHeight = -240
   bi.bmiHeader.biPlanes = 1
   bi.bmiHeader.biBitCount = 32
   bi.bmiHeader.biCompression = BI_RGB
   bi.bmiHeader.biSizeImage = 320*240*4
   ' получаем пиксели
   GetDIBits(hdc,hbitmap,0,240,bmbits,@bi,DIB_RGB_COLORS)
StopDraw ' заканчиваем рисование

' ///////////////
'  здесь проводим какую-либо работу с массивом пикселей
' ///////////////

hdc = ImageStartDraw(hbitmap1) 'начинаем рисование
   ' устанавливаем пиксели
   SetDIBits(hdc,hbitmap1,0,240,bmbits,@bi,DIB_RGB_COLORS)
StopDraw ' заканчиваем рисование

CenterWindow(OpenWindow("Draw",100,100,320,240)) ' создаем окно по ценру экрана
ImageGadget(1,0,0,320,240,hbitmap1) 'создаем гаджет и заносим туда изображение
Do : Loop until WaitEvent=EventClose
DeAllocate(bmbits)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Понедельник, 16.09.2013, 00:48 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
И снова здравствуйте...

Если покороче, то я уже не буду рассказывать, сколько нервов могут попортить те или иные глюки и несуразности при работе со связкой GDI+WinAPI...
И не буду просить дописать функционал выбора рисунка при отрисовке ( StartDraw(GetDC()) ), так как ты тоже видать с этой GDI уже намучился...
Тем более, если есть более вменяемые и более быстрые библиотеки для отрисовки - GD (со статической линковкой), FreeImage и IL.

Единственная просьба - добавь кроме функции Catch_Image так же и что-то типа Load_Mem_Image() и Save_Mem_Image() c указателем на байтовый буффер в первом параметре, так как я так и не смог передать простой байтовый буффер вместо массива @array(0), хотя "кастил" уже по всякому - похоже что макрос IncludeBinary какойто нестандартный байтовый буффер выдает... Да и такой код с Catch_Image() у меня выдает ошибку "Type mismatch, at parameter 1 of CATCH_IMAGE()" при любых "кастах" -
Код
Dim As Integer event

Includebinary("1.png",hgMem)
#print TypeOF(hgMem)
Var hgMem_ptr = @hgmem(0)
#print TypeOf(hgMem_ptr)

' чёрный пиксель в PNG (90 байт)
Dim as String str_buff_png = !"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44"
str_buff_png &= !"\x52\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00"
str_buff_png &= !"\x90\x77\x53\xDE\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00"
str_buff_png &= !"\x0E\xC3\x00\x00\x0E\xC3\x01\xC7\x6F\xA8\x64\x00\x00\x00"
str_buff_png &= !"\x0C\x49\x44\x41\x54\x08\xD7\x63\x60\x60\x60\x00\x00\x00\x04\x00"
str_buff_png &= !"\x01\x27\x34\x27\x0A\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"

Dim byte_buff_png As UByte Ptr = Cast(UByte Ptr, SAdd(str_buff_png))

'проверка - первые четыре байта заголовка изображения - "&x2030;PNG"
#print TypeOF(byte_buff_png)
? Chr(byte_buff_png[0],byte_buff_png[1],byte_buff_png[2],byte_buff_png[3]) '?PNG

Dim As HWND hwnd

hwnd=OpenWindow("",10,10,200,200) : CenterWindow(hwnd)
ImageGadget(1,50,30,170,170,Catch_Image(Cast(Any Ptr,byte_buff_png)) )

Do
  event=WaitEvent()
  If Event=EventClose Then End
Loop


даже такой вариант не катит -
Код
Catch_Image(Cast(Any Ptr,byte_buff_png))


поэтому я уже просто скопировал в исходниках код из файла "CatchImage.bas" поменяв "Function Catch_Image(array() As Any Ptr ," на "Function Catch_Image(buff as Ubyte Ptr ,"

И, пожалуйста - не делай функции с типами параметров HICON и HBITMAP перегруженными (overload), так как например, функция "AddTreeViewItem" как при загрузке иконки, так и при загрузке битмапа выдает на WinXP ошибку - "No matching overloaded function, ADDTREEVIEWITEM() in 'Var Pos_=AddTreeViewItem("...
А вот если скопировать код этих функций из исходника, убрать "Overload" и переименовать их, то тогда все нормуль...

Короче, ну его к лешему эту GDI+, лучше уж просто обрабатывать изображения другими библиотеками, а через window9 просто выводить в окно, хотя и в этом случае, например, функция SetImageGadget очень глюкавая порой...
 
haavДата: Понедельник, 16.09.2013, 09:05 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
Единственная просьба - добавь кроме функции Catch_Image так же и что-то типа Load_Mem_Image() и Save_Mem_Image() c указателем на байтовый буффер в первом параметре, так как я так и не смог передать простой байтовый буффер вместо массива @array(0), хотя "кастил" уже по всякому - похоже что макрос IncludeBinary какойто нестандартный байтовый буффер выдает... Да и такой код с Catch_Image() у меня выдает ошибку "Type mismatch, at parameter 1 of CATCH_IMAGE()" при любых "кастах" -


Изначально для Includebinary я брал один макрос, потом для каких-то функций он у меня не подходил (сейчас уже не помню...) . Я заменил его на другой, долго пыхался, чтобы прикрутить все это дело. Ну если короче, то попробуй заменить декларацию функции Catch_image(и в библиотеке и в хедере) на такую:

Код
Function Catch_Image(array() As Byte , color_ As COLORREF=&hf0f0f0) As HBITMAP Export


Цитата
И, пожалуйста - не делай функции с типами параметров HICON и HBITMAP перегруженными (overload), так как например, функция "AddTreeViewItem" как при загрузке иконки, так и при загрузке битмапа выдает на WinXP ошибку - "No matching overloaded function, ADDTREEVIEWITEM() in 'Var Pos_=AddTreeViewItem("...


Ты скорее всего миксовал передаваемые типы. А там либо функция работает с иконками , либо с битмапами. То есть такое неприемлемо:

AddTreeViewItem(4,"1-1",hicon, hbitmap,TVI_FIRST,Pos_)

Таких функций не мало и для всех их назначать новые имена (чтобы иметь возможность запихивать иконки) , мне показалось ужасной затеей. Так же как и добавлять дополнительно по две перегруженные функции для миксовки параметров. Боюсь здесь все останется как есть. Все не учтешь, но исходный код открыт, выдирай любую функцию и подстраивай под себя.

Вообще дела с новыми функциями очень плохи. Написать то их не проблема, но надо сделать хоть какое-то сносное описание в справке. А с недавнего времени это стало проблемой. Пока я писал в программе HelpnDoc все было терпимо, но она отказала перед последним релизом библиотеки и пришлось справку наполнять и собирать через одно место. Я написал автору программы, но он все валит на мелкософтовскую утилиту, которую использует для компиляции. Хотя я именно ей и собирал последнюю версию справки.

Недавно был хороший глюк и в программе turbosite, с помощью которой я наполняю свой сайт. Полетел весь проект из-за какой-то неведомой ошибки. Хорошо, что я иногда делаю копию проекта и мне удалось его воссоздать за пару часов. В ней новые страницы создавать удобно, но если бы не удалось возвратить к жизни проект, не знаю стал бы я в других редакторах обновлять\добавлять страницы сайта...

Цитата
Короче, ну его к лешему эту GDI+, лучше уж просто обрабатывать изображения другими библиотеками, а через window9 просто выводить в окно, хотя и в этом случае, например, функция SetImageGadget очень глюкавая порой...


Хозяин барин. SetImageGadget - по сути чистая WINAPI, что там может глючить? Хотя если ты берешь битмап из других графических либ, то тут нет 100% гарантии, что он совместим.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Среда, 02.10.2013, 23:25 | Сообщение # 5
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Цитата (haav)
то попробуй заменить декларацию функции Catch_image(и в библиотеке и в хедере) на такую:


Да уже так и менял, без IncludeBinary по другому ведь никак не загрузить битмап из памяти... Вобще, ИМХО IncludeBinary - чисто ПюреВасиковская фишка, а ФриВасик по идеологии ближе к Си и намного естественней было бы размещать бинарные инклуды в ресурсах, потому что в случае с IncludeBinary макрос просто дописывает все в конец экзешника, а на такие проги с нестандартным оверлеем антивирусы сразу "гавкают" при запуске...

Цитата (haav)
Ты скорее всего миксовал передаваемые типы. А там либо функция работает с иконками , либо с битмапами. То есть такое неприемлемо:


Ничего я не миксовал, такую ошибку выводит как раз при запуске твоего примера из справки:
Код

#Include "window9.bi"

Dim As Integer event
Dim As HWND hwnd,tree

hwnd=OpenWindow("TreeView",10,10,180,200) : CenterWindow(hwnd)
Dim As HBITMAP hbmp = Extract_Icon( "Shell32.DLL", 3 )'
Dim As HBITMAP hbmp1 = Extract_icon( "Shell32.DLL", 45 )'
tree=TreeViewGadget(4,10,10,140,140, TVS_HASLINES or TVS_HASBUTTONS or TVS_LINESATROOT,WS_EX_CLIENTEDGE,32)
Var Pos_=AddTreeViewItem(4,"1",hbmp,hbmp1,TVI_FIRST</FONT>)
AddTreeViewItem(4,"1-1",hbmp,hbmp1,TVI_FIRST,Pos_)
Pos_=AddTreeViewItem(4,"2",hbmp,hbmp1,Pos_)
AddTreeViewItem(4,"2-1",hbmp,hbmp1,TVI_FIRST,Pos_)

Do
  event=waitevent
  If event=EventClose Then end
Loop


Цитата (haav)
SetImageGadget - по сути чистая WINAPI, что там может глючить? Хотя если ты берешь битмап из других графических либ, то тут нет 100% гарантии, что он совместим.


Нет, изначально битмап как раз таки полностью загружается средствами WinAPI, но прикол в том, что судя по всему исходя из фазы луны на небе иногда он просто не рисуется после загрузки окна ни в основном цикле, ни в потоке, хотя саму переменную c типом HBITMAP я инициализировал и как Shared и как Common, и этот глюк очень часто происходит именно с ImageGadget, а вот с ButtonImageGadget все нормально...

и для уточнения - все примеры и тесты я запускал на winXP СП3, версия компилятора 0.25, версия библиотеки от 09-09-12. Естественно на семерке версии библиотек WinAPI и GDI другие, но пока же поддержка winXP еще ведь не закончилась...

По поводу создания и обновления самой справки - зачем тебе сдался этот визуальный HelpnDoc или другие аналоги? Сам формат CHM ведь достаточно прост и хорошо документирован и является просто набором HTML файлов, а для генерации содержания, компилирования и декомпилирования есть отличная утилита HTM2CHM (сайт автора уже недоступен, поэтому лучше её качать с ОСзоны - хттп://soft.oszone.net/program/2548/). То есть ты саму справку тоже можешь просто как статический сайт, создавать и редактировать в том же turbosite, а потом компилировать этой утилитой... Да и сам процес добавления новых страниц можно автоматизировать шаблонами и парсингом.

И по поводу содержания справки тоже 5 коп. хотелось бы вставить - если честно говоря, то у тебя справка слишком уж громадная по размеру вышла, в основном из-за дополнительних картинок, но они несут мало смыслового содержания и как я понял, больше для оформления, а вот хотя бы банального описания результатов и типа возврата из функций нет...
 
haavДата: Четверг, 03.10.2013, 07:53 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
Да уже так и менял, без IncludeBinary по другому ведь никак не загрузить битмап из памяти... Вобще, ИМХО IncludeBinary - чисто ПюреВасиковская фишка, а ФриВасик по идеологии ближе к Си и намного естественней было бы размещать бинарные инклуды в ресурсах, потому что в случае с IncludeBinary макрос просто дописывает все в конец экзешника, а на такие проги с нестандартным оверлеем антивирусы сразу "гавкают" при запуске...


Не знаю, у меня говновирей не стоит. А так попробовал через вирустотал. Только один неизвестный мне Bkav выявил че-то там.
Но раз ты говоришь, что при запуске гавкают, что же поверим.
Не хочешь данный макрос, в либе есть функции по загрузке из ресурсов.

Цитата
Нет, изначально битмап как раз таки полностью загружается средствами WinAPI, но прикол в том, что судя по всему исходя из фазы луны на небе иногда он просто не рисуется после загрузки окна ни в основном цикле, ни в потоке, хотя саму переменную c типом HBITMAP я инициализировал и как Shared и как Common, и этот глюк очень часто происходит именно с ImageGadget, а вот с ButtonImageGadget все нормально...


Тут трудно сказать... Пришли пример, если большой и не хочешь его расшаривать, то в личку. Не бойся не украду. Правда протестировать его на XP, я cмогу только на виртуалке.

Цитата
Ничего я не миксовал, такую ошибку выводит как раз при запуске твоего примера из справки:


Цитата
и для уточнения - все примеры и тесты я запускал на winXP СП3, версия компилятора 0.25, версия библиотеки от 09-09-12. Естественно на семерке версии библиотек WinAPI и GDI другие, но пока же поддержка winXP еще ведь не закончилась...


Обнови версию библиотеки, у меня на моей версии все работает нормально. Только лучше сам скомпилируй ее. Не знаю , что там изменили в компиле, но версия , скомпиленная на 0.25 уже не корректно работает на 0.9, возможно и наоборот тот же эффект.

Цитата (ShadEx)
а для генерации содержания, компилирования и декомпилирования есть отличная утилита HTM2CHM


У меня она есть. Ее недостаток: нет возможности сделать поиск по справке.

Цитата (ShadEx)
И по поводу содержания справки тоже 5 коп. хотелось бы вставить - если честно говоря, то у тебя справка слишком уж громадная по размеру вышла, в основном из-за дополнительних картинок, но они несут мало смыслового содержания и как я понял, больше для оформления


Ну тут как бы расчет был больше на иностранных пользователей. Если не поймут описания, то может картинка подскажет.

Цитата (ShadEx)
а вот хотя бы банального описания результатов и типа возврата из функций нет...


Тут я с тобой согласен на 100%. У меня редактор FbEDIT , он подсвечивает типы у функций. И мне вроде как нормально. Может другим так не кажется.
Плохо, что чухнулся я, когда уже страниц было немеренно и поленился тогда... А теперь, когда есть еще английский вариант справки, данная работа вообще убийственная. Но если надумаю, как ты себе видишь конечную работу по описанию, хотя бы на примере одной страницы?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Пятница, 04.10.2013, 01:42 | Сообщение # 7
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Цитата (haav)
Не хочешь данный макрос, в либе есть функции по загрузке из ресурсов.


Да я уже писал выше - мне нужно было читать/писать из памяти/в память, а не из ресурсов или "инклудного" буфера... Это я просто про IncludeBINARY размышлял в общем смысле...

Цитата (haav)
Пришли пример, если большой и не хочешь его расшаривать, то в личку. Не бойся не украду.


Да чего мне боятся - кради, сколько душе угодно biggrin
Только тут почемуто зип с исходником и картинкой не хочет заливаться - на файло-обменник скинул - http://rghost.ru/49131449
Так вот в этом коде при нажатии на кнопку "изменить фон" у меня не меняется картинка...
А вот если раскоментировать строку с ButtonImageGadget, то код уже корректно работает, и я бы даже может так и смирился с ButtonImageGadget, но согласись, что допол. бонусы в виде рамки и реагирования на нажатия у кнопки с картинкой ну совсем не к месту для использования в релизной версии приложения...

Цитата (haav)
Не знаю , что там изменили в компиле, но версия , скомпиленная на 0.25 уже не корректно работает на 0.9, возможно и наоборот тот же эффект.


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

Цитата (haav)
Ее недостаток: нет возможности сделать поиск по справке.


Лично мне очень редко когда нужен полнотекстовый поиск, в большинстве случаев хватает поиска по вкладке "Указатель" набирая первые несколько букв...

Цитата (haav)
как ты себе видишь конечную работу по описанию, хотя бы на примере одной страницы?


Ну, мне лично привычней всего читать описание функций в той же стандартной справке, поэтому можно взять за основу тот же шаблон:
http://rghost.ru/49131617
Просто поменять стили оформления...


Сообщение отредактировал ShadEx - Пятница, 04.10.2013, 01:56
 
haavДата: Пятница, 04.10.2013, 09:09 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (ShadEx)
Так вот в этом коде при нажатии на кнопку "изменить фон" у меня не меняется картинка...
А вот если раскоментировать строку с ButtonImageGadget, то код уже корректно работает, и я бы даже может так и смирился с ButtonImageGadget, но согласись, что допол. бонусы в виде рамки и реагирования на нажатия у кнопки с картинкой ну совсем не к месту для использования в релизной версии приложения...


Поменяй местами строчки:

Код
   SetImageGadget(1,hpng)  
    StopDraw


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Пятница, 04.10.2013, 21:08 | Сообщение # 9
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Цитата (haav)
Поменяй местами строчки:


А если мне нужно динамически подгружать в ImageGadget картинку? Например, вызывать SetImageGadget() после прорисовки каждых 10 пикселей?
Тут разве что в цикле со счетчиком при каждом проходе открывать и закрывать рисование по битмапу, но это глупо и более затратно по использованию процесорного времени...
 
haavДата: Суббота, 05.10.2013, 09:30 | Сообщение # 10
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (ShadEx)
А если мне нужно динамически подгружать в ImageGadget картинку? Например, вызывать SetImageGadget() после прорисовки каждых 10 пикселей?
Тут разве что в цикле со счетчиком при каждом проходе открывать и закрывать рисование по битмапу, но это глупо и более затратно по использованию процесорного времени...


Ну я же тебе написал выше пример с GetDIBits и SetDIBits. Данный метод работает раз в 15 быстрее , чем GetPix+PixDraw.
Более того, совсем необязательно каждый раз вызывать SetImageGadget. У системы уже есть указатель на данный битмап. В этом случае достаточно обновить окно так: InvalidateRect(GadgetID(1),0,0).
Но в любом случае получать и освобождать контекст придется.

То есть в твоем случае:

1) при загрузке получить указатель на массив пикселей с помощью GetDIBits и установить фото в гаджет.
2) далее примерно такой блок:

Код
var hdc=ImageStartDraw(hpng)

'''''''''''''
'работа с пикселями
'''''''''''''

' установка пикселей
SetDIBits

StopDraw
' обновление окна
InvalidateRect(GadgetID(1),0,0)


Быстрее способа с GDI я пока не знаю.

P.S. Кстати пока тестировал твой пример, вспомнил что была бага с определением координат гаджетов. Но ранее, когда я заметил эту багу, был занят другим, а сейчас переписал эти две функции. В реале, при включении этих функций в либу, я брал за основу функции антармана и это неправильно. Архивы обновил.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ShadExДата: Суббота, 05.10.2013, 19:00 | Сообщение # 11
Лейтенант
Группа: Проверенные
Сообщений: 51
Репутация: 1
Статус: Offline
Понятно, то есть обновлять ImageGadget можно только после закрытия контекста?
А почему тогда ButtonImageGadget можно и до закрытия? smile
За метод с InvalidateRect спасибо, попробую с ним обновлять...
 
haavДата: Суббота, 05.10.2013, 20:29 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата (ShadEx)
А почему тогда ButtonImageGadget можно и до закрытия?


Без понятия.


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