Seite 2 von 3

Verfasst: 17.08.2006 18:30
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
  
  
  
  

Verfasst: 18.08.2006 00:56
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:

Verfasst: 18.08.2006 01:28
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.

Verfasst: 18.08.2006 01:33
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?

Verfasst: 18.08.2006 01:46
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:

Verfasst: 18.08.2006 01:53
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)?

Verfasst: 18.08.2006 02:14
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.

Verfasst: 18.08.2006 02:24
von PureLust
Ok ... thanx für den Tip ... Buch ist gekauft !!! :allright:

Verfasst: 18.08.2006 06:48
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.

Verfasst: 18.08.2006 10:32
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. ;)