  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 17.05.2005, 18:42    Titel: WIN-API: END Winmain(...) => Entry Points | 
				     | 
			 
			
				
  | 
			 
			
				HI Community!
 
 
In vielen Win-Api-Beispielen findet sich diese Zeile:
 
 	  | Code: | 	 		  | end WinMain( GetModuleHandle( null ), null, Command$, SW_NORMAL ) | 	  
 
WinMain ist dabei eine FUNCTION.
 
END mit Parameter gibt bekanntermaßen einen Errorlevel ans System bzw aufrufende Programm zurück.
 
In den Beispielen ist oft ein Kommentar "Entry Point" dabei.
 
 
Was genau passiert an dieser Stelle?
 
Und, da das Programm ja offensichtlich beendet wird: Wie kann ich nach einem solchen Aufruf eigene Anweisungen ausführen lassen?
 
 
Thx für die AWs!
 
 
Have a nice day
 
Ciao _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 17.05.2005, 20:09    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
evtl. etwas zu einfach erklärt:
 
 
Die Sub WinMain definiert das Fenster und meldet es bei Windows an.
 
Dabei wird auch die function WndProc als Empfänger der Windows-Ereignisse 
 
(key, mouse, button - up,down,clik) festgelegt.
 
Dann wird das Fenster erstellt, angezeigt und in einer Endlosschleife 
 
die Windows-Ereignisse abgefragt ob das eigene Fenster geschlossen wird.
 
 
Die function WndProc regelt dabei die Windows-Ereignisse, dort kanst du
 
andere Sub/Functions einschleusen, die dann nach einem Windows-Ereigniss ausgeführt würden.
 
 
Um die winMain einmal "ins rollen" zu bringen gibt es diesen "Entry-Point".
 
Ohne geht es nicht, aber in anderer Form -> siehe toolbar.bas.
 
Keine Sub, da ist einfach das "Programm" die WinMain.
 
 
Ergänzung:
 
Vor dem Aufruf der WinMain kannst du deine Anweisungen eingeben.
 
Danach hat es wenig Sinn, nicht nur wegen des end - Befehls 
 
(die WinMain ließe sich auch anders aufrufen), diese Anweisungen 
 
würden aber erst nach dem dein Fenster geschlossen wird ausgeführt.
 
 
 
Gruß
 
 Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 17.05.2005, 21:11    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ok, soweit versteh ichs... aber: Wie kann ich dann dieses Fenster kontrollieren?
 
In den beispielprogrammen (z.B. bei der Menüleiste) wird ja auf die User-Eingaben reagiert, es wird also ausgegeben, welcher Menüpunkt angeklickt wurde... _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 18.05.2005, 09:25    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
 	  | Zitat: | 	 		  Die function WndProc regelt dabei die Windows-Ereignisse, dort kannst du 
 
andere Sub/Functions einschleusen, die dann nach einem Windows-Ereigniss ausgeführt würden. | 	   
 
Hier könntest du deine Anweisungen auf die Aufrufe der Menüeinträge abarbeiten:
 
  	  | Code: | 	 		   ''
 
 '' menu item selected
 
 ''
 
  case WM_COMMAND
 
   wmId    = loword( wParam )
 
   wmEvent = hiword( wParam )
 
 
 
   menu = GetMenu( hWnd )
 
         
 
   ''
 
   '' parse the menu selections
 
   ''
 
   select case wmId
 
    '' quit
 
    case MENUID_FILE_EXIT
 
     PostMessage hWnd, WM_CLOSE, 0, 0
 
     exit function
 
 
    case MENUID_FILE_OPEN
 
     (Anweisung)
 
 
    case MENUID_EDIT_CUT
 
     (Anweisung)
 
 
    case (etc.)
 
 
   end select
 
...
 
usw. | 	  
 
Etwas weiter im Listing findest du "case WM_KEYDOWN" dort kannst du die Tastenbetätigungen abarbeiten.
 
Das ist nur ein Vorschlag, man kann das auch aus der Windprog heraus nehmen und jeweils eine eigene Sub anfügen.
 
 
Ist ein Weg mit vielen Hürden, nur mit WinAPI-Funktionen eine Applikation aufzubauen.
 
Mit allen Feinheiten bin ich auch nicht vertraut!
 
Gruß
 
 Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 18.05.2005, 10:12    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				OK, ich glaube, schön langsam verstehe ich es....
 
 
Zuerst muss das Fenster bei windows Anmemeldet werden, dazu ist anscheinend Registerclass() zuständig. Das entspricht wohl dem 
 
VB-Befehl LOAD Form, oder?
 
Und Form.SHOW erledigt dann CreateWindowEx?
 
 
Damit Windows weiß, welche Art von Fenster es nun erstellen und verwalten soll, bekommt es einen ganzen Block an Infos in einem UDT:
 
 	  | Code: | 	 		  with wcls
 
   .style         = CS_HREDRAW or CS_VREDRAW
 
   [b].lpfnWndProc   = @WndProc[/b]
 
   .cbClsExtra    = 0
 
   .cbWndExtra    = 0
 
   .hInstance     = hInstance
 
   .hIcon         = LoadIcon( null, IDI_APPLICATION )
 
   .hCursor       = LoadCursor( null, IDC_ARROW )
 
   .hbrBackground = GetStockObject( WHITE_BRUSH )
 
   .lpszMenuName  = null
 
   .lpszClassName = strptr( szAppName )
 
end with | 	  
 
Der fett markierte Teil ist dabei ein Pointer zu dem Programm, das die eigentlichen Programmteile enthält. (Sollte also auch mit PROCPTR angegeben werden können, oder?)
 
 
 	  | Code: | 	 		  function WndProc ( byval hWnd as long, _
 
                   byval message as long, _
 
                   byval wParam as long, _
 
                   byval lParam as long ) as integer | 	  
 
Die letzten drei Parameter enthalten Informationen, was geschehen ist (z.B. Klick auf den Schließen-Button).
 
 
Und dieser Teil
 
 	  | Code: | 	 		  while ( GetMessage( wMsg, null, 0, 0 ) <> false )    
 
   TranslateMessage wMsg
 
   DispatchMessage  wMsg
 
wend | 	  
 
Verarbeitet die Messages, und sendet sie über DispatchMessage an WndProc, bzw das Programm, das oben bei wcls.lpfnWndProc angegeben wurde.
 
 
War das eine richtige Zusammenfassung des ganzen Themas, oder sind ein paar Fehler drin?
 
Habe ich vielleicht etwas ausgelassen?
 
 
 
Danke für die Erklärungen!
 
 
Nur noch zwei Fragen:
 
Wozu ist nun dieser Errorlevel zuständig?
 
In den meisten beispielen wird WinMain ja immer noch per END WinMain aufgerufen...
 
Und:
 
die Variable hWnd, auf die man von Zeit zu Zeit stößt ist die Nummer des Fensters, oder?
 
 
 
Have a nice day
 
Ciao _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 18.05.2005, 13:27    Titel: Hallo, ja, so sehe ich das auch | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
ja, so sehe ich das auch.
 
 	  | Zitat: | 	 		  | Habe ich vielleicht etwas ausgelassen? | 	  Nichts Wesentliches, ich vermute da spielt noch einiges im Hintergrund mit!   
 
 
 	  | Zitat: | 	 		  | Sollte also auch mit PROCPTR angegeben werden können, oder? | 	  Einfach ".lpfnWndProc   = @WndProc", Windows weiß dann schon damit was anzufangen!
 
 
 	  | Zitat: | 	 		  | Wozu ist nun dieser Errorlevel zuständig? | 	  ?, worauf (welches Listing) beziehst du die Frage?
 
 
 	  | Zitat: | 	 		  | die Variable hWnd, auf die man von Zeit zu Zeit stößt ist die Nummer des Fensters, oder? | 	  Wird als Handle - (Griff, Henkel) bezeichnet, ist aber richtig eine "Kennziffer für das Fenster".
 
Nicht nur Fenster, auch andere Objekte werden jeweils mit ihrem hWnd-Handle angesprochen.
 
 
Gruß
 
 Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 18.05.2005, 16:22    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				In dem beispielen, die ich gesehen habe, wird WinMain immer als Parameter von End aufgerufen, also
 
 
END WinMain (...)
 
 
Da WM eine Funktion ist, wird ja ein Wert zurückgegeben, und der wiederrum wird durch END als Errorlevel ans System zurückgegeben. Welche Bedeutung hat das?
 
 
 
Wenn das so weiter geht, kann man den Thread hier als Tutorial "Wie verwende ich die Win-API in freeBASIC" veröffentlichen   _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 18.05.2005, 20:30    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
aah, das ist wohl nur ein Rückgabewert an ein aufrufendes Programm (vergleichbar mit ErrorLevel im DOS oder Batch).
 
 
Windows wertet das, meines Wissens, nicht aus. Fehler werden gleich von Windos mit Hinweis auf Abbruch des Programms angezeigt.
 
 	  | Zitat: | 	 		  | Wenn das so weiter geht, kann man den Thread hier als Tutorial "Wie verwende ich die Win-API in freeBASIC"  | 	  Warum nicht..   
 
Dazu noch ein Listing:
 
 	  | Code: | 	 		  Option Explicit
 
 
' alle benötigten API-Deklarationen sind bei FB hier enthalten.
 
'$include once:'win\kernel32.bi' 
 
'$include once:'win\user32.bi' 
 
 
' Die Fensterprozedur unseres selbsterzeugten Fensters,
 
' hier treffen alle Ereigniss ein.
 
' Dies ist eine Function, also nicht der Anfang unseres Programms.
 
Function WndProc ( ByVal hWnd As UInteger, _ 
 
                   ByVal uMsg As UInteger, _ 
 
                   ByVal wParam As UInteger, _ 
 
                   ByVal lParam As UInteger ) As UInteger 
 
 
  Select Case (uMsg)
 
    'Rechteck zeichnen, Text schreiben
 
    Case WM_PAINT
 
      Dim rct As RECT
 
      Dim pnt As PAINTSTRUCT
 
      Dim hDC As UInteger 
 
 
      hDC = BeginPaint (hWnd, pnt)
 
      GetClientRect hWnd, rct
 
      DrawText hDC,"Hallo Welt, es grüßt FreeBasic!", -1, _
 
                 rct, DT_SINGLELINE or DT_CENTER or DT_VCENTER
 
      EndPaint hWnd, pnt
 
      Exit Function
 
 
    'Taste gedrückt?     
 
     Case WM_KEYDOWN 
 
       If (lobyte(wParam) = 27 ) Then 
 
         PostMessage hWnd, WM_CLOSE, 0, 0 
 
      End If 
 
 
 
   'Fenster geschlossen, dann abmelden  
 
     Case WM_DESTROY 
 
        PostQuitMessage 0            
 
      Exit Function 
 
  End Select 
 
 
  'Alle anderen Messages weitergeben
 
  WndProc = DefWindowProc( hWnd, uMsg, wParam, lParam )    
 
End Function 
 
 
'############################
 
'Hier beginnt das Hauptprogramm (WinMain), der Einstiegspunkt.
 
' (der Berüchtigte Entry Point)
 
'############################
 
 Dim wMsg As MSG 
 
 Dim wcls As WNDCLASS      
 
 Dim hWnd As UInteger 
 
 Dim szAppName As String 
 
 Dim Shared hInstance As UInteger 
 
 hInstance = GetModuleHandle (null) 'Welches Handle haben wir? 
 
 
'Zunächst wird über die Struktur WNDCLASS die Klasse (das neue Fenster) "beschrieben".    
 
'Hier legen wir u.a. den Fensterstil, den Namen und die Hintergrundfarbe fest
 
'und, das ist ganz wichtig - die Funktion (WndProc), 
 
'welche alle Windows-Ereignisse erhalten soll.    
 
 szAppName = "Windemo" 
 
 With wcls
 
   .style         = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW 
 
   .lpfnWndProc   = @WndProc
 
   .cbClsExtra    = 0 
 
   .cbWndExtra    = 0 
 
   .hInstance     = hInstance 
 
   .hIcon         = 0
 
   .hCursor       = 0
 
   .hbrBackground = COLOR_BACKGROUND
 
   .lpszMenuName  = null 
 
   .lpszClassName = strptr( szAppName ) 
 
 End With
 
 
'Danach wird die Klasse im System angemeldet (registriert).       
 
 If ( RegisterClass( wcls ) = 0 ) Then 
 
   MessageBox null, "Die Fensterklasse konnte nicht registriert werden.",_
 
     szAppName, MB_ICONERROR 
 
   End 1
 
 End If 
 
 
'Als nächstes wird das Fenster erstellt. 
 
'Diese Aufgabe übernimmt die CreateWindowEx-Funktion, 
 
'welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.).     
 
 hWnd = CreateWindowEx( 0, _ 
 
        szAppName, "Fenster Demo", _ 
 
        WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_BORDER, _ 
 
        150, 150, 250, 80, _ 
 
        null, null, hInstance, null ) 
 
                          
 
'Schleife durchlaufen, bis das Fenster geschlossen wird (DoEvents)
 
 Do Until (GetMessage (wMsg, null, 0, 0 ) = FALSE)
 
   TranslateMessage wMsg 
 
   DispatchMessage  wMsg 
 
 Loop
 
   
 
 End 0 | 	  
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 18.05.2005, 22:32    Titel: Flying Windows | 
				     | 
			 
			
				
  | 
			 
			
				Hallo
 
kleiner Gag,
 
 
 	  | Code: | 	 		  'Als nächstes wird das Fenster erstellt. 
 
'Diese Aufgabe übernimmt die CreateWindowEx-Funktion, 
 
'welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.).     
 
  hWnd = CreateWindowEx( 0, _ 
 
        szAppName, "fliegende Fenster Demo", _ 
 
        WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_BORDER, _ 
 
        300, 200, 250, 80, _ 
 
        null, null, hInstance, null )  | 	                        
 
Hier, an dieser Stelle, dies in das Prog einfügen: 	  | Code: | 	 		    Dim i As Integer 
 
  For i = 1 To 300 Step 15
 
   SetWindowPos hWnd, 0, i, i, 250+i, 80+i, 0
 
   TranslateMessage wMsg 
 
   DispatchMessage  wMsg 
 
   Sleep 15
 
  next | 	  
 
 
 	  | Code: | 	 		  'Schleife durchlaufen, bis das Fenster geschlossen wird (DoEvents)
 
 Do Until (GetMessage (wMsg, null, 0, 0 ) = FALSE)
 
   TranslateMessage wMsg 
 
   DispatchMessage  wMsg 
 
 Loop | 	  
 
Viel Spaß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 19.05.2005, 13:53    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				hab das Beispiel von volta mal um eine Beenden Nachfrage erweitert und kosmetische Änderungen vorgenommen    
 
 	  | Code: | 	 		  Option Explicit
 
 
' alle benötigten API-Deklarationen sind bei FB hier enthalten.
 
'$include once:'win\kernel32.bi'
 
'$include once:'win\user32.bi'
 
'$include once:'win\gdi32.bi'
 
 
' Die Fensterprozedur unseres selbsterzeugten Fensters,
 
' hier treffen alle Ereigniss ein.
 
' Dies ist eine Function, also nicht der Anfang unseres Programms.
 
Function WndProc ( ByVal hWnd As UInteger, _
 
                   ByVal uMsg As UInteger, _
 
                   ByVal wParam As UInteger, _
 
                   ByVal lParam As UInteger ) As UInteger
 
 
  Select Case (uMsg)
 
    ' Fenster wird geschlossen
 
    Case WM_CLOSE
 
      select case MessageBox(hwnd, "Schon Schluß?","Wie", MB_YESNO or MB_ICONQUESTION)
 
        case IDNO
 
          uMsg = 0
 
      end select
 
    'Rechteck zeichnen, Text schreiben
 
    Case WM_PAINT
 
      Dim rct As RECT
 
      Dim pnt As PAINTSTRUCT
 
      Dim hDC As UInteger
 
 
      hDC = BeginPaint (hWnd, pnt)
 
      GetClientRect hWnd, rct
 
      DrawText hDC,"FreeBasic erblickt das Licht der Welt", -1, _
 
                 rct, DT_SINGLELINE or DT_CENTER or DT_VCENTER
 
      EndPaint hWnd, pnt
 
      Exit Function
 
 
    'Taste gedrückt?     
 
     Case WM_KEYDOWN
 
       If (lobyte(wParam) = 27 ) Then
 
         PostMessage hWnd, WM_CLOSE, 0, 0
 
      End If
 
 
 
   'Fenster geschlossen, dann abmelden 
 
     Case WM_DESTROY
 
        PostQuitMessage 0           
 
      Exit Function
 
  End Select
 
 
  'Alle anderen Messages weitergeben
 
  WndProc = DefWindowProc( hWnd, uMsg, wParam, lParam )   
 
End Function
 
 
'############################
 
'Hier beginnt das Hauptprogramm (WinMain), der Einstiegspunkt.
 
' (der Berüchtigte Entry Point)
 
'############################
 
 Dim wMsg As MSG
 
 Dim wcls As WNDCLASS     
 
 Dim hWnd As UInteger
 
 Dim szAppName As String
 
 Dim Shared hInstance As UInteger
 
 hInstance = GetModuleHandle (null) 'Welches Handle haben wir?
 
 
'Zunächst wird über die Struktur WNDCLASS die Klasse (das neue Fenster) "beschrieben".    
 
'Hier legen wir u.a. den Fensterstil, den Namen und die Hintergrundfarbe fest
 
'und, das ist ganz wichtig - die Funktion (WndProc),
 
'welche alle Windows-Ereignisse erhalten soll.   
 
 szAppName = "Windemo"
 
 With wcls
 
   .style         = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW
 
   .lpfnWndProc   = @WndProc
 
   .cbClsExtra    = 0
 
   .cbWndExtra    = 0
 
   .hInstance     = hInstance
 
   .hIcon         = 0
 
   .hCursor       = 0
 
   .hbrBackground = GetStockObject(WHITE_BRUSH)
 
   .lpszMenuName  = null
 
   .lpszClassName = strptr( szAppName )
 
 End With
 
 
'Danach wird die Klasse im System angemeldet (registriert).       
 
 If ( RegisterClass( wcls ) = 0 ) Then
 
   MessageBox null, "Die Fensterklasse konnte nicht registriert werden.",_
 
     szAppName, MB_ICONERROR
 
   End 1
 
 End If
 
 
'Als nächstes wird das Fenster erstellt.
 
'Diese Aufgabe übernimmt die CreateWindowEx-Funktion,
 
'welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.).     
 
 hWnd = CreateWindowEx( 0, _
 
        szAppName, "Fenster Demo", _
 
        WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_BORDER, _
 
        CW_USEDEFAULT, CW_USEDEFAULT, 280, 80, _
 
        null, null, hInstance, null )
 
                         
 
'Schleife durchlaufen, bis das Fenster geschlossen wird (DoEvents)
 
 Do Until (GetMessage (wMsg, null, 0, 0 ) = FALSE)
 
   TranslateMessage wMsg
 
   DispatchMessage  wMsg
 
 Loop
 
   
 
 End 0 | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 19.05.2005, 14:39    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Ich habe angefange, meine Drohung, das ganze hier zu einem Tutorial werden zu lassen, in die Tat umzusetzen.
 
 
Das ganze kann man hier begutachten.
 
Naja, ist noch nicht wirklich viel, aber was solls.
 
 
Für Verbesserungen, Vorschläge und das Übliche an Kommantaren zu solchen Tuts bin ich natürlich immer offen; ich würde mich freuen, wenn mir mal jemand eine PM/Email schicken würde.
 
Und wenn es irgendwann mal tatsächlich ein vorzeigbares Tutorial sein, versuche ich, Mecki dazu zu überreden, dass er das ganze auf seine Seite stellt, irgendwo zur Referenz.
 
 
Da fällt mir ein, ich sollte ihm eigentlich mal wieder meine Änderungen schicken...
 
 
 
@ts-soft:
 
Zu dem Zeitpunkt, als ich das Tutorial angefangen habe, hast du noch nicht gepostet. Wenn du willst, wirst du aber genauso wie volta und Peterharder im Vorwort erwähnt.
 
 
 
DANKE euch, jetzt verstehe ich immerhin mal die Hello-Word's... mal sehen, wie schnell ich was interaktives hinbekomm... 
 
CASE WM_KEYDOWN   _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 19.05.2005, 15:17    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Dusky_Joe hat Folgendes geschrieben: | 	 		  
 
@ts-soft:
 
Zu dem Zeitpunkt, als ich das Tutorial angefangen habe, hast du noch nicht gepostet. Wenn du willst, wirst du aber genauso wie volta und Peterharder im Vorwort erwähnt. | 	  Nicht so wichtig   
 
 	  | Dusky_Joe hat Folgendes geschrieben: | 	 		  
 
DANKE euch, jetzt verstehe ich immerhin mal die Hello-Word's... mal sehen, wie schnell ich was interaktives hinbekomm... 
 
CASE WM_KEYDOWN   | 	  Die Buttons usw. sind auch alles nur kleine Fensterchen (ChildWindow), denen entsprechende Stile zugeordnet werden. Ein paar kleine Wrapper-Funktionen, die einem die Paras, die sich fast nie ändern ersparen und schon ist man einen Schritt weiter.
 
 
Tutorial gefällt mir, bis auf die weiß auf schwarz dargestellten Passagen. Daran merkt man auch, das ich no nie was mit QB gemacht habe    
 
 
 
CASE WM_COMMAND
 
Select LoWord(wParam)
 
Case btnTschüß
 
Gruß
 
Thomas | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 19.05.2005, 16:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Vielleicht ja auch interessant, hab mal einen Button auf dem Fenster erzeugt.
 
 	  | Code: | 	 		  '$include once:'win\kernel32.bi'
 
'$include once:'win\user32.bi'
 
 
Function WndProc ( ByVal hWnd As UInteger, _
 
                   ByVal uMsg As UInteger, _
 
                   ByVal wParam As UInteger, _
 
                   ByVal lParam As UInteger ) As UInteger
 
 
  Select Case (uMsg)
 
    ' Fenster wird geschlossen
 
    Case WM_CLOSE
 
      select case MessageBox(hwnd, "Schon Schluß?","Wie", MB_YESNO or MB_ICONQUESTION)
 
        case IDNO
 
          uMsg = 0
 
      end select
 
    case WM_COMMAND
 
      If loword( wParam ) = btnOK then
 
         PostMessage hWnd, WM_CLOSE, 0, 0
 
      end If
 
    'Taste gedrückt?     
 
     Case WM_KEYDOWN
 
       If (lobyte(wParam) = 27 ) Then
 
         PostMessage hWnd, WM_CLOSE, 0, 0
 
      End If
 
 
 
   'Fenster geschlossen, dann abmelden 
 
     Case WM_DESTROY
 
        PostQuitMessage 0           
 
      Exit Function
 
  End Select
 
 
  'Alle anderen Messages weitergeben
 
  WndProc = DefWindowProc( hWnd, uMsg, wParam, lParam )   
 
End Function
 
 
'############################
 
'Hier beginnt das Hauptprogramm (WinMain), der Einstiegspunkt.
 
' (der Berüchtigte Entry Point)
 
'############################
 
 Dim wMsg As MSG
 
 Dim wcls As WNDCLASS     
 
 Dim hWnd As UInteger
 
 Dim szAppName As String
 
 Dim Shared hInstance As UInteger
 
 hInstance = GetModuleHandle (null) 'Welches Handle haben wir?
 
 dim btnOK as UInteger
 
'Zunächst wird über die Struktur WNDCLASS die Klasse (das neue Fenster) "beschrieben".    
 
'Hier legen wir u.a. den Fensterstil, den Namen und die Hintergrundfarbe fest
 
'und, das ist ganz wichtig - die Funktion (WndProc),
 
'welche alle Windows-Ereignisse erhalten soll.   
 
 szAppName = "Windemo"
 
 With wcls
 
   .style         = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW
 
   .lpfnWndProc   = @WndProc
 
   .cbClsExtra    = 0
 
   .cbWndExtra    = 0
 
   .hInstance     = hInstance
 
 
   .hIcon         = 0
 
   .hCursor       = 0
 
   .hbrBackground = 16
 
   .lpszMenuName  = null
 
   .lpszClassName = strptr( szAppName )
 
 End With
 
 
'Danach wird die Klasse im System angemeldet (registriert).       
 
 If ( RegisterClass( wcls ) = 0 ) Then
 
   MessageBox null, "Die Fensterklasse konnte nicht registriert werden.",_
 
     szAppName, MB_ICONERROR
 
   End 1
 
 End if
 
 
'Als nächstes wird das Fenster erstellt.
 
'Diese Aufgabe übernimmt die CreateWindowEx-Funktion,
 
'welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.).     
 
 hWnd = CreateWindowEx( 0, _
 
        szAppName, "Mein erster Button", _
 
        WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_BORDER, _
 
        CW_USEDEFAULT, CW_USEDEFAULT, 150, 80, _
 
        null, null, hInstance, null )
 
 btnOK = CreateWindowEx( 0, _
 
         "Button", "Und Tschüß", _
 
         WS_CHILD or WS_VISIBLE, _
 
         10, 10, 120, 30, _
 
         hWnd, _
 
         0, 0, 0 )
 
'Schleife durchlaufen, bis das Fenster geschlossen wird (DoEvents)
 
 Do Until (GetMessage (wMsg, null, 0, 0 ) = FALSE)
 
   TranslateMessage wMsg
 
   DispatchMessage  wMsg
 
 Loop
 
   
 
 End 0 | 	      | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		PeterHarder
 
  
  Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
  | 
		
			
				 Verfasst am: 19.05.2005, 16:54    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Apropo Tutorial: jemand wollte doch das folgende (englischsprachige) Tutorial von der C-Syntax nach freeBASIC übersetzten:
 
 
http://www.winprog.org/tutorial/
 
 
Ist daraus eigentlich was geworden? Im Prinzip läßt sich ja vieles übernehmen.
 
 
Gruß, Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
 
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 19.05.2005, 17:11    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | PeterHarder hat Folgendes geschrieben: | 	 		  | Ist daraus eigentlich was geworden? Im Prinzip läßt sich ja vieles übernehmen. | 	  Hallo Peter, das weiß ich jetzt nicht, aber ein ähnliches Tutorial in deutsch gibts unter: http://www.win-api.de/tutorials.php
 
 
Gruß
 
Thomas | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		volta
 
 
  Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 19.05.2005, 22:02    Titel: Win-API pur | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
schön Erweiterungen, @ts-soft Herzlichen Dank
 
Ich habe mal alles zusammen gestellt, für Win-API pur schon nicht schlecht!
 
(das erste mal, daß ich nur mit API-Funktionen ein Fenster baue)
 
 	  | Code: | 	 		  Option Explicit
 
 
' alle benötigten API-Deklarationen sind bei FB hier enthalten.
 
'$include once:'win\kernel32.bi' 
 
'$include once:'win\user32.bi' 
 
 
' Die Fensterprozedur unseres selbsterzeugten Fensters,
 
' hier treffen alle Ereigniss ein.
 
' Dies ist eine Function, also nicht der Anfang unseres Programms.
 
Function WndProc ( ByVal hWnd As UInteger, _ 
 
                   ByVal uMsg As UInteger, _ 
 
                   ByVal wParam As UInteger, _ 
 
                   ByVal lParam As UInteger ) As UInteger 
 
 
  Select Case (uMsg)
 
    ' Fenster wird geschlossen 
 
    Case WM_CLOSE 
 
      Select Case MessageBox(hwnd, "Schon Schluß?","Wie Bitte...", _
 
                  MB_YESNO or MB_ICONQUESTION) 
 
        Case IDNO 
 
          uMsg = 0 
 
      End Select 
 
 
    'Button gedrückt?
 
    Case WM_COMMAND 
 
      If loword( wParam ) = 0 Then 
 
         PostMessage hWnd, WM_CLOSE, 0, 0 
 
      End If 
 
 
    'Rechteck zeichnen, Text schreiben
 
    Case WM_PAINT
 
      Dim rct As RECT
 
      Dim pnt As PAINTSTRUCT
 
      Dim hDC As UInteger 
 
 
      hDC = BeginPaint (hWnd, pnt)
 
      GetClientRect hWnd, rct
 
      DrawText hDC,"FreeBasic schaut aus dem Fenster!", -1, _
 
                 rct, DT_SINGLELINE Or DT_CENTER Or DT_VCENTER
 
      EndPaint hWnd, pnt
 
      Exit Function
 
 
    'Taste gedrückt?     
 
     Case WM_KEYDOWN
 
       If (lobyte(wParam) = 27 ) Then 
 
         PostMessage hWnd, WM_CLOSE, 0, 0 
 
      End If 
 
 
 
   'Fenster geschlossen, dann abmelden  
 
     Case WM_DESTROY 
 
        PostQuitMessage 0            
 
      Exit Function 
 
  End Select 
 
 
  'Alle anderen Messages weitergeben
 
  WndProc = DefWindowProc( hWnd, uMsg, wParam, lParam )    
 
End Function 
 
 
'kleine Animation gefällig?
 
Sub flywin (ByVal handle As Integer, ByVal message As MSG)
 
 'Fenster bewegt sich von links oben zur Mitte und wird größer
 
  Dim i As Integer 
 
  For i = 1 To 300 Step 15
 
   SetWindowPos handle, 0, i, i, 250+i, 80+i, 0
 
   TranslateMessage message 
 
   DispatchMessage  message 
 
   Sleep 15
 
  Next
 
End Sub 
 
 
 
'############################
 
'Hier beginnt das Hauptprogramm (WinMain), der Einstiegspunkt.
 
' der berüchtigte Entry Point
 
'############################
 
 Dim wMsg As MSG 
 
 Dim wcls As WNDCLASS      
 
 Dim hWnd As UInteger 
 
 Dim btnOK as UInteger 
 
 Dim szAppName As String 
 
 Dim Shared hInstance As UInteger 
 
 hInstance = GetModuleHandle (null) 'Welches Handle haben wir? 
 
 
'Zunächst wird über die Struktur WNDCLASS die Klasse (das neue Fenster) "beschrieben".    
 
'Hier legen wir u.a. den Fensterstil, den Namen und die Hintergrundfarbe fest
 
'und, das ist ganz wichtig - die Funktion (WndProc), 
 
'welche alle Windows-Ereignisse erhalten soll.    
 
 szAppName = "Windemo" 
 
 With wcls
 
   .style         = CS_OWNDC Or CS_HREDRAW Or CS_VREDRAW 
 
   .lpfnWndProc   = @WndProc
 
   .cbClsExtra    = 0 
 
   .cbWndExtra    = 0 
 
   .hInstance     = hInstance 
 
   .hIcon         = LoadImage(hInstance, "C:\freebasic\bin\win32\res\fblogo.ico", _
 
                       IMAGE_ICON, 16,16, LR_LOADFROMFILE)
 
   .hCursor       = LoadCursor( null, IDC_ARROW )
 
   .hbrBackground = COLOR_BACKGROUND
 
   .lpszMenuName  = null 
 
   .lpszClassName = strptr( szAppName ) 
 
 End With
 
 
'Danach wird die Klasse im System angemeldet (registriert).       
 
 If ( RegisterClass( wcls ) = 0 ) Then 
 
   MessageBox null, "Die Fensterklasse konnte nicht registriert werden.",_
 
     szAppName, MB_ICONERROR 
 
   End 1
 
 End If 
 
 
'Als nächstes wird das Fenster erstellt. 
 
'Diese Aufgabe übernimmt die CreateWindowEx-Funktion, 
 
'welche eine Vielzahl an Parametern erwartet (Namen, Titel, Position, Größe usw.).     
 
  hWnd = CreateWindowEx( 0, _ 
 
        szAppName, "freeBASIC Fenster", _ 
 
        WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_BORDER, _ 
 
        300, 200, 250, 80, _ 
 
        null, null, hInstance, null )                       
 
 
 flywin (hWnd,wMsg) 'Als Sub, wer es nicht möchte kann es REM'en
 
 
'Ein Button auf dem Fenster wird auch mit der CreateWindowEx-Funktion erstellt
 
btnOK = CreateWindowEx( 0, _ 
 
         "Button", "Und Tschüß", _ 
 
         WS_CHILD or WS_VISIBLE, _ 
 
         10, 10, 120, 30, _ 
 
         hWnd,0, 0, 0 ) 
 
 
'Schleife durchlaufen, bis das Fenster geschlossen wird (DoEvents)
 
 Do Until (GetMessage (wMsg, null, 0, 0 ) = FALSE)
 
   TranslateMessage wMsg 
 
   DispatchMessage  wMsg 
 
 Loop
 
   
 
 End 0 | 	  
 
Ach ja, das fblogo.ico kann verwendet werden, evtl. müsst ihr den Pfad anpassen.
 
Gruß
 
Volta _________________ Warnung an Choleriker: 
 
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 21.05.2005, 18:44    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hi Leute!
 
 
Na toll!
 
Ich habe mir gedacht: Jetz geh einen Tag lang mal nicht online. Stattdessen versuchtst du einmal, Buttons in dein Programm zu bekommen. Nach ca 1/2h rumprobieren hab ichs dann endlich geschafft, einen funktionierenden Button zu bauen, der auch auf meine Klicks reagiert.
 
Und jetzt muss ich lesen, das ts so freundlich war, und das alles schon gepostet hat... naja, so prägt's sich leichter ein  
 
 
Ganz interessant ist vielleicht auch ein Programm, das sich daraus entwickelt hat:
 
http://dhost.info/siteofkaos/freeBASIC/highscore.bas
 
Wie ich sehe, sind ein paar kleine Fehler in der WndProc (habe das LOWORD bei den Buttons vergessen; wozu ist eigentlich das HIWORD von wpraram?)
 
Aber doch ganz lehrreich  
 
Bitte achtet darauf, dass beim Compilern das Konsole-Fenster mitgeöffnet werden muss, weil sonst das Textfeld nirgendwo ausgegeben werden kann...
 
 
Außerdem hab ich das Tutorial komplett neu angefangen. Eigentlich ist nur das Vorwort gleich geblieben... 
 
look at this!
 
http://dhost.info/siteofkaos/freeBASIC/WIN-GUI_Grundlagen.html
 
 
Wer das alte sucht, wird erstaunt sein, wenn er rausfindet, dass jetzt eine ganz andere Seite da ist; die neue URL für das alte Tut ist:
 
http://dhost.info/siteofkaos/freeBASIC/_Alt_Grundlagen.html
 
 
 
Nicht zu vergessen: die zurzeit wohl neueste Version der Referenz + ein wenig Gedöns drum herum:
 
http://dhost.info/siteofkaos/freeBASIC/Inhalt.html
 
Dazu zu sagen wäre noch, dass ich die Referenz selbst in letzter Zeit kaum bearbeitet habe. Neu sind dafür aber die Gfx.html (9.38 KB), Grundlagen.html (10.9 KB) unsupported.html (6.56 KB) und Compiler.html (2.43 KB).
 
 
Zu allen Daten sollten von der oben angegeben Seite Links führen. Wenn ich eine Vergessen haben sollte:
 
 
http://dhost.info/siteofkaos/freeBASIC/ und dann einfach den entsprechenden Dateinamen anhängen.
 
 
 
Viel Spaß! _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 21.05.2005, 19:00    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				@Dusky_Joe
 
Gute Arbeit   
 
 
>> wozu ist eigentlich das HIWORD von wpraram?
 
Dort wird IMHO die Art des Ereignisses ermittelt. Also linksclick, doppellinksclick, rechtsclick usw. je nach control. Unsere vereinfachte Abfrage ist mehr sowas wie GetFocus.
 
 
Gruß
 
Thomas | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Dusky_Joe
 
  
  Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
  | 
		
			
				 Verfasst am: 21.05.2005, 19:19    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Bitte, danke, gern geschehn  
 
Ich bin mal gespannt, ob ich morgen (oder heute abend?) endlich mal damit anfange, WndProc zu erklären, oder ob ich mal wieder ne neue Version rausbringe  
 
 
Wenn Ihr nix dagegenhabt, werde ich bei den nächsten Updates eure Beispielprogramme reinstellen und erklären. _________________ fully biological degradable
 
 
Once, the big wave arrives, you've got two ways, you can go:
 
Either, you ride it, or you don't do.
 
But, if you don't ride, you'll never know wether you'd have gone wet. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ts-soft
 
  
  Anmeldungsdatum: 13.02.2005 Beiträge: 26 Wohnort: Berlin
  | 
		
			
				 Verfasst am: 21.05.2005, 19:36    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Dusky_Joe hat Folgendes geschrieben: | 	 		  | Wenn Ihr nix dagegenhabt, werde ich bei den nächsten Updates eure Beispielprogramme reinstellen und erklären. | 	  Ich hab nichts dagegen, aber das meiste ist ja von volta   . Wenn ich die Grundsyntax (Runtimefunktionen) von FreeBASIC endlich gerafft habe, kann ich meine API-Kenntnisse auch endlich mal umsetzen      | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
     |