FreeBasic
Главная
Вход
Регистрация
Суббота, 19.07.2025, 21:53Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
функция ImageGadget
VitaminДата: Воскресенье, 16.03.2025, 20:20 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 4
Статус: Offline
При использовании манифеста возникает проблема с прозрачностью картинок, то есть в этих местах получается светлое заполнение. Можно ли как-то это поправить?
Не удалось прикрепить архив с примером на пару КБ, поэтому добавляю в base64.
ImageGadget.b64

Цитата
MIME-Version: 1.0
Content-Type: application/octet-stream; name="ImageGadget.zip"

Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ImageGadget.zip"

UEsDBBQAAAAAAHOqcFoAAAAAAAAAAAAAAAAMAAAASW1hZ2VHYWRnZXQvUEsDBBQAAAAIAHmpcFru
0p061wcAADYLAAARAAAASW1hZ2VHYWRnZXQvMS5pY2+1lndMU1EYxVvbgiLuvffeA/fGvWI07r33
iHtPVERFQUYpltKWUi20YGkFa1sU3Br33nHvOBOVtsfzUKLRxPGHt7m57933+v3ud77z7nsikZi/
0qWFsaKoYl6RqLhIJKrJXpq9qejrvNA++oj+toklbGKx+Mc5mZeXV0kfH59K3t7e5Xjum3NBuE8q
lebimEv0l024V2jZgWWy/B06tBkcsHapWq+LOWMxJz/aa7G+TNtrfZps0l+Jitq6Z9jQAXN8fX0r
C/fzb8Kf/8gS7vmag1g2aGD/GQ6b9f6+1BNYtTLV07dPPJo0iUW9enFo2tSIvn33Y926i56TJ1/h
3r2bbxcvnh0uk3mVzYnzG4ZEGAsVLFReExuVccBxGr16RntkshUukWhFlki00S2Rhnhy547y+Pho
OO52S6UmV968Flf37sc9GRnPkZmR+qBKlSq9hDiU/SfWd36ZMmXrOGwp9zYFpkEmW8zYi9wy2Vr4
+ATC13cr8uXbgQIFFChcWINixQwoVSoFpUvbOXeQ7HTX4kWXcfnC6aymTZuMzWb9kJf4W7Hz5ytQ
0rY36eaC+XsgEi3IkkhWwtt7LXLnDuC4keMW5M0bSpaccVUoVCgeRYsaydqLsmUdKFfuEO875Bo5
8jTOnT6eVbly5V45OXwdv3okPDTIuG2rnYzln6XSAEilayEWr+b5anh5BWZz8uTZTlYE8uXfiYIF
tShSxMBrBnItKFPGgfLlD/L8gGvB/LNISdbdEYslpXK8JYz+ndr33Z96hNpsYi0CydjI+GtRq9Ym
9O+/BRLJKv5f4GyjhmHMScGu4rkaM2da0aqVjrmYULqUjTo6kNd3X5Yx4Twmjh++/VutsmuviYlw
TJlsZOxNLi+vYGFE7drboVDEIDFRhUmTQjm3hrG2MZ8d7JFky7FgQSIeP76CM2cuoEULDfMyUUcL
12vx+HeyI9WS9MrbO3d5gVGvXp0me1Psn1q02Mk1hlOr7Yy5FYGBu5CSEo/w8Gjs2hWDKVPCeC2A
/gghYwemTo3BwYNWpKWl4/79K9DpjvKalv4wspuY026XQX8UXbu0mypwpk8dtyhabkf1GtGuevWU
1CecnBBUqCCHWm1EQkI85HIlWapsVq5cGzF2bAT0+p1QqbTkmGGxHKTG8cxTQ3/E0R/xXFOsa/5c
B1Ytn2sQOGEhmxKXLbWievVYV7NmGtSooeS6Ir+yKkZBozHBaIxHdLSSxzHMU46oqDCEhISRI0dc
XDKqVlUxbiR1EzRR0iMxyCVRuLt3M2KnPPQ8Md46teLE1Clm1Kmrc/v56eDXVMu1qeCTN4qsHahU
KRpabRLz0kOpVCEmJppaRiIyMoz106NKlZ28T/B7JD0SIdQu+1giDfM0aBCLuFjVI+5fxeLUinOT
J1lQv77B3aKFgXuKHn5+cWjYUI0SJZWMEYaq1aJhMu2hdnrmoGb8KGqqRc2aYbwezPih9Egovc+e
JzT7PFeuYE+tWgpoVbHPvL29Suk0isOzZuxFo0ZJ7tatTfRNIpr57Uaz5vFo1iyOdVJi0SIzHA4b
9TOx3l9ZGo0K4ycI9dpAnbdne5Fe5RhMv28VPOupX18OTczOexKJtGBI8HptwFo7Gjc2u9q1S0Hr
1sl8Hkxo3jyBe6aOdcnE3bsXkZl5CE6nHXZ7KjXcTf1i6Xk1vRHBmAH0YDCfO+FZ20xekDDH+qgQ
uWPLMcEHE8aPmBqvzWRcq7tjxzS0a2dFm7ZmchNZlzN49eohzp+/jCtXztPHpzF2TBIMBius1mRq
p0NSkg7Tp8uZ1zrmsoXaBQnPu7CPZC1ZnISF86ZFCJxq1apWde53vunXz4YOHRyezp1tZFq45usA
PnDPf4wnT+6TdRP9+u2ht2LRs6cBZrMNqakp1FE4NmDxYiU9s5U124Zq1bagUuUNrmSjHa1a+PUR
fWsKeYg+fMdxtGmT7urRM53a7cPu3bfJycKnT+9w+/YTDBiQxhoa0L69EQ0axJOVwPj7yTLDZjNj
9eo9fDYi6J8I7qlb3KNGapG4S3uVW5t3DqdJkyZ+l85f8IwY7vT4+2d6evQ4wBrZqP9dPHz4BkOG
pNMTe9Cpk4VrSaa2Ruq6C717G7lnOBEUZEOdOirOKdGwgQK1aodm2bhf9u/XZ+K3/U2as8cFblwX
dO3qC3Tt6vzcvfsRrjcD/p3T0aNHOnPYx3kbOano0NHKczN7MvVNFPLjGnbxWEevxlFX+efI8HQo
IkPSvr93vo98nUoyM51pFy68QffuBz537XrU07fvYXIyyDyIbt2cZNkh1M/fPxUdO1rZU5hbEutq
Yv4JfNbVn4M2OZBmMd0qXLhI6R/j/3js65s/36FDTtutm68xftxhl7//0awePY55evc+TI0y0KvX
AXKdXIedXBu6dEnL5vn5Jbk6djJlaTXHYd2TcL1s2bLVfv5O+Ikllkpl0k2BAUG3b9zwaNTnMW78
McY97O7kL3A5dspwd+hwwN22nd3Vtu0+V9++NgSsO+I5knEawZsDEvleLvwr41dWTr0aNGjQMFoe
Yjh66ND7vZbTiIw46Vm75hiWLjmCFcuPYnvwSRj0p+CwZX5W7QxztmndslvOu/Nvvq1+YGVrWali
pYrjx46YGrp9o1avUx7WxynPsR8P3xGUMGXS6IU1a1Sr/+M30798K/6P9gVQSwMECgAAAAAAK5Vr
WsbvciqWBwAAlgcAABEAAABJbWFnZUdhZGdldC8xLnBuZ4lQTkcNChoKAAAADUlIRFIAAAAaAAAA
GggGAAAAqUpMzgAAAAlwSFlzAAALEgAACxIB0t1+/AAAB0hJREFUeNqVlgNgZMkahU/VvTfdfYNO
Rr37gnFexrZt27O2vTu27bw3NpZje9YYe6JRzE5fVNVW0Gt+3afd/6nz/1cEv4FKiIRJVE1RGtVv
0qxt8/Y9Y/5bpWFImDuSC+YiIN6MtMykSxcvfnH09OFPvz3/9VnOOKOUKqIIjt9AfmsihIC88R5d
e/V9YsRT73uiS9ZNdsSRJH4TGSIZJvNBJQEIpaXgQVmU8kaJ+xdTv1mzcfW0I8cPfkSK4ZLfGvlN
FPkdK+MpXXrFgv+tqd60SreTvo/EeX4W2SSNc3BCCu5MgNkcNrMEt7jQRTCt4WiCFlov8uW+H3aP
nf7u41mZWSn+er8yohIuiY6Jrnxs74l9D9w3Kq6+P9PO1TKIyh0KtSk4F+BMqsCScaDwtQDjDCn5
9xkxVDHM86paKjH61nOvPtE1KSnpur9uoVEBQlLGU8bz9dlvT992f1Mp9t40yxHg1BRLA+N2cXEh
xYte28VmnCLbyESrMt3QyNMam6+ssGLUelpMWvObw58a1CIzI/OBvz71p1o6d8Wqe0HXK61MmmI5
FV2DQWDaBizLhmUWyPrVa+mP9LxUNApti7drzEab8B6Y22yTtjdhq3W/zJVKk9+fvup3M+rbu9/A
cTPHbluS+6Ztaj6VFLaKFa6asaI0ojgNK2wb4DW9eESLxLTa66A7AhEa4saRS3sx5uzTUFXFnlht
tTp73LxhBw7v26xIKFGAYQNHvXY4bxtylHQKk8CyTCm7UHahfpmGwWcY4JbA41HvQGUaOGO4HHcR
44+/iIJ6GXkZ9NPE9Rg6cMQbAIp2lVZN27QJKeds/J1xAlTRqGxXcQopLvzz8H8GUjyXIY++hPJq
FWTlZ0BnQRhz6DlkklS4zEAoQqWnEvfx9rUG1K1etWaLi5fPn6QtGrfuGo+ryGYZjJkCZkECv/yz
kc/c5IAFpHqTUYHWRAPaDrcf3gT1qZh06n3szj6DNBiIM5LxkOficn4qv2KcR+O6TTpCQitXjm6Y
YF4rWDEpKOyXVSxucflsIs2Xgau5d/Ag34e22gCkpKdAtTUciNuN9XfXIzSIwuIWBBWFslWQyznn
UbFCpbqQqMHuoKh0KxmCCCLNILgAs4taxhhDmpmJh1L5MmGOLfCy+2l42H/gZXnIMjnm35wJZyCg
CFE4HwKAQsCpgSSbSWhUon04AFXl4C6TGWCcI9fKhs/yAQwgUJBkpCDT9EHhVBoJNHM1QltnJ6T7
0uAJfgQr7y7APeU+wjQFTDAo8BsBqhRTDFCFugAEUBkkX2Ea8ny5iHbVxpiYJegePhwXcu7Jdvmg
MQXM4tCFA6NKPg0bDKHOMFwwvsXB3D0Ic1EIyqBqgBJQLEeRXA4nBBMGAJtmZWQnhJAwUFsTY+os
RAtPZzwR9TaW1F4JB9NhGgJeA+hbajBigqtBqByarmB98goEuACqCKjFBqpDygloTgIqPcKDI5GV
nv0AgEmvX7v2VVlHDHK9OeJE/AE4XA7kkWx09fTD2qabIWwVj2oejCr3BHw0H+GhEdidvhO3xB0E
ORRQTfhNpEGxXIDqgogJro0bN6+fh0RhnFk9O/QZ9VX2URp7Yz1ycrPRu8oApJtpiA6sgrJBkagW
Ug0NSzYDiECiEYfZceOhh7BfpfFLdRAggCNExh2ovURWr1w9NSUt+QY999WZ49lx3i8rBTZCPsBn
/rAALx94ChElIpBHc9E1qjeGVB4NH/UiNCgMsXcWwXCaCFAplN+0THUROHRNfg/etmQvmnop5+rl
axePE0KgQOLz+fIe7/FUv8/idjJdI/RU/LcwfbnoXbsfcs0cWMxACVcp7I//FKsSlqGEWwFR+c+D
L2wZhebQQFwcOnWyVx1z6fyZCyfEJdw+QylVfjpNLJ8Xu9uokdHt1VNvWyV0h5aeaWBZ14V4rsXL
yMzORH5uPrp91AL3nLcQqFNQBy9MoThJoYkaoMr3CtK51x4XuERN205PvvL+8+2licU5JwVQ6cPd
Ye7wbWt2nTpF95efemaOrTupSjnBlv470b1mb7z38etYfGc+PKUVQGP+gUsphRsQdIZsYdgv6mPV
6B/aPegzomu7vBzvZX/9X51hwyPCq61eum7vdf2HqDHH37ezbIOGuVy0elglXDevwRFqF81DBzSd
IEBXQAIFvJrFg4nO3yo5Ty31ffXkIU/16//w/sNT/rq/vfpRIHGHusNjF68+fPq7U2LU+gG89GQn
wzhY+hxil1gG5lkHFrEDLHI3saMOw6p71snG3R7Nb6dfFauXbDgXFBxUzb/4v7sKKoB269x95LNP
PPducJQefcn7nbiQ9TV5aCeAaT45Iyci3OXQwNNSNAppQ1Iv5N2ZOH38wk/3fRIrS3gB+JP8OQU9
LaDImDjr1qrX+fXn3pwvr4yObt+468qurR/f3rn546v/X7zuxJjXxi9tWK9xHxC4ixdKCsC/gCiS
P/iTLhUmFfSbSzUoEgB/avIjZzH9Kqh+vncAAAAASUVORK5CYIJQSwMEFAAAAAgAhqpwWq1gMswj
AQAA4gEAABsAAABJbWFnZUdhZGdldC9JbWFnZUdhZGdldC5iYXN9T8FKw0AQPTeQfxhW0ATWkkQQ
evCgsUigtocceixpMsaFZDc0qfVze7C0IIm1l55Ed9NUjQdnZ9md996+nTnxeJjMIwSyYDwSi153
yoiu3bIUrnNgvMAYZ4BPyAtd07VRhnxcCw1iE3phWdS2qGPV29Q1Lw1ivAuiGAvDlrRK51LlQATR
hClavuxmPCb09PHBUss04QzW5XK/KjcrOKJwDi+vn/C2rdbb5b6s3nebtr9De5bMln8ouLKXJzEp
9f2J546Gsi85kdC1Tj0HXME4YEVf3Q1Toj4mGBbgBjkeJ+3AoaxFbiJyVJiMPo/+sIduGrqx+mGH
83SKs4bt1LitqibuMc9vxLNBCCUfuwpsYra0zj9aR2q/m2p+lsDvYiBE9gVQSwMEFAAAAAgAW5hw
WgEKldksAQAAWAIAACQAAABJbWFnZUdhZGdldC9JbWFnZUdhZGdldC5leGUubWFuaWZlc3SFkE9P
wzAMxe9IfIcoR6S2lP0RTN2maQc0IW4IzlnqdhGNXcXpRr89mUrXIk2gXBK/F/v9nK2/bCWO4NgQ
LmUa30sBqCk3WC5l44voUQr2CnNVEcJStsByvbq9yRQz2H3VitAAOXgdLlgfwCqOrNGOmAofabIL
xTY+prIznl/Hyb/2iRRWoSmA/fs4XJgshLgM3+WA3vj2F0E4gQKVDXF3VpXwrPISvBS1Iw3M5DZO
H4wH7RsXPHdS+LYOl5PByYMUyc+QHFg7U/vQdzXqkyUj4WKtAUMW3XaFcc1vurCDdI1gHKEP/9rv
Jf4wmNOJ4y1ZSxhtCb2jiuXAPe+4/4Ksm31l9Au0b/QJ5y+zp9l+Pk2nU62LNC+kqBSWjSo7ezKg
JNdYemEAzxLVy99QSwMECgAAAAAALpdwWpBMSxc8AAAAPAAAABoAAABJbWFnZUdhZGdldC9JbWFn
ZUdhZGdldC5yYzEwMCBSQ0RBVEEgMS5wbmcNCjEgUlRfTUFOSUZFU1QgIkltYWdlR2FkZ2V0LmV4
ZS5tYW5pZmVzdCINClBLAQI/ABQAAAAAAHOqcFoAAAAAAAAAAAAAAAAMACQAAAAAAAAAEAAAAAAA
AABJbWFnZUdhZGdldC8KACAAAAAAAAEAGABCVAhbqJbbAQAAAAAAAAAAAAAAAAAAAABQSwECPwAU
AAAACAB5qXBa7tKdOtcHAAA2CwAAEQAkAAAAAAAAACAAAAAqAAAASW1hZ2VHYWRnZXQvMS5pY28K
ACAAAAAAAAEAGACgvXxEp5bbAQAAAAAAAAAAAAAAAAAAAABQSwECPwAKAAAAAAArlWtaxu9yKpYH
AACWBwAAEQAkAAAAAAAAACAAAAAwCAAASW1hZ2VHYWRnZXQvMS5wbmcKACAAAAAAAAEAGAAiFPFq
pJLbAQAAAAAAAAAAAAAAAAAAAABQSwECPwAUAAAACACGqnBarWAyzCMBAADiAQAAGwAkAAAAAAAA
ACAAAAD1DwAASW1hZ2VHYWRnZXQvSW1hZ2VHYWRnZXQuYmFzCgAgAAAAAAABABgAo6CSb6iW2wEA
AAAAAAAAAAAAAAAAAAAAUEsBAj8AFAAAAAgAW5hwWgEKldksAQAAWAIAACQAJAAAAAAAAAAgAAAA
UREAAEltYWdlR2FkZ2V0L0ltYWdlR2FkZ2V0LmV4ZS5tYW5pZmVzdAoAIAAAAAAAAQAYACRzdEGV
ltsBAAAAAAAAAAAAAAAAAAAAAFBLAQI/AAoAAAAAAC6XcFqQTEsXPAAAADwAAAAaACQAAAAAAAAA
IAAAAL8SAABJbWFnZUdhZGdldC9JbWFnZUdhZGdldC5yYwoAIAAAAAAAAQAYAERy1X6UltsBAAAA
AAAAAAAAAAAAAAAAAFBLBQYAAAAABgAGAHMCAAAzEwAAAAA=

Заметил, что если переместить окно за заголовок, то светлый ореол вокруг картинок исчезает и всё становится как надо. Только это работает не стабильно: не всегда и не на всех картинках. С этим примером не срабатывает. Может нужно какой-то функцией делать перерисовку?


Сообщение отредактировал Vitamin - Понедельник, 17.03.2025, 12:08
 
DarkDemonДата: Понедельник, 17.03.2025, 18:18 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
На всякий: https://base64.guru/converter/decode/file
(+вложение для x64 вместе с window9, чтобы на чистом компиле 1.10.1 запустилось).

А что в данном случае делает этот манифест? Просто без него не собирается.
Прикрепления: ImageGadget.zip (300.9 Kb)
 
VitaminДата: Понедельник, 17.03.2025, 18:30 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 4
Статус: Offline
DarkDemon

Цитата
Просто без него не собирается
Чтобы отключить манифест нужно убрать его из файла ресурсов.
 
DarkDemonДата: Понедельник, 17.03.2025, 18:41 | Сообщение # 4
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
А вот оно как. Убрал его из ресурсов. Заметил странную картину
как написано
Код
значение &hf0f0f0 - для прозрачности

Так вот у меня на Win7 оно не срабатывает. Вокруг картинки более яркий фон. Видимо прозрачноcть как-то по другому
надо имплементить. И да зашёл в GIMP проверил, прозрачность в файле есть.
Надо справку по Window9 найти.
 
VitaminДата: Понедельник, 17.03.2025, 19:24 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 4
Статус: Offline
В качестве временного решения я переделал картинки: вместо прозрачности сделал заливку цветом f0f0f0. Решение не универсальное, так как цвет окон может измениться и тогда будет некрасиво.
Или как вариант перерисовывать такие картинки при загрузке проги, меняя в ней цвета под текущие цвета окна, правда не знаю возможно ли это.
 
haavДата: Понедельник, 17.03.2025, 20:15 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1404
Репутация: 50
Статус: Offline
Да есть такая фигня с Load_image. От версии к версии винды , почему-то функции GDI+ ведут себя по разному. Получается , что еще и манифест влияет...

Я могу посоветовать следующее: в собственный код (не в код библиотеки) внеси код слегка отредактированной версии Load_Image:

Код
#include once "window9.bi"

' где-то сверху кода разместить этот участок кода:

Using GDIPLUS

Dim shared ULONG_PTR_01 AS ULONG_PTR
DIM GDIPLUSSTARTUPINPUT_01 AS GDIPLUSSTARTUPINPUT
GDIPLUSSTARTUPINPUT_01.GdiplusVersion = 1
IF (GDIPLUSSTARTUP(@ULONG_PTR_01, @GDIPLUSSTARTUPINPUT_01, NULL) <> 0) THEN
    PRINT "FAIL"
End If

Function Load_Image(byref sName as USTRING, ByVal ColorBack As Integer) as HBITMAP Export
    DIM AS PVOID PTR GPIMAGE_01
    Dim hhbitmap As HBITMAP
    #ifdef UNICODE
  IF (GDIPLOADIMAGEFROMFILE( *sName, Cast(Any Ptr,@GPIMAGE_01)) <> 0) THEN
   PRINT "FAIL"
  End If  
    #else    
  Var blen = (Len(sName)*2)+2
  Dim As WString Ptr wbuf
  wbuf  = Allocate( blen )
  if wbuf = 0 then return 0
  MultiByteToWideChar(CP_ACP, 0, StrPtr(sName), -1, wbuf, blen)
  IF (GDIPLOADIMAGEFROMFILE( *wbuf, Cast(Any Ptr,@GPIMAGE_01)) <> 0) THEN
   PRINT "FAIL"
  End If
  DeAllocate(wbuf)   
    #EndIf
    'If LOBYTE(LOWORD(GetVersion)) <6 Then
  DIM AS PVOID PTR GPIMAGE_02,GpGraphics
  Dim As long w,h
  GdipGetImageWidth(Cast(Any Ptr,GPIMAGE_01),@w)
  GdipGetImageHeight(Cast(Any Ptr,GPIMAGE_01),@h)
  GdipCreateBitmapFromScan0(w, h, 0, PixelFormat32bppARGB, NULL, Cast(Any Ptr,@GPIMAGE_02))
  GdipGetImageGraphicsContext(Cast(Any Ptr,GPIMAGE_02),Cast(Any Ptr,@GpGraphics))
  GdipGraphicsClear(Cast(Any Ptr,GpGraphics),ColorBack or &hff000000)
  GdipDrawImageRectI(Cast(Any Ptr,GpGraphics),Cast(Any Ptr,GPIMAGE_01),0,0,w,h)
  GdipCreateHBITMAPFromBitmap(Cast(Any Ptr,GPIMAGE_02),@hhbitmap,ColorBack or &hff000000)
  If GPIMAGE_02 <> 0 Then GdipDisposeImage(Cast(Any Ptr,GPIMAGE_02))
  If GpGraphics <> 0 Then GdipDeleteGraphics(Cast(Any Ptr,GpGraphics))
    'Else
  'GdipCreateHBITMAPFromBitmap(Cast(Any Ptr,GPIMAGE_01) ,@hhBitmap,ColorBack or &hff000000)
    'EndIf
    GdipDisposeImage(Cast(Any Ptr,GPIMAGE_01))
    Return hhbitmap
end Function

'------
'------
'------

'Ну и здесь или где-то ниже собственно вызываем как обычно Load_Image


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Понедельник, 17.03.2025, 21:27 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 4
Статус: Offline
haav
Да, спасибо, помогло для Load_Image, а как быть с LoadImageFromResource и Load_icon?
 
DarkDemonДата: Вторник, 18.03.2025, 05:31 | Сообщение # 8
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
Vitamin, Так у вас прозрачность заработала? Или что? О чём речь?
Уточню, на Win7 прозрачности нет. Можно ваш код посмотреть?

Если что я пробовал и так:


Код
SetWindowLong(Gadgetid(1), GWL_EXSTYLE, GetWindowLong(Gadgetid(1), GWL_EXSTYLE) OR WS_EX_LAYERED)
SetLayeredWindowAttributes(Gadgetid(1), 0, 0, LWA_COLORKEY)


И так:


Код
DIM ElmDC AS HDC = GetDC(Gadgetid(2))
  SetBkMode (ElmDC, TRANSPARENT)
  SetBkColor (ElmDC, 0)
ReleaseDC(Gadgetid(2), ElmDC)
ElmDC = GetDC(Gadgetid(1))
  SetBkMode (ElmDC, TRANSPARENT)
  SetBkColor (ElmDC, 0)
ReleaseDC(Gadgetid(1), ElmDC)

Один хрен. Подвинул один имадж на другой, на форме они непрозрачны. Скрин для убедительности.

Прикрепления: 99744343.png (4.1 Kb)


Сообщение отредактировал DarkDemon - Вторник, 18.03.2025, 05:47
 
DarkDemonДата: Вторник, 18.03.2025, 05:39 | Сообщение # 9
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
Скрин в прошлом сообщ без манифеста, с манифестом ещё хуже.



Добавлено (18.03.2025, 05:45)
---------------------------------------------
Если что цвет формы можно получить так.

Код
DIM MyHWND AS HWND = OpenWindow("1",300,10,200,200)

DIM DCForBkCv AS HDC = GetDC(MyHWND)
DIM SHARED FormBack AS COLORREF
  FormBack = GetPixel(DCForBkCv, 1, 1)
  ReleaseDC(MyHWND, DCForBkCv)

Хоть и понятно что не решает вопрос прозрачности.
Прикрепления: 34556520.png (4.2 Kb)


Сообщение отредактировал DarkDemon - Вторник, 18.03.2025, 05:47
 
haavДата: Вторник, 18.03.2025, 06:29 | Сообщение # 10
Генералиссимус
Группа: Администраторы
Сообщений: 1404
Репутация: 50
Статус: Offline
Цитата Vitamin ()
Да, спасибо, помогло для Load_Image, а как быть с LoadImageFromResource и Load_icon?


С функцией LoadImageFromResource поступить так же как с Load_image (комментируется участок кода по аналогии)

Цитата
Load_icon

Неужели и она с манифестом тоже косячит? Это же вообще обертка на чистую GDI функцию LoadImage. Есть конечно еще одна WinApi функция LoadIcon , но она грузит иконки из ресурсов. Может стоит попробовать ее?

Цитата
Скрин в прошлом сообщ без манифеста, с манифестом ещё хуже.


На это вообще не знаю , что сказать. Что же там Леха за настройки у тебя такие?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Вторник, 18.03.2025, 06:58 | Сообщение # 11
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
Цитата haav ()
На это вообще не знаю , что сказать. Что же там Леха за настройки у тебя такие?

Компиль 64 бит 1.10.1, архив выше с твоей библой. Винда 7 довольно стандартная(Ultimate SP1), без Aero с классической темой.

Твою функцию переименовал и убрал к.с. export, чтобы исключить любые конфликты.

Да ничего особенного, я не знаю в чём дело.

Код полностью:

Код
#include once "window9.bi"

USING GDIPLUS

DIM SHARED ULONG_PTR_01 AS ULONG_PTR
DIM GDIPLUSSTARTUPINPUT_01 AS GDIPLUSSTARTUPINPUT
GDIPLUSSTARTUPINPUT_01.GdiplusVersion = 1
IF (GDIPLUSSTARTUP(@ULONG_PTR_01, @GDIPLUSSTARTUPINPUT_01, NULL) <> 0) THEN
    PRINT "FAIL"
END IF

FUNCTION Load_ImageNew(BYREF sName AS USTRING, BYVAL ColorBack AS ULONG) AS HBITMAP

DIM AS PVOID PTR GPIMAGE_01
DIM hhbitmap As HBITMAP

  #IFDEF UNICODE

    IF (GDIPLOADIMAGEFROMFILE( *sName, Cast(Any Ptr,@GPIMAGE_01)) <> 0) THEN
     PRINT "FAIL"
    END IF  

  #ELSE    

    VAR blen = (LEN(sName) * 2) + 2
    DIM AS WSTRING PTR wbuf
    wbuf  = ALLOCATE( blen )
  
    IF wbuf = 0 THEN RETURN 0
    
    MultiByteToWideChar(CP_ACP, 0, StrPtr(sName), -1, wbuf, blen)
    IF (GDIPLOADIMAGEFROMFILE( *wbuf, CAST(ANY PTR, @GPIMAGE_01)) <> 0) THEN
     PRINT "FAIL"
    END IF
    DEALLOCATE(wbuf)   

  #ENDIF

  DIM AS PVOID PTR GPIMAGE_02, GpGraphics
  DIM AS LONG w,h

  GdipGetImageWidth(CAST(ANY PTR, GPIMAGE_01), @w)
  GdipGetImageHeight(CAST(ANY PTR, GPIMAGE_01), @h)

  GdipCreateBitmapFromScan0(w, h, 0, PixelFormat32bppARGB, NULL, CAST(ANY PTR, @GPIMAGE_02))

  GdipGetImageGraphicsContext(CAST(ANY PTR, GPIMAGE_02),CAST(ANY PTR, @GpGraphics))

  GdipGraphicsClear(CAST(ANY PTR, GpGraphics), ColorBack or &hff000000)
  GdipDrawImageRectI(CAST(ANY PTR, GpGraphics), CAST(ANY PTR, GPIMAGE_01), 0, 0, w, h)

  GdipCreateHBITMAPFromBitmap(CAST(ANY PTR, GPIMAGE_02),@hhbitmap, ColorBack OR &hff000000)

  IF GPIMAGE_02 <> 0 THEN GdipDisposeImage(CAST(ANY PTR, GPIMAGE_02))
  IF GpGraphics <> 0 THEN GdipDeleteGraphics(CAST(ANY PTR, GpGraphics))

  GdipDisposeImage(Cast(Any Ptr,GPIMAGE_01))
  RETURN hhbitmap
END FUNCTION

DIM Event AS INTEGER
DIM MyHWND AS HWND = OpenWindow("1",300,10,200,200)
'  Вставка из справки Window9
#IFDEF __FB_WIN32__
  VAR iStyle = SS_ICON
#ELSE
  VAR iStyle = 0
#ENDIF

ImageGadget(1, 30, 30, 26, 26, Load_imageNew("1.png", 0), , SS_BITMAP)
ImageGadget(2, 35, 35, 26, 26, Load_icon("1.ico"), , iStyle)

DO
   Event = WaitEvent()

   SELECT CASE Event

     CASE EventClose

       END

     CASE EventGadget

       SELECT CASE EventNumber
          CASE 1
           MessBox("","это 1")
          CASE 2
           MessBox("","это 2")
       END SELECT

   END SELECT
LOOP



Сообщение отредактировал DarkDemon - Вторник, 18.03.2025, 07:04
 
haavДата: Вторник, 18.03.2025, 08:59 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1404
Репутация: 50
Статус: Offline
Я понял в чем дело. Это баг библиотеки. Для исправления:

1) файл во вложении заменить
2) пересобрать библиотеку

Это должно исправить проблему и даже не нужно будет париться с Load_Image.
Прикрепления: Event.bas (34.9 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Вторник, 18.03.2025, 11:44 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 4
Статус: Offline
haav, Теперь всё отлично, спасибо.
 
DarkDemonДата: Вторник, 18.03.2025, 12:28 | Сообщение # 14
Полковник
Группа: Друзья
Сообщений: 218
Репутация: -1
Статус: Offline
Стас, а ты на какой винде проверяешь?

Event.bas заменил, сбилдил библу, положил в папку с проектом.

В вышеприведённом коде делаю такую последовательность

Код
TextGadget(1,10,10,80,30,"Test text")
ImageGadget(2, 35, 35, 26, 26, Load_icon("1.ico"), , iStyle)
ImageGadget(3, 30, 30, 26, 26, Load_image("1.png"), , SS_BITMAP)


Если просто запустить не заводя форму за экран и не выводя её обратно, то видим это:



Если выводить форму за экран и обратно, то видим это:



В любом из случаев прозрачности нет, но подсвечивание белым по краям у красного значка - исчезло, теперь оно красит
цветом формы. В общем интересный косяк. Хотя вроде раньше оно так же и работало, я просто никогда наслоением не пользовался.
Это с манифестом ТС-а. Во всех прошлых сообщениях я принудительно выводил форму за экран и обратно, для её перерисовки.
Прикрепления: 69711099.png (4.0 Kb) · 85692722.png (4.8 Kb)


Сообщение отредактировал DarkDemon - Вторник, 18.03.2025, 12:32
 
haavДата: Вторник, 18.03.2025, 19:00 | Сообщение # 15
Генералиссимус
Группа: Администраторы
Сообщений: 1404
Репутация: 50
Статус: Offline
Цитата DarkDemon ()
Стас, а ты на какой винде проверяешь?


Win10

Цитата
В любом из случаев прозрачности нет


Конечно нет. Весь механизм работы в том , чтобы для реальных прозрачных пикселей из PNG определить цвет , который сливается с фоном под рисунком. Если окно имеет белый цвет , и мы указали в функции тоже белый цвет , то прозрачные пиксели в GDI+ битмапе заменяются на пиксели белого цвета в GDI битмапе (при преобразовании битмапа из GDI+ в GDI). И уж потом мы GDI битмап пихаем в ImageGadget. Мы не можем в ImageGadget (ака Static control) запихать GDI+ битмап , хоть нам бы это очень бы и хотелось. Другой вопрос , а почему же не сделали такую возможность MS? Для GDI битмапов сделали , а для GDI+ битмапов нет. Наверное они посчитали такой способ (отправка сообщения STM_SETIMAGE) устаревшим. Типа пусть рисуют GDI+ сами на нужном Controls и следят за перерисовкой и пр. Так в принципе и делают. А мне нравится , когда отправил битмап в ImageGadget и больше не думаешь о том , как он там рисуется/перерисовывается (все на совести внутреннего обработчика MS).


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