Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

WIN-API: END Winmain(...) => Entry Points
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 17.05.2005, 18:42    Titel: WIN-API: END Winmain(...) => Entry Points Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.05.2005, 20:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 17.05.2005, 21:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 18.05.2005, 09:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 18.05.2005, 10:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 18.05.2005, 13:27    Titel: Hallo, ja, so sehe ich das auch Antworten mit Zitat

Hallo,
ja, so sehe ich das auch.
Zitat:
Habe ich vielleicht etwas ausgelassen?
Nichts Wesentliches, ich vermute da spielt noch einiges im Hintergrund mit! zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 18.05.2005, 16:22    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 18.05.2005, 20:30    Titel: Antworten mit Zitat

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.. grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 18.05.2005, 22:32    Titel: Flying Windows Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 19.05.2005, 13:53    Titel: Antworten mit Zitat

hab das Beispiel von volta mal um eine Beenden Nachfrage erweitert und kosmetische Änderungen vorgenommen zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.05.2005, 14:39    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 19.05.2005, 15:17    Titel: Antworten mit Zitat

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 lächeln
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 zwinkern
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 verlegen


CASE WM_COMMAND
Select LoWord(wParam)
Case btnTschüß
Gruß
Thomas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 19.05.2005, 16:50    Titel: Antworten mit Zitat

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
zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 19.05.2005, 16:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 19.05.2005, 17:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 19.05.2005, 22:02    Titel: Win-API pur Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 21.05.2005, 18:44    Titel: Antworten mit Zitat

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 zwinkern

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 zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 21.05.2005, 19:00    Titel: Antworten mit Zitat

@Dusky_Joe
Gute Arbeit Daumen rauf!

>> 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
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 21.05.2005, 19:19    Titel: Antworten mit Zitat

Bitte, danke, gern geschehn Zunge rausstrecken
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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
ts-soft



Anmeldungsdatum: 13.02.2005
Beiträge: 26
Wohnort: Berlin

BeitragVerfasst am: 21.05.2005, 19:36    Titel: Antworten mit Zitat

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 zwinkern . Wenn ich die Grundsyntax (Runtimefunktionen) von FreeBASIC endlich gerafft habe, kann ich meine API-Kenntnisse auch endlich mal umsetzen happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz