Voici un exemple qui fonctionne très bien, tiré d'un code du forum anglais pour un skin window avec png. Je l'ai adapté pour ton cas précis et ça devrait le faire.
les images doivent être au format png avec transparence (l'effet en est d'autant plus sympa)
- Pour déplacer la fenêtre, maintenir le curseur sur la surface du plan bouton gauche enfoncé.
- Pour rendre les objets cliquables apparents, changement du curseur standard par un curseur perso lorsque la souris est au dessus de l'objet
- Ajout: chaque image cliquable ouvre une imagette par clic gauche au dessus d'elle même.
Code : Tout sélectionner
;IMAGE DE FOND => http://www.wolforan.com/images/Autres_images/Plan%20maison.png
;CURSEUR => http://www.wolforan.com/images/Autres_images/EpéeLaser01.cur
#AC_SRC_OVER = $0
#AC_SRC_ALPHA = $1
#ULW_ALPHA = $2
;-Mouse over de NetMaestro
#CUSTOM_MSG_MOUSEENTER = #WM_APP+1
#CUSTOM_MSG_MOUSELEAVE = #WM_APP+2
Structure HDATA
oldproc.i
tracking.i
EndStructure
Import "Gadget.lib"
PB_Gadget_SendGadgetCommand(hwnd, command)
EndImport
Procedure HoverProc(hwnd, msg, wparam, lparam)
*hData.HDATA = GetProp_(hwnd, "hdata")
Protected oldproc = *hData\oldproc
Select msg
Case #WM_NCDESTROY
RemoveProp_(hwnd, "hdata")
FreeMemory(*hData)
Case #WM_MOUSEMOVE
If Not *hData\tracking
*hData\tracking = #True
PB_Gadget_SendGadgetCommand(hwnd, #CUSTOM_MSG_MOUSEENTER)
With tm.TRACKMOUSEEVENT
\cbSize = SizeOf(TRACKMOUSEEVENT)
\dwFlags = #TME_LEAVE
\hwndTrack = hwnd
EndWith
TrackMouseEvent_(@tm)
CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
ProcedureReturn 0
EndIf
Case #WM_MOUSELEAVE
PB_Gadget_SendGadgetCommand(hwnd, #CUSTOM_MSG_MOUSELEAVE)
*hData\tracking = #False
CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
ProcedureReturn 0
EndSelect
ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
EndProcedure
ProcedureDLL EnableHoverEvents(gadget)
*hData.HDATA = AllocateMemory(SizeOf(HDATA))
*hData\tracking = #False
*hData\oldproc = SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC, @HoverProc())
ProcedureReturn SetProp_(GadgetID(gadget), "hdata", *hData)
EndProcedure
Macro WindowAlphaInit(WindowNr)
SetWindowLongPtr_(WindowID(WindowNr), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(WindowNr), #GWL_EXSTYLE) | #WS_EX_LAYERED)
EndMacro
Macro WindowAlphaColor(WindowNr, Color)
SetLayeredWindowAttributes_(WindowID(WindowNr), Color, 0, #LWA_COLORKEY)
EndMacro
Procedure WindowAlphaImage(WindowNr, ImageNr, Alpha=$FF)
Protected ImageID, X, Y, Width, Height
Protected hDC, bmi.BITMAPINFO, pt.POINT, Blend.BLENDFUNCTION
Protected Color, R, G, B, A
Protected Result = #False
If IsImage(ImageNr) = 0 Or ImageDepth(ImageNr) <> 32 : ProcedureReturn Result : EndIf
ImageID = ImageID(ImageNr)
Width = ImageWidth(ImageNr)
Height = ImageHeight(ImageNr)
; Precalculate scale:
Protected Dim Scale.f($FF)
For X = 0 To $FF
Scale(X) = X / $FF
Next
; Prepare array size:
Protected Dim Image.l(Width - 1, Height - 1)
hDC = StartDrawing(ImageOutput(ImageNr))
If hDC
With bmi\bmiHeader
\biSize = SizeOf(BITMAPINFOHEADER)
\biWidth = Width
\biHeight = Height
\biPlanes = 1
\biBitCount = 32
\biCompression = #BI_RGB
EndWith
GetDIBits_(hDC, ImageID, 0, Height, @Image(), @bmi, #DIB_RGB_COLORS) ; Copy image to memory
; Modify memory:
For Y = 0 To Height - 1
For X = 0 To Width - 1
Color = Image(X, Y)
A = Alpha(Color)
If A < $FF
R = Red(Color) * Scale(A)
G = Green(Color) * Scale(A)
B = Blue(Color) * Scale(A)
Image(X, Y) = RGBA(R, G, B, A)
EndIf
Next
Next
SetDIBits_(hDC, ImageID, 0, Height, @Image(), @bmi, #DIB_RGB_COLORS) ; Copy memory back to image
; Set image to window background:
With Blend
\BlendOp = #AC_SRC_OVER
\BlendFlags = 0
\SourceConstantAlpha = Alpha
\AlphaFormat = #AC_SRC_ALPHA
EndWith
Result = UpdateLayeredWindow_(WindowID(WindowNr), #Null, #Null, @bmi + SizeOf(Long), hDC, @pt, 0, @Blend, #ULW_ALPHA)
StopDrawing()
EndIf
ProcedureReturn Result
EndProcedure
Procedure MainCallback(hWnd, uMsg, wParam, lParam)
Protected Result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_SIZE, #WM_MOVE, #WM_PAINT
ResizeWindow(0, WindowX(1), WindowY(1), #PB_Ignore, #PB_Ignore)
EndSelect
ProcedureReturn Result
EndProcedure
Procedure WindowImageGadgetResized(GadgImg, GrabImg, ResImg, posx, posy, dimw, dimy)
; GadgImg = n° du gadget,
; GrabImg = n° du GrabImage,
; ResImg = nouvelle image redimensionnée,
; posx, posy, dimw, dimy = coordonnées de l'image à découpée et à recréer
GrabImage(GrabImg, ResImg, posx, posy, dimw, dimy)
ResizeImage(ResImg,dimw*2,dimy*2) ; on double la taille de l'image
Larg = ImageWidth(ResImg) : Haut = ImageHeight(ResImg) : Rx = GadgetX(GadgImg): Ry = GadgetY(GadgImg) : xw = WindowX(0): yw = WindowY(0)
If OpenWindow(3, xw + Rx , yw + Ry + 10, Larg, Haut, "" ,#PB_Window_BorderLess); #PB_Window_SystemMenu|#PB_Window_Tool )
StickyWindow(3,1)
nimg = ImageGadget(#PB_Any,0,0,WindowWidth(3),WindowHeight(3),ImageID(ResImg))
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = nimg
Select EventType()
Case #PB_EventType_LeftClick
Break
EndSelect
EndIf
Case #PB_Event_CloseWindow : quit = 1
EndSelect
Until quit = 1
If IsImage(ResImg) <> 0
FreeImage(ResImg)
EndIf
CloseWindow(3)
EndIf
EndProcedure
Curseur$ = "EpéeLaser01.cur"
UsePNGImageDecoder()
If LoadImage(1,"Plan maison.png") ; image pour le fond
If OpenWindow(0, 0, 0, ImageWidth(1), ImageHeight(1), "Plan de la maison", #PB_Window_BorderLess | #PB_Window_Invisible | #PB_Window_ScreenCentered)
WindowAlphaInit(0)
WindowAlphaImage(0, 1)
;Une fenête pour les gadgets
If OpenWindow(1, 0, 0, ImageWidth(1), ImageHeight(1), "", #PB_Window_BorderLess | #PB_Window_Invisible | #PB_Window_ScreenCentered, WindowID(0))
SetWindowColor(1, $FF00FF)
WindowAlphaInit(1)
WindowAlphaColor(1, $FF00FF)
;Dans l'exemple on prend la voiture comme image inter active...
GrabImage(1, 0, 467,197,44,74) ;coordonnées obtenues avant avec le code commenté dans la boucle
ImageGadget(0,467,197,44,74,ImageID(0)) ;image recréée avec
; et aussi la chambre 2
GrabImage(1, 4, 83,81,75,60)
ImageGadget(4,83,81,75,60,ImageID(4))
;Sur l'image de fond, un panneau d'information
TextGadget(10,(ImageWidth(1) - 80)/2, 100, 300, 30, "")
SetGadgetColor(10,#PB_Gadget_BackColor,RGB(255,255,255))
SetGadgetColor(10,#PB_Gadget_FrontColor,RGB(81, 120, 174))
;On place un bouton en dehors de la zone du plan (on peut en mettre plusieurs ce qui est intéressant...
ButtonGadget(3, (ImageWidth(1) - 150), (ImageHeight(1) - 30), 150, 30, "Close window")
;Appel de la callback
SetWindowCallback(@MainCallback(), 1)
;On affiche les fenêtres
HideWindow(0, #False)
HideWindow(1, #False)
;on active le mouse event
EnableHoverEvents(0)
EnableHoverEvents(4)
Repeat
;POUR OBTENIR LES COORDONNEES X ET Y SUR LA FENETRE
;PERMET DE CREER ET PLACER TES IMAGES BOUTONS SUR LES CORRESPONDANCES DU FOND
; If WaitWindowEvent()
; GetCursorPos_(@cp.point)
; GetWindowRect_(WindowID(0),gr.RECT)
; If PtInRect_(@gr,PeekQ(@cp))
; MapWindowPoints_(#Null, WindowID(0),cp,1)
; Debug Str(cp\x)+"\"+Str(cp\y)
; EndIf
; ;EndIf
; EndIf
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = 3
Break
EndIf
If EventGadget() = 0 ;{
Select EventType()
Case #PB_EventType_LeftClick
SetGadgetText(10,"Affichage de la voiture redimensionnée, cool!"+Chr(10)+"Clic gauche sur l'agrandissement pour le fermer")
WindowImageGadgetResized(0, 1, ResImg = 100, 467,197,44,74)
Case #PB_EventType_RightClick
SetGadgetText(10,"Clic droit sur la voiture")
Case #CUSTOM_MSG_MOUSEENTER ; sur le gadget
hCurseur = LoadCursorFromFile_(Curseur$)
SetSystemCursor_(hCurseur,#OCR_NORMAL)
DestroyCursor_(hCurseur)
SetGadgetText(10, "Cliquez dessus pour voir")
Case #CUSTOM_MSG_MOUSELEAVE ;quitte le gadget
SystemParametersInfo_(#SPI_SETCURSORS,0,#Null,0)
SetGadgetText(10, "")
EndSelect
;}
EndIf
If EventGadget() = 4 ;{
Select EventType()
Case #PB_EventType_LeftClick
SetGadgetText(10,"Affichage de la chambre 2 redimensionnée, cool!"+Chr(10)+"Clic gauche sur l'agrandissement pour le fermer")
WindowImageGadgetResized(4, 1, ResImg = 100, 83,81,75,60)
Case #PB_EventType_RightClick
SetGadgetText(10,"Clic droit sur la chambre 2")
Case #CUSTOM_MSG_MOUSEENTER ; sur le gadget
hCurseur = LoadCursorFromFile_(Curseur$)
SetSystemCursor_(hCurseur,#OCR_NORMAL)
DestroyCursor_(hCurseur)
SetGadgetText(10, "Cliquez dessus pour voir")
Case #CUSTOM_MSG_MOUSELEAVE ;quitte le gadget
SystemParametersInfo_(#SPI_SETCURSORS,0,#Null,0)
SetGadgetText(10, "")
EndSelect
;}
EndIf
Case #WM_LBUTTONDOWN
SendMessage_(WindowID(1), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndSelect
ForEver
SystemParametersInfo_(#SPI_SETCURSORS,0,#Null,0)
For im = 0 To 5
If IsImage(im) <> 0
FreeImage(im)
EndIf
Next
EndIf
EndIf
EndIf