FreeBasic
Главная
Вход
Регистрация
Воскресенье, 03.03.2024, 15:08Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » LoadImageFromResource() (загрузка картинки из ресурсов)
LoadImageFromResource()
VitaminДата: Среда, 16.08.2023, 21:35 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
сделал всё как в справке: создал файл test.rc со строкой 100 RCDATA "1.png"
не срабатывает в общем функция, может есть какие-то тонкости?
 
haavДата: Среда, 16.08.2023, 22:58 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1360
Репутация: 49
Статус: Offline
Чтобы не гадать , скинь весь проект с примером:
исходник+файл ресурсов+изображение+батник для компиляции. И укажи на какой системе компилировал (имя+разрядность) и каким компилятором (версия+разрядность)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Четверг, 17.08.2023, 10:54 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
файл test.bas (код из справки window9 по LoadImageFromResource, только размер подправил):

Код
#Include "window9.bi"

Dim As Integer event
Dim As HWND hwnd

hwnd=OpenWindow("",10,10,400,400) : CenterWindow(hwnd)
ImageGadget(1,50,30,200,200,LoadImageFromResource(Cast(any ptr,100)))

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

файл test.rc:

Код
100 RCDATA "1.png"

командная строка FBEdit для компиляции:

Код
fbc -s gui "test.bas" "test.rc"
файл 1.png:


Система Windows 10 x64, FreeBasic 1.10.0, window9 от 16.12.2022
Скомпилированная прога сразу закрывается после запуска
На Windows XP x32 (FreeBasic и window9 таких же версий) работает!
Прикрепления: 1935812.png (6.1 Kb)


Сообщение отредактировал Vitamin - Четверг, 17.08.2023, 20:20
 
haavДата: Четверг, 17.08.2023, 11:23 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1360
Репутация: 49
Статус: Offline
Странно , мне казалось , что я исправлял этот баг. Как так получилось , что он вернулся :)))
Я не знаю , когда выйдет исправление. Если хочешь , то сам подправь библиотеку. В файлах LoadImageFromResource и LoadImageFromResourceA удали или закомментируй строчки: GlobalFree(pMem) и пересобери библиотеку.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Четверг, 17.08.2023, 20:20 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
Пересобрал, спасибо на Windows 10 x64 теперь работает как надо, однако на Windows XP x32 не срабатывает прозрачность (до правки было так же). Что еще нужно поправить?
а так: Load_image("1.png",&hf0f0f0) прозрачность в порядке получается


Сообщение отредактировал Vitamin - Четверг, 17.08.2023, 20:26
 
haavДата: Пятница, 18.08.2023, 06:32 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1360
Репутация: 49
Статус: Offline
Цитата Vitamin ()
однако на Windows XP x32 не срабатывает прозрачность


load_image не поддерживает прозрачность , она просто заливает фон нужным цветом (во втором параметре). Как правило в винде фон у окошек &hf0f0f0 , поэтому если указать у функции 2 параметром этот цвет, то фон изображения сливается с фоном окна.

Imagegadget и его стандартная функция отправки в него изображения SetImageGadget тоже не поддерживают прозрачность. Это все функции стандартного GDI (еще со времен первых версий винды). Они работают с битмапом GDI.

Нормальная прозрачность с Imagegadget и SetImageGadget есть только на линуксе.

Чтобы на винде реализовать нормальную прозрачность , надо использовать функции GDI+ , то есть загружать при помощи Load_imageA и рисовать вручную без преобразования в GDI и без вывода в ImageGadget функцией SetImageGadget. Но тут встает вопрос: как рисовать? Просто нарисовав при помощи WindowStartDrawA , будет "рисование на один раз" , то есть при любом ресайзинге окна , все сотрется. Значит надо рисовать либо постоянно по таймеру (не самый хороший вариант) , либо (что более правильно) рисовать только в моменты когда отрисовка требуется. Но во втором случае уже надо действовать системными средствами. Я покажу пример ниже , как это можно сделать , но важно помнить , что это будет только для винды. Можно и средствами устаревшего GDI рисовать с прозрачностью , например так: https://users.freebasic-portal.de/freebasicru/oleloadpicture.html

Код
#Include "window9.bi"
Using GDIPLUS
const as integer x = 10 , y = 10
dim shared as any ptr gdiplusbitmap
dim shared As HDC compHdc,hdc
Dim As PVOID GpGraphics
dim as HBITMAP bitmap
Dim As Integer event
Dim As HWND hwnd

Function WndProcUser(hWnd As HWND,uMsg As UINT,wParam As WPARAM,lParam As LPARAM) As Integer
    Dim ps As PAINTSTRUCT
    Select Case uMsg
  Case WM_PAINT
   BeginPaint(hWnd,@ps)
   BitBlt(ps.hdc,ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right-ps.rcPaint.left,ps.rcPaint.bottom-ps.rcPaint.top,compHdc,ps.rcPaint.left,ps.rcPaint.top,SRCCOPY)
   EndPaint(hWnd,@ps)
   Return 0
    End Select
End Function

hwnd=OpenWindow("",10,10,400,400) : CenterWindow(hwnd)
gdiplusbitmap = load_imagea("1.png")
hdc=GetDC(GetDesktopWindow)
compHdc=CreateCompatibleDC(hdc)
bitmap = CreateCompatibleBitmap(hdc,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN))
SelectObject(compHdc,bitmap)
DeleteObject(bitmap)
ReleaseDC(GetDesktopWindow,hdc)
GdipCreateFromHDC(compHdc,@GpGraphics)
GdipGraphicsClear(GpGraphics,&hffffffff)
GdipDrawImage(GpGraphics,gdiplusbitmap,x,y)
GdipDeleteGraphics(GpGraphics)
InvalidateRect(hwnd,0,0)
SetWindowCallback(CInt(@WndProcUser()))
Do
    event=WaitEvent()
    If Event=EventClose Then
  DeleteDC(compHdc)
  End  
    EndIf
Loop


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Пятница, 18.08.2023, 10:20 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
Понятно по прозрачности, интересует как раз заливка фона нужным цветом. Как можно сделать, чтобы LoadImageFromResource работала так же как и Load_image, у неё ведь в параметрах по умолчанию присутствует: (,byval color As Integer=&hf0f0f0)

Сообщение отредактировал Vitamin - Пятница, 18.08.2023, 10:55
 
haavДата: Пятница, 18.08.2023, 11:42 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1360
Репутация: 49
Статус: Offline
Еще одна ошибка.

2 способа (выбирай , что тебе больше подходит):

1) Использовать в параметре цвет в формате ARGB (альфа , красный , зеленый , синий) , пример &hFFF0F0F0
2) Исправленный файл LoadImageFromResource во вложении. Пересобери опять библиотеку с исправленным файлом. И используй привычный формат цвета.
Прикрепления: LoadImageFromResource.bas (1.9 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Пятница, 18.08.2023, 12:32 | Сообщение # 9
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline
Пересобрал библиотеку по второму способу - ничего это не дало для Windows XP x32.
А вот добавление в параметре цвета &hFFF0F0F0 исправило ситуацию.
И еще один момент может и не критичный:
в справке указано, что есть параметр по умолчанию
Код
Function LoadImageFromResource(byval lpResName As LPCTSTR, byval color As Integer=hf0f0f0) As HBITMAP
а в файле LoadImageFromResource.bas параметра по умолчанию нет:

Код
Function LoadImageFromResource(byval lpResName As any ptr, byval color_ As Integer) As HBITMAP Export
 
haavДата: Пятница, 18.08.2023, 13:20 | Сообщение # 10
Генералиссимус
Группа: Администраторы
Сообщений: 1360
Репутация: 49
Статус: Offline
Цитата Vitamin ()
Пересобрал библиотеку по второму способу - ничего это не дало для Windows XP x32.


Где-то ты что-то делаешь не так. Возможно забыл заменить файл или забыл скомпилированную библиотеку закинуть/обновить.

Цитата Vitamin ()
а в файле LoadImageFromResource.bas параметра по умолчанию нет:


Все параметры по умолчанию прописаны в заголовке.

Кстати , на хрюше у меня цвет по умолчанию для окна другой (более серый что-ли).

Можно попробовать узнать цвет так , но не знаю везде ли это сработает:

Код
Union uIC
   ul As ULong
   Type
      r As UByte
      g As UByte
      b As UByte
      a As UByte
   End Type
End Union

dim ic as uIC

ic.ul = GetSysColor(COLOR_BTNFACE)

ImageGadget(1,50,30,170,170,LoadImageFromResource(Cast(any ptr,100) , bgr(ic.b , ic.g , ic.r)))


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

Вообще какие-то траблы с этими форматами цвета. То он в формате RGB , то в формате BGR. В GDI+ он в формате ARGB. В FB он в формате RGBA. Кто как хочет , тот так и ляпает.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Пятница, 18.08.2023, 18:34 | Сообщение # 11
Лейтенант
Группа: Пользователи
Сообщений: 55
Репутация: 4
Статус: Offline

Цитата
Где-то ты что-то делаешь не так
Ты прав, я промахнулся в папках, всё работает как надо, спасибо.


Цитата
Все параметры по умолчанию прописаны в заголовке
Даже не знал, что можно только в заголовке прописать, думал везде надо.
 
Форум » Freebasic » Вопросы по языку FreeBasic » LoadImageFromResource() (загрузка картинки из ресурсов)
  • Страница 1 из 1
  • 1
Поиск: