LoadImageFromResource()
|
|
Vitamin | Дата: Среда, 16.08.2023, 21:35 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: Offline
| сделал всё как в справке: создал файл test.rc со строкой 100 RCDATA "1.png" не срабатывает в общем функция, может есть какие-то тонкости?
|
|
| |
haav | Дата: Среда, 16.08.2023, 22:58 | Сообщение # 2 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Чтобы не гадать , скинь весь проект с примером: исходник+файл ресурсов+изображение+батник для компиляции. И укажи на какой системе компилировал (имя+разрядность) и каким компилятором (версия+разрядность)
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Vitamin | Дата: Четверг, 17.08.2023, 10:54 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: 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: командная строка FBEdit для компиляции: Код fbc -s gui "test.bas" "test.rc"
файл 1.png:
![](/_fr/6/1935812.png)
Система Windows 10 x64, FreeBasic 1.10.0, window9 от 16.12.2022 Скомпилированная прога сразу закрывается после запуска На Windows XP x32 (FreeBasic и window9 таких же версий) работает!
Сообщение отредактировал Vitamin - Четверг, 17.08.2023, 20:20 |
|
| |
haav | Дата: Четверг, 17.08.2023, 11:23 | Сообщение # 4 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Странно , мне казалось , что я исправлял этот баг. Как так получилось , что он вернулся :))) Я не знаю , когда выйдет исправление. Если хочешь , то сам подправь библиотеку. В файлах LoadImageFromResource и LoadImageFromResourceA удали или закомментируй строчки: GlobalFree(pMem) и пересобери библиотеку.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Vitamin | Дата: Четверг, 17.08.2023, 20:20 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: 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 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Vitamin ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/10/lastpost.gif) ) однако на 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 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: Offline
| Понятно по прозрачности, интересует как раз заливка фона нужным цветом. Как можно сделать, чтобы LoadImageFromResource работала так же как и Load_image, у неё ведь в параметрах по умолчанию присутствует: (,byval color As Integer=&hf0f0f0)
Сообщение отредактировал Vitamin - Пятница, 18.08.2023, 10:55 |
|
| |
haav | Дата: Пятница, 18.08.2023, 11:42 | Сообщение # 8 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Еще одна ошибка.
2 способа (выбирай , что тебе больше подходит):
1) Использовать в параметре цвет в формате ARGB (альфа , красный , зеленый , синий) , пример &hFFF0F0F0 2) Исправленный файл LoadImageFromResource во вложении. Пересобери опять библиотеку с исправленным файлом. И используй привычный формат цвета.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Vitamin | Дата: Пятница, 18.08.2023, 12:32 | Сообщение # 9 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: 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 |
![haav](/avatar/00/5416-572652.jpg) Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Vitamin ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/10/lastpost.gif) ) Пересобрал библиотеку по второму способу - ничего это не дало для Windows XP x32.
Где-то ты что-то делаешь не так. Возможно забыл заменить файл или забыл скомпилированную библиотеку закинуть/обновить.
Цитата Vitamin ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/10/lastpost.gif) ) а в файле 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 |
Лейтенант
Группа: Пользователи
Сообщений: 58
Статус: Offline
| Цитата Где-то ты что-то делаешь не так Ты прав, я промахнулся в папках, всё работает как надо, спасибо.
Цитата Все параметры по умолчанию прописаны в заголовке Даже не знал, что можно только в заголовке прописать, думал везде надо.
|
|
| |
|