|
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, 19: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: 1875 Wohnort: D59192
|
Verfasst am: 17.05.2005, 21: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, 22: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: 1875 Wohnort: D59192
|
Verfasst am: 18.05.2005, 10: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, 11: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: 1875 Wohnort: D59192
|
Verfasst am: 18.05.2005, 14: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, 17: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: 1875 Wohnort: D59192
|
Verfasst am: 18.05.2005, 21: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: 1875 Wohnort: D59192
|
Verfasst am: 18.05.2005, 23: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, 14: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, 15: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, 16: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, 17: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, 17: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, 18: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: 1875 Wohnort: D59192
|
Verfasst am: 19.05.2005, 23: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, 19: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, 20: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, 20: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, 20: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.
|
|