Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > PureBasic

PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач.

Ответ
 
Опции темы
Старый 07.10.2011, 00:10   #1
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Скин с альфа-каналом (UpdateLayeredWindow_)

появившееся было желание писать на пурике моментально ударилось лицом о несговорчивость некоторых функций API. в частности UpdateLayeredWindow_(), которая должна была преобразовать полупрозрачный рисунок в многослойное окно (т.е. практически в шкурку с альфа-каналом).
в чем может быть дело?
может, дело в win7? тогда, если не затруднит, кто-нибудь гляньте на другой винде и отпишитесь, не высветляется ли левый верхний угол иконки фотошопа?
или, может, дело в чем-то другом?
я понимаю, что есть прекрасная функция WinSkin(), но она не передает полутонов канала прозрачности. при низком разрешении экрана границы картинки выходят несколько угловатыми.
исходники кода и скомпилированные экзешники в аттаче. (заменено на рабочий вариант)



проблема решена, рабочий вариант с комментариями:
Вложения
Тип файла: zip AlphaSkin.zip (154.9 Кб, 960 просмотров)
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 17.10.2011 в 19:09. Причина: проблема решена
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо barsunduk за это полезное сообщение:
Paranoia (27.07.2012), zeronull (10.12.2011)
Старый 07.10.2011, 00:15   #2
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Картинка не дает сосредоточиться на решении проблемы
(Offline)
 
Ответить с цитированием
Эти 8 пользователя(ей) сказали Спасибо Romanzes за это полезное сообщение:
Android (10.12.2011), barsunduk (11.10.2011), baton4ik (07.10.2011), impersonalis (07.10.2011), L-ee-X (07.10.2011), Nuprahtor (07.10.2011), pax (07.10.2011), Randomize (07.10.2011)
Старый 07.10.2011, 00:23   #3
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Сообщение от Romanzes Посмотреть сообщение
Картинка не дает сосредоточиться на решении проблемы

хотя бы экзешник запусти, скажи, как он себя ведет на другой винде. или у тебя тоже семерка?
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 00:31   #4
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Вот как он себя ведет. У меня семерка.
Миниатюры
Нажмите на изображение для увеличения
Название: AlphaSkinTest.png
Просмотров: 1479
Размер:	126.6 Кб
ID:	15065  
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 00:34   #5
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

походу, дело в семерке. надо API покурить. эээх...
---
нда. там такое... как я понял, png нужно будет разбить на битмап и маску, потом объединить их снова, но как-то по хитрому, и только после этого вызывать построение слоистых окон. короче долго еще думать...
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 07.10.2011 в 23:12.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 23:17   #6
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

как бэ ура. победил я эту беду. надо было RGB предварительно с альфа-каналом смешать. винда сама этого делать не умеет почему-то.
одно неудобство - контролы теперь недоступны. нужно свои рисовать. зато шкурки теперь можно полупрозрачные делать.
з.ы.: косячные архивы удаляю. исправленный и дополненный вариант см. в первом посте
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 17.10.2011 в 19:10.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо barsunduk за это полезное сообщение:
Nex (08.10.2011), Romanzes (07.10.2011)
Старый 07.10.2011, 23:26   #7
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

У меня работает отлично
(Offline)
 
Ответить с цитированием
Старый 10.10.2011, 23:04   #8
kvitaliy
Оператор ЭВМ
 
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений
(для 5 пользователей)
Re: Скин с альфа-каналом (UpdateLayeredWindow_)

Эта фраза очень насторожила:
;при использовании многослойных окон обычное PopupMenu не работает
;поэтому удалим/закомментируем его и будем пока закрывать окно по двойному клику
Проверил - всё нормально работает, меню вызывается и обрабатывается как надо.



EnableExplicit

UsePNGImageDecoder()

XIncludeFile("WinSkin2.pb")

Global hWndParent, hWnd
Global hPng, hBmp
Global Quit, Moving
Global dX, dY
Global Event
Define Menu 
hWndParent = OpenWindow(#PB_Any, 0, 0, 1, 1, "AlphaSkin", #PB_Window_BorderLess|#PB_Window_Invisible)
hPng = LoadImage(#PB_Any, GetPathPart(ProgramFilename()) + "Icons\back.png")
hBmp = ConvertPNG(hPng)
  hWnd = wndCreateChild(hWndParent, hBmp)
  wndSkin(hWnd, hBmp)
  HideWindow(hWnd, #False)
  Quit = #False
  Moving = #False
  dX = 0
  dY = 0
  Global xy.TPoint
   CreatePopupMenu(0)      
      MenuItem(1, "Open")      
      MenuItem(2, "Save")      
      MenuItem(3, "Save as")
      MenuItem(4, "Quit")
    Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #WM_LBUTTONDOWN
        ;SendMessage_(WindowID(Frm\hWnd), #WM_NCLBUTTONDOWN, #HTCAPTION, 0); передвигать окно мышкой
        ;этот способ вызывает утечку памяти
        Moving = #True
        GetCursorPos_(xy)
        dX = WindowX(hWnd) - xy\x
        dY = WindowY(hWnd) - xy\y
      Case #WM_LBUTTONUP
        If Moving
          GetCursorPos_(xy)
          wndMove(hWnd, xy\x + dX, xy\y + dY)
          Moving = #False
        EndIf

      Case #WM_LBUTTONDBLCLK
        ;Quit = #True
      Case #WM_RBUTTONDOWN
        ; Контекстное меню правым кликом
        DisplayPopupMenu(0, WindowID(hWndParent))
      Case #PB_Event_Menu
        Menu = EventMenu()
        If Menu = 4
          Quit = #True
        EndIf
;
    EndSelect
    If Event = #PB_Event_CloseWindow
      Quit = #True
    EndIf
    If Moving
      GetCursorPos_(xy)
      wndMove(hWnd, xy\x + dX, xy\y + dY)
      Moving = GetAsyncKeyState_(#VK_LBUTTON)
    EndIf
  
    Delay(20)
  Until (Quit)
End
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
barsunduk (11.10.2011)
Старый 11.10.2011, 17:37   #9
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Re: Скин с альфа-каналом (UpdateLayeredWindow_)

Сообщение от kvitaliy Посмотреть сообщение
...
        DisplayPopupMenu(0, WindowID(hWndParent))
...
да, действительно, тут я сильно зевнул. полноценное невидимое окно есть, а не используется. спс за идею.
(хорошо, что я комментарии свои дурацкие забыл удалить в коде ..)
а если так, то не попрет:
        DisplayPopupMenu(0, WindowID(hWnd))
так как окно hWnd уже изнасиловано функцией UpdateLayeredWindow()
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 17.10.2011 в 20:00.
(Offline)
 
Ответить с цитированием
Старый 11.10.2011, 17:47   #10
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Сообщение от Romanzes Посмотреть сообщение
Картинка не дает сосредоточиться на решении проблемы

Эти 7 пользователя(ей) сказали Спасибо Romanzes за это полезное сообщение:
barsunduk (11.10.2011), baton4ik (07.10.2011), impersonalis (06.10.2011), L-ee-X (06.10.2011), Nuprahtor (07.10.2011), pax (07.10.2011), Randomize (06.10.2011)
имхо, на булике давно пора переименовать кнопку "Полезно!" в кнопку "Прикольно ..)"
з.ы.: Romanzes, я против вышеописанного ничего не имею, кстати. самому смешно было. тоже плюсанул
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 17.10.2011 в 20:01.
(Offline)
 
Ответить с цитированием
Старый 17.10.2011, 18:52   #11
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

исправил ошибки, чуток оптимизировал, расставил комментарии.
закинул основную писанину в подключаемый модуль.
можно включать его в проект и спокойно писать, скажем, приложения для десктопа.
архив размещаю в первом посте.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (17.10.2011)
Старый 10.12.2011, 15:07   #12
zeronull
AnyKey`щик
 
Регистрация: 10.12.2011
Сообщений: 1
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Подскажите пожалуйста как добавить на это окно кнопку и вывести текст? Раньше учил VB, сейчас возникла необходимость написать утилиту изпользуя скин, пример хорошо демонстрирует как прикрутить скин, но как реализовать простейшие контролы не понятно. Буду рад любой помощи!
(Offline)
 
Ответить с цитированием
Старый 10.12.2011, 22:36   #13
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Сообщение от zeronull Посмотреть сообщение
Подскажите пожалуйста как добавить на это окно кнопку и вывести текст? Раньше учил VB, сейчас возникла необходимость написать утилиту изпользуя скин, пример хорошо демонстрирует как прикрутить скин, но как реализовать простейшие контролы не понятно. Буду рад любой помощи!
если вам нужны стандартные контролы, то рекомендую использовать стандартный же WinSkin(). если же вы создаете скин вручную из картинки, как в этом примере, то контролы придется создавать самому (включить в картинку скина их изображение, добавить в код обработчики событий - наведение/клик мыши и т.д., в общем, новичку связываться с этим я бы не советовал. я вот новичок, мне лениво писать всё самому. чтобы добавить обработчик перетаскивания окна мышкой пришлось эту лень преодолевать ..)
есть еще варианты, типа "создать еще одну форму с помощью WinSkin, накидав на нее контролы, таскать ее следом за нашим скином...", но это уже совсем клиника.

вывод: данный вариант подходит для виджетов и прочей мелочевки. для работы со стандартными контролами - WinSkin.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Старый 27.07.2012, 13:22   #14
Paranoia
AnyKey`щик
 
Регистрация: 27.07.2012
Сообщений: 5
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Очень информативный пример, спасибо.

Только вот перемещение окна как-то странной сделано, более того, окно может "открепиться" от курсора в момент его перетаскивания.

Лучше использовать эту WinAPI:
SendMessage_(WindowID(hWnd), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
(Offline)
 
Ответить с цитированием
Старый 27.07.2012, 16:00   #15
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)

Сообщение от Paranoia Посмотреть сообщение
Лучше использовать эту WinAPI:
SendMessage_(WindowID(hWnd), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
ну раз лучше, значит используйте ..)
а у меня этот вариант вызывает утечки памяти - место занимаемое процессом в памяти растет при перетаскивании и не уменьшается. а мой работает без утечек и не отцепляясь. видимо, я тормоз и слишком медленно водил мышкой, вот и не отцепилась. можно и другие варианты поискать.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 18:03.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com