|
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
07.10.2011, 00:10
|
#1
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Скин с альфа-каналом (UpdateLayeredWindow_)
появившееся было желание писать на пурике моментально ударилось лицом о несговорчивость некоторых функций API. в частности UpdateLayeredWindow_(), которая должна была преобразовать полупрозрачный рисунок в многослойное окно (т.е. практически в шкурку с альфа-каналом).
в чем может быть дело?
может, дело в win7? тогда, если не затруднит, кто-нибудь гляньте на другой винде и отпишитесь, не высветляется ли левый верхний угол иконки фотошопа?
или, может, дело в чем-то другом?
я понимаю, что есть прекрасная функция WinSkin(), но она не передает полутонов канала прозрачности. при низком разрешении экрана границы картинки выходят несколько угловатыми.
исходники кода и скомпилированные экзешники в аттаче. (заменено на рабочий вариант)
проблема решена, рабочий вариант с комментариями:
__________________
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 за это полезное сообщение:
|
|
07.10.2011, 00:15
|
#2
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
Картинка не дает сосредоточиться на решении проблемы
|
(Offline)
|
|
Эти 8 пользователя(ей) сказали Спасибо Romanzes за это полезное сообщение:
|
|
07.10.2011, 00:23
|
#3
|
ПроЭктировщик
Регистрация: 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
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
Вот как он себя ведет. У меня семерка.
|
(Offline)
|
|
07.10.2011, 00:34
|
#5
|
ПроЭктировщик
Регистрация: 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
|
ПроЭктировщик
Регистрация: 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 за это полезное сообщение:
|
|
07.10.2011, 23:26
|
#7
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
У меня работает отлично
|
(Offline)
|
|
10.10.2011, 23:04
|
#8
|
Оператор ЭВМ
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.10.2011, 17:37
|
#9
|
ПроЭктировщик
Регистрация: 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
|
ПроЭктировщик
Регистрация: 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
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
исправил ошибки, чуток оптимизировал, расставил комментарии.
закинул основную писанину в подключаемый модуль.
можно включать его в проект и спокойно писать, скажем, приложения для десктопа.
архив размещаю в первом посте.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.12.2011, 15:07
|
#12
|
AnyKey`щик
Регистрация: 10.12.2011
Сообщений: 1
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
Подскажите пожалуйста как добавить на это окно кнопку и вывести текст? Раньше учил VB, сейчас возникла необходимость написать утилиту изпользуя скин, пример хорошо демонстрирует как прикрутить скин, но как реализовать простейшие контролы не понятно. Буду рад любой помощи!
|
(Offline)
|
|
10.12.2011, 22:36
|
#13
|
ПроЭктировщик
Регистрация: 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
|
AnyKey`щик
Регистрация: 27.07.2012
Сообщений: 5
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Скин с альфа-каналом (UpdateLayeredWindow_)
Очень информативный пример, спасибо.
Только вот перемещение окна как-то странной сделано, более того, окно может "открепиться" от курсора в момент его перетаскивания.
Лучше использовать эту WinAPI:
SendMessage_(WindowID(hWnd), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
|
(Offline)
|
|
27.07.2012, 16:00
|
#15
|
ПроЭктировщик
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:37.
|