Mehrdimensionale LinkedListe verwalten.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hab hier mal ein kleines Beispiel wie du listen in einem eigenen Control bringst.

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
  
  
  
  
Zuletzt geändert von edel am 18.08.2006 18:04, insgesamt 1-mal geändert.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

@edel, ...

auha .... mal wieder herrlicher, aber harter Tobak von Dir !!! :allright:


Da muss ich mich erst mal tiefer rein denken um zu verstehen was Du da genau wie machst.
(Bin leider (noch?) nicht wirklich fit in Punkto API und muss mir erst jeden API-Call mühsam zur Brust nehmen.) /:->

Aber wie heisst es so schön: Man wächst mit seinen Herausforderungen.

PS: Ich hoffe mein Petzold kommt morgen. :roll:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureLust hat geschrieben: PS: Ich hoffe mein Petzold kommt morgen. :roll:
Den hab ich hier rumliegen, bin aber nicht so begeistert von dem, wie die meisten anderen. Hab hier noch nen älteren dt. WinAPI wälzer, der mir mehr bringt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

ts-soft hat geschrieben:Hab hier noch nen älteren dt. WinAPI wälzer, der mir mehr bringt.
Hättest Du da evtl. 'nen Titel und Autor von?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Windows 95/Winows NT API Bible
WIN 32
Programmierung

Richard J. Simon
SAMS
24502

1.60 + Versandkosten :lol: (wird wohl nicht mehr stehen das Angebot)
1355 Seiten API Müll :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Ist das gut als Nachschlagewerk zu gebrauchen und 'ne gute API-Referenz?

Hmmm ... "Windows 95/Winows NT API Bible" ... ist das nicht inzwischen ein wenig veraltet?
Der Petzold ist ja immerhin noch von 2002.

PS: Das hier ist es nicht zufällig, oder?

Oder isses DAS vielleicht (2. von 3 Bänden - aber es hat eine etwas andere Bestellnummer als Deins: 24501)?
Zuletzt geändert von PureLust am 18.08.2006 02:16, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Mein Petzold ist Auflage 5

Der zweite Link ist der Band 2, ich habe den ersten, der heißt auch nicht mit
Band. Es gibt aber wohl nen Nachfolger für W2k

Das alter spielt keine so grosse Rolle, weil die neueren API-Funktionen ja
auch nur in Programmen ab W2K einsetzbar sind. Die setzt man also nur ein,
wenn es nicht umgehbar ist, bzw. alle Nutzer auch W2k und höher nutzen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Ok ... thanx für den Tip ... Buch ist gekauft !!! :allright:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

PureLust hat geschrieben:@edel, ...

auha .... mal wieder herrlicher, aber harter Tobak von Dir !!! :allright:


Da muss ich mich erst mal tiefer rein denken um zu verstehen was Du da genau wie machst.
(Bin leider (noch?) nicht wirklich fit in Punkto API und muss mir erst jeden API-Call mühsam zur Brust nehmen.) /:->

Aber wie heisst es so schön: Man wächst mit seinen Herausforderungen.

PS: Ich hoffe mein Petzold kommt morgen. :roll:
hmmm ... dachte du machst nen eigenes Control :?

Naja wie auch immer, wenn du mehr ueber eigene Fensterklassen
wissen moechtest, ist 'der Petzold' sicherlich die erste Wahl. Dort
wird das Thema wirklich breit durchgekaut. Davon mal ab, das Buch
sollte man aber eh im Schrank stehen haben.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

edel hat geschrieben:hmmm ... dachte du machst nen eigenes Control :?
Naja, halt mit dem Wissen und den Möglichkeiten die ich bisher so in PB (und eben dem wenigen in WinAPI) habe.
Bisher ist das Control (oder besser Gadget?) eher eine reine PB Geschichte - also nicht systemweit.

Wie ich das so richtig als Klasse definiere usw. hätte ich momentan noch keine Ahnung.
Aber da werde ich mich wohl dran geben, wenn das ganze Teil so funktinoert wie ich es möchte - dann ist die Basis (also das ganze Drawing, das Eventhandling etc.) ja schon mal da.

Mal schauen ob's so gut wird wie ich hoffe. ;)
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten