Beispiel :
Code: Alles auswählen
Structure _List
*next._List
*first._List
Daten.l
EndStructure
Enumeration #WM_USER + 1
#mc_add
#mc_remove
EndEnumeration
Procedure GetGadgetParent()
!EXTRN _PB_Object_GetThreadMemory@4
!EXTRN _PB_Gadget_Globals
!MOV Eax,[_PB_Gadget_Globals]
!PUSH Eax
!CALL _PB_Object_GetThreadMemory@4
!MOV Eax,[Eax]
ProcedureReturn
EndProcedure
Procedure ControlProc(hwnd,msg,wParam,lParam)
*object._List = GetWindowLong_(hwnd,0)
If msg = #mc_add
If *object ; wenn *object bereits allociert wurde
*object\next = AllocateMemory(SizeOf(_List)) ; naechstes object allocieren
*object\next\first = *object\first ; erstes object auch hier speichern
*object = *object\next ; zeiger auf das naechste object biegen
*object\Daten = lParam ; daten anhaengen
Else
*object = AllocateMemory(SizeOf(_List))
*object\first = *object ; den ersten speichern
*object\Daten = lParam ; daten anhaengen
EndIf
SetWindowLong_(hwnd,0,*object) ; letzte object im Fenster speichern
EndIf
If msg = #WM_PAINT
hdc = BeginPaint_(hwnd,@ps.PAINTSTRUCT)
If *object
*object = *object\first ; erstes object auswaehlen
While *object
memdc = CreateCompatibleDC_(hdc)
hOldBM = SelectObject_(memdc, *object\Daten)
BitBlt_(hdc,0,(index * 21), 20,20, memdc, 0, 0, #SRCCOPY)
hOldBM = SelectObject_(memdc, hOldBM)
index + 1
*object = *object\next
Wend
EndIf
EndPaint_(hwnd,@ps)
EndIf
If msg = #WM_DESTROY
If *object
*object = *object\first ; erstes object auswaehlen
While *object
FreeMemory(*object)
*object = *object\next
Wend
EndIf
DestroyWindow_(hwnd)
EndIf
ProcedureReturn DefWindowProc_(hwnd,msg,wParam,lParam)
EndProcedure
Procedure CreateControl(id,x,y,cx,cy)
Static isRegister
Protected wndC.WNDCLASS
hInstance = GetModuleHandle_(0)
If isRegister = #False
wndC\style = #CS_VREDRAW | #CS_HREDRAW
wndC\lpfnWndProc = @ControlProc()
wndC\cbWndExtra = 4 ; platz fuer ein long ... 4 = 0, 8 = 4 usw ...
wndC\hInstance = hInstance
wndC\hCursor = LoadCursor_(0, #IDC_CROSS)
wndC\hbrBackground = GetSysColorBrush_(#COLOR_WINDOW) ; -1)
wndC\lpszClassName = @"MyControl"
If RegisterClass_(wndC)
isRegister = #True
EndIf
EndIf
style = #WS_VISIBLE|#WS_CHILD
hwnd = CreateWindowEx_(#WS_EX_STATICEDGE,"MyControl",0,style,x,y,cx,cy,GetGadgetParent(),id,hInstance,0)
ProcedureReturn hwnd
EndProcedure
; beispiel ____
hwnd = OpenWindow(0,0,0,300,300,"")
CreateGadgetList(hwnd)
For i = 0 To 5
CreateImage(i,20,20,32)
StartDrawing(ImageOutput(i))
Box(0,0,20,20,Random($FFFFFF))
StopDrawing()
Next
Handle = CreateControl(0,10,10,100,100)
SendMessage_(Handle,#mc_add,0,ImageID(0))
SendMessage_(Handle,#mc_add,0,ImageID(1))
SendMessage_(Handle,#mc_add,0,ImageID(2))
Handle = CreateControl(1,120,10,100,100)
SendMessage_(Handle,#mc_add,0,ImageID(2))
SendMessage_(Handle,#mc_add,0,ImageID(1))
SendMessage_(Handle,#mc_add,0,ImageID(0))
SendMessage_(Handle,#mc_add,0,ImageID(1))
Handle = CreateControl(2,10,120,100,100)
SendMessage_(Handle,#mc_add,0,ImageID(0))
SendMessage_(Handle,#mc_add,0,ImageID(1))
SendMessage_(Handle,#mc_add,0,ImageID(2))
SendMessage_(Handle,#mc_add,0,ImageID(3))
SendMessage_(Handle,#mc_add,0,ImageID(4))
Handle = CreateControl(3,120,120,100,100)
SendMessage_(Handle,#mc_add,0,ImageID(5))
SendMessage_(Handle,#mc_add,0,ImageID(4))
SendMessage_(Handle,#mc_add,0,ImageID(3))
SendMessage_(Handle,#mc_add,0,ImageID(2))
SendMessage_(Handle,#mc_add,0,ImageID(1))
Repeat
event = WaitWindowEvent()
Until event = #WM_CLOSE