|
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 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 06.05.2006, 16:13 Titel: Problem mit Tutorial auf freebasic.de |
|
|
Hallo Leute!
Ich hab das Tutorial auf Freebasic.de zu Winapi mal gelesen, weil ich gehört hab, WinApi soll schneller als SDL sein.
Ich hatte dann folgenden Code:
Code: | #include "windows.bi"
DECLARE FUNCTION WinMain(BYVAL hInstance AS integer, BYVAL hPrevInstance AS integer,_
szCmdLine AS integer,_
BYVAL iCmdShow AS integer)
DECLARE FUNCTION WinProc(BYVAL hWnd AS integer, BYVAL message AS integer,_
BYVAL wParam AS integer, BYVAL lParam AS integer)
END WinMain(GetModuleHandle(NULL), null, COMMAND$, SW_NORMAL)) |
Das Problem: Die Parameter für WinMain sind falsch.
Kann mir jemand sagen, was ich ändern muss?
(und wenn bei freebasic.de angemeldet ist, könnte die Person dann ja gleich das Tutorial korrigieren) |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 08.05.2006, 12:21 Titel: |
|
|
nicht nur in den Deklarationen gibt es ab FB0.15 Änderungen.
Kleinigkeiten änderten sich auch bei einigen WinApi-Aufrufen.
Nach alter Version konnte man ruhig mal einen Pointer/Handle als Integer/Long definieren, die Funktion lief trotzdem.
Ab FB0.15 wird das strenger gehandhabt.
Dir hier nur die neuen Deklarationen zu nennen wird dich nicht wesentlich weiter bringen.
Schau dir mal so ein Grundgerüst eines Windows z.B. die "Hello.Bas" genau an, das zeigt dir schon die Unterschiede zu den Beispielen im alten WinAPI-Tutorial.
Zitat: | ..könnte die Person dann ja gleich das Tutorial korrigieren |
freebasic.de hat Folgendes geschrieben: | Solange bis die FreeBASIC.de-Seite mit dem neuen CMS-System und CodesharingX läuft, sind sämtliche Update- und Upload-Möglichkeiten durch User leider außer Kraft gesetzt. |
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 14.05.2006, 12:12 Titel: |
|
|
Code: | #include once "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DECLARE FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
END WinMain(GetModuleHandle(NULL), null, COMMAND$, SW_NORMAL) |
Und was ist dann daran falsch? Kommt irgend nen Fehler bei WinMain....(undefined reference winmain@16 oder so) |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 14.05.2006, 13:44 Titel: |
|
|
Code: | #include once "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
END Function |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 14.05.2006, 14:53 Titel: |
|
|
Danke.
Hab jetzt ein bischen weiter gemacht:
Code: | #include once "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
FUNCTION=0
SELECT CASE message
CASE WM_DESTROY
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
function=DefWindowProc(hWnd, Message, wParam, lParam)
END Function
FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DIM wMsg AS MSG
DIM wc AS WNDCLASS
DIM hWnd AS HWND
DIM szAppName AS string
szAppName="Spiel"
WITH wc
.style=CS_HREDRAW OR CS_VREDRAW
.lpfnWndProc=@WinProc
.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
RegisterClass(@wc)
hWnd=CreateWindowEx(0, szAppName, "Tolles Proggie", WS_OVERLAPPEDWINDOW,_
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,_
NULL, NULL, hInstance, NULL)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
WHILE (GetMessage(@wMsg, NULL,0,0)<>FALSE)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
WEND
function=wMsg.wParam
END FUNCTION |
Wieso wird da das Fenster nicht angezeigt? |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 14.05.2006, 15:15 Titel: |
|
|
Hi,
du hast 2 Funktionen .. und sonst nichts.. , warum sollte sich da ein Fenster zeigen?
Stell deine Deklarationen und den Entry Point an den Anfang, wie du es oben richtig geschrieben hast.
Code: | #include "windows.bi"
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DECLARE FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
' Entry point
END WinMain(GetModuleHandle(NULL), null, COMMAND$, SW_NORMAL))
...
...
|
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 14.05.2006, 15:55 Titel: |
|
|
Danke! Das geht erstmal
Jetzt hab ich weiter gemacht, und versucht, ein Abgerundetes Viereck zu machen, das sich bewegen kann:
Code: | #include "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DIM SHARED tasten(4)
DIM SHARED AS integer x, y
x=50:y=100
DIM SHARED felder(20,20) AS integer
DIM SHARED mutex
mutex=MUTEXCREATE
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
FUNCTION=0
SELECT CASE message
CASE WM_PAINT
DIM hDc, hDc2 AS HDC
DIM ps AS PAINTSTRUCT
DIM bitmap AS HBITMAP
DIM pinsel AS HBRUSH
hDc=BeginPaint(hWnd,@ps)
hDc2=CreateCompatibleDC(hDc)
bitmap=CreateCompatibleBitmap(hDc, 640,480)
SelectObject(hDc2, bitmap)
pinsel=SelectObject(hDc2, CreateSolidBrush(RGB(255,255,255)))
RoundRect(hDc2, 0, 0, 640,480,1,1)
RoundRect(hDc2, 50,100,500,400,1,1)
MUTEXLOCK mutex
RoundRect(hDc2, x,y, x+20,y+20,10,10)
MUTEXUNLOCK mutex
BitBlt(hDc, 0,0,640,480,hDc2, 0,0,SRCCOPY)
DeleteObject(bitmap)
DeleteDC(hDc2)
EndPaint(hWnd, @ps)
CASE WM_KEYDOWN
SELECT CASE wParam
CASE VK_UP: tasten(1)=1
CASE VK_DOWN: tasten(2)=1
CASE VK_LEFT: tasten(3)=1
CASE VK_RIGHT: tasten(4)=1
END SELECT
InvalidateRect(hWnd, NULL, false)
CASE WM_KEYUP
SELECT CASE wParam
CASE VK_UP: tasten(1)=0
CASE VK_DOWN: tasten(2)=0
CASE VK_LEFT: tasten(3)=0
CASE VK_RIGHT: tasten(4)=0
END SELECT
InvalidateRect(hWnd, NULL, false)
CASE WM_DESTROY
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
function=DefWindowProc(hWnd, Message, wParam, lParam)
END Function
FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DIM wMsg AS MSG
DIM wc AS WNDCLASS
DIM hWnd AS HWND
DIM szAppName AS string
szAppName="01"
WITH wc
.style=CS_HREDRAW OR CS_VREDRAW
.lpfnWndProc=@WinProc
.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
RegisterClass(@wc)
hWnd=CreateWindowEx(0, szAppName, "Tolles Proggie", WS_OVERLAPPEDWINDOW,_
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,_
NULL, NULL, hInstance, NULL)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
WHILE (GetMessage(@wMsg, NULL,0,0)<>FALSE)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
IF tasten(1)=1 AND y>100 THEN y-=1
IF tasten(2)=1 AND y<380 THEN y+=1
IF tasten(3)=1 AND x>50 THEN x-=1
IF tasten(4)=1 AND x<480 THEN x+=1
WEND
function=wMsg.wParam
END FUNCTION
END WinMain(GetModuleHandle(NULL), null, "", SW_NORMAL) |
Kann mir jemand sagen, wieso das so seehr langsam ist(bewegt sich zwar, geht aber schlecht)?
Es kommen folgende Warnungen:
Compiler hat Folgendes geschrieben: | C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(27) : warning level 0: Implicit conversion
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(2 : warning level 0: Passing scalar as pointer, at parameter 1 of CREATECOMPATIBLEDC()
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(29) : warning level 0: Passing scalar as pointer, at parameter 1 of CREATECOMPATIBLEBITMAP()
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(39) : warning level 0: Passing scalar as pointer, at parameter 1 of BITBLT() |
|
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 15.05.2006, 11:58 Titel: |
|
|
Hi,
wer außer dir selbst soll diesen Quellcode durchschauen?
Kein Kommentar was du mit den Anweisungen bezweckst?
ich blick nicht durch
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 15.05.2006, 16:44 Titel: |
|
|
Oh, sorry.
Hab die Kommentare eingefügt:
Code: | #include "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DIM SHARED tasten(4)
DIM SHARED AS integer x, y
x=50:y=100
DIM SHARED felder(20,20) AS integer
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
FUNCTION=0
SELECT CASE message
CASE WM_PAINT
DIM hDc, hDc2 AS HDC
DIM ps AS PAINTSTRUCT
DIM bitmap AS HBITMAP
DIM pinsel AS HBRUSH
hDc=BeginPaint(hWnd,@ps)'Beginn des Zeichnens
hDc2=CreateCompatibleDC(hDc) 'Erstellen einer Bitmap, auf die
bitmap=CreateCompatibleBitmap(hDc, 640,480)'gezeichnet wird(->Flimmerfrei)
SelectObject(hDc2, bitmap) 'Auswählen der Bitmap
pinsel=SelectObject(hDc2, CreateSolidBrush(RGB(255,255,255)))'Schwarze Farbe
RoundRect(hDc2, 0, 0, 640,480,1,1)'Großes Rahmenviereck, Inhalt Weiß
RoundRect(hDc2, 50,100,500,400,1,1)'Viereck, in dem die Bewegung abläuft
RoundRect(hDc2, x,y, x+20,y+20,10,10)'Der Kreis
BitBlt(hDc, 0,0,640,480,hDc2, 0,0,SRCCOPY)'Fertiges Bild wird auf den Bildschirm gebracht
DeleteObject(bitmap)
DeleteDC(hDc2)'Löschen der Entstandenden Daten
EndPaint(hWnd, @ps)'Ende des Zeichnens
'Nun: Setzen im Array tasten, wenn etwas gedrückt wird, damit die gedrückten Tasten
' gespeichert sind
CASE WM_KEYDOWN
SELECT CASE wParam
CASE VK_UP: tasten(1)=1
CASE VK_DOWN: tasten(2)=1
CASE VK_LEFT: tasten(3)=1
CASE VK_RIGHT: tasten(4)=1
END SELECT
InvalidateRect(hWnd, NULL, false)
CASE WM_KEYUP
SELECT CASE wParam
CASE VK_UP: tasten(1)=0
CASE VK_DOWN: tasten(2)=0
CASE VK_LEFT: tasten(3)=0
CASE VK_RIGHT: tasten(4)=0
END SELECT
InvalidateRect(hWnd, NULL, false)
CASE WM_DESTROY
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
function=DefWindowProc(hWnd, Message, wParam, lParam)
END Function
FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DIM wMsg AS MSG
DIM wc AS WNDCLASS
DIM hWnd AS HWND
DIM szAppName AS string
szAppName="01"
WITH wc
.style=CS_HREDRAW OR CS_VREDRAW
.lpfnWndProc=@WinProc
.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
RegisterClass(@wc)
hWnd=CreateWindowEx(0, szAppName, "Tolles Proggie", WS_OVERLAPPEDWINDOW,_
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,_
NULL, NULL, hInstance, NULL)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
'Bis Hier: Fenstererstellung
WHILE (GetMessage(@wMsg, NULL,0,0)<>FALSE)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)'Auswertung des passierten
IF tasten(1)=1 AND y>100 THEN y-=1
IF tasten(2)=1 AND y<380 THEN y+=1
IF tasten(3)=1 AND x>50 THEN x-=1
IF tasten(4)=1 AND x<480 THEN x+=1
'Bewegung des Kreieses falls etwas gedrückt wird
WEND
function=wMsg.wParam
END FUNCTION
END WinMain(GetModuleHandle(NULL), null, "", SW_NORMAL) |
|
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 15.05.2006, 17:34 Titel: |
|
|
Progger_X hat Folgendes geschrieben: | ...
Es kommen folgende Warnungen:
Compiler hat Folgendes geschrieben: | C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(27) : warning level 0: Implicit conversion
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(2 : warning level 0: Passing scalar as pointer, at parameter 1 of CREATECOMPATIBLEDC()
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(29) : warning level 0: Passing scalar as pointer, at parameter 1 of CREATECOMPATIBLEBITMAP()
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/01.bas(39) : warning level 0: Passing scalar as pointer, at parameter 1 of BITBLT() |
|
Diese Meldungen hab ich doch schon mal gesehn?!
Link
Du bist also nicht der einzige mit dem Problem.
Dessen Workaround ist:
Zitat: | <$fbc>" "<$file>" -s gui -w 1 -x "<$file_name>.exe" |
Zur Geschwindigkeit:
Kein Ahnung, ich arbeite nicht mit der WinAPI. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 15.05.2006, 21:46 Titel: |
|
|
ok Progger_X,
wenn ich das richtig sehe, dann erstellst du bei jedem WM_PAINT ein neues Zeichenobjekt, zeichnest es und lösch es wieder.
Warum nicht unter WM_CREATE das Zeichenobjekt einmal erstellen und bei jedem WM_PAINT altes Zeichenobjekt löschen, an neuer Position zeichnen.
Sieh mal in examples/windows/gui/bitmap.bas nach, sollte schneller sein.
Auch deine Tastatursteuerung ist etwas ungewöhnlich, gehört eigentlich nicht in die Message-Schleife.
EDIT\
schau dir mal dieses Beispiel an
http://forum.qbasic.at/viewtopic.php?p=23367#23367 _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 17.05.2006, 15:08 Titel: |
|
|
Wo gehört die Tastensteuerung eigentlich hin?
Seltsamerweise benutz das Programm vom Domenik die selben Befehle.
Komisch, dass das funktioniert.
Zu dem Workaround: ist das jetzt immer so, dass das net klappt, oder hab ich jetzt nen Fehler gemacht? |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 17.05.2006, 18:20 Titel: |
|
|
Progger_X hat Folgendes geschrieben: | Wo gehört die Tastensteuerung eigentlich hin? | wenn der Focus auf deinem Window ist wird auf Tastendruck deine WM_KEYDOWN,WM_KEYUP abgearbeitet.
Progger_X hat Folgendes geschrieben: | Seltsamerweise benutz das Programm vom Domenik die selben Befehle.
Komisch, dass das funktioniert. |
Sicher wird jedes API-Programm was zeichnet die gleichen Aufrufe benutzen, aber es kommt doch darauf an die Aufrufe sinnvoll aneinander zu reihen und vorher die richtigen Definitionen an der richtigen Stelle zu setzen. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 18.05.2006, 13:53 Titel: |
|
|
Wenn ich den Tastendruck abarbeite, wenn das Ereigniss WM_KEYUP oder WM_KEYDOWN eintritt, dann wird der dazwischen ja nicht abgearbeitet(sprich: wenn man die taste gedrückt hält, dann bewegt es sich nur einmal, obwohl sich das ganze eigentlich so lange bewegen sollte, wie lange die taste gedrückt ist).
Wenn ich das so will, wo muss dann die Abfrage hin? Ich hab mir gedacht, die einzige Möglichkeit ist in dieser Schleife, weil das ja sozusagen die Hauptschleife des Programms ist, wo alles ausgeführt wird.
Sicher kann man die Befehle anders aneinander reihen, aber es werden ja(laut fehlermeldung) falsche Variablentypen übergeben, und dort werden ja die selben Typen übergeben . |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 20.05.2006, 02:08 Titel: |
|
|
Code: | #include "windows.bi"
OPTION EXPLICIT
OPTION PRIVATE
DIM SHARED AS double x = 50
DIM SHARED AS double y = 100
DIM SHARED hWnd AS HWND
'Ich deklariere Fensterhandles immer als globale Variablen, da man auf
'sie in den verschiedensten Funktionen zugreifen muss
'(WinMain,WinProc ...)
'DIM SHARED felder(20,20) AS integer '?
DECLARE FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
FUNCTION WinProc(BYVAL hWnd AS HWND, BYVAL message AS UINT,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
DIM hDc AS HDC
STATIC hDcBuffer AS HDC 'Statischer Puffer, in den alle Grafikfunktionen geschrieben werden
DIM ps AS PAINTSTRUCT
STATIC bitmap AS HBITMAP 'Statisches Bitmap.
DIM Eingabe As TCHAR
FUNCTION=0
SELECT CASE message
CASE WM_CREATE
hdc = GetDC(hWnd)
hDcBuffer=CreateCompatibleDC(hDc)
SelectObject(hDcBuffer, CreateSolidBrush(RGB(255,255,255)))'Schwarze Farbe
bitmap=CreateCompatibleBitmap(hDc, 640,480)
SelectObject(hDcBuffer, bitmap)
ReleaseDC(hWnd, hdc)
CASE WM_PAINT
RoundRect(hDcBuffer, 0, 0, 640,480,1,1)'Großes Rahmenviereck, Inhalt Weiß
RoundRect(hDcBuffer, 50,100,500,400,1,1)'Viereck, in dem die Bewegung abläuft
RoundRect(hDcBuffer, x,y, x+20,y+20,10,10)'Der Kreis
hDc=BeginPaint(hWnd,@ps)'Beginn des Zeichenvorgangs
BitBlt(hDc, 0,0,640,480,hDcBuffer, 0,0,SRCCOPY)'Fertiges Bild wird auf den Bildschirm gebracht
EndPaint(hWnd, @ps)'Ende des Zeichenvorgangs
CASE WM_DESTROY
'Aufräumarbeiten:
DeleteDC(hDcBuffer) 'Puffer
DeleteObject(bitmap) 'Bitmap
PostQuitMessage(0)
EXIT FUNCTION
END SELECT
function=DefWindowProc(hWnd, Message, wParam, lParam)
END FUNCTION
FUNCTION WinMain(BYVAL hInstance AS HINSTANCE, BYVAL hPrevInstance AS HINSTANCE,_
szCmdLine AS string, BYVAL iCmdShow AS integer)
DIM wMsg AS MSG
DIM wc AS WNDCLASS
DIM tmr As double 'Speichert den Stand des Timers nach jedem Frame
DIM PerSek AS double = 200 'Geschwindikeit / Sekunde
DIM szAppName AS string = "01"
WITH wc
.style=CS_HREDRAW OR CS_VREDRAW
.lpfnWndProc=@WinProc
.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
RegisterClass(@wc)
hWnd=CreateWindowEx(0, szAppName, "Tolles Proggie", WS_OVERLAPPEDWINDOW,_
CW_USEDEFAULT, CW_USEDEFAULT, 640,480,_
NULL, NULL, hInstance, NULL)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
'Bis Hier: Fenstererstellung
WHILE wMsg <> WM_QUIT
WHILE (PeekMessage(@wMsg, NULL,0,0,PM_REMOVE)<>FALSE)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
IF GetAsyncKeyState(VK_UP) AND y>100 THEN y-=(timer - tmr) * PerSek: InvalidateRect(hWnd, NULL, false) ' Geschwindigkeit
IF GetAsyncKeyState(VK_DOWN) AND y<380 THEN y+=(timer - tmr) * PerSek: InvalidateRect(hWnd, NULL, false) ' Vergangene Zeit * ---------------
IF GetAsyncKeyState(VK_LEFT) AND x>50 THEN x-=(timer - tmr) * PerSek: InvalidateRect(hWnd, NULL, false) ' Sekunde
IF GetAsyncKeyState(VK_RIGHT) AND x<480 THEN x+=(timer - tmr) * PerSek: InvalidateRect(hWnd, NULL, false)
tmr = timer
WEND
tmr = timer
WEND
function=wMsg.wParam
END FUNCTION
END WinMain(GetModuleHandle(NULL), null, "", SW_NORMAL) |
Hallo Progger_X,
ich habe dein Programm etwas überarbeitet.
Was mir aufgefallen ist:
Die Warnungen entstanden durch die Dekalaration der HDCs
Statt "DIM hDc, hDc2 AS HDC" musst du
"DIM hDc AS HDC"
"DIM hDc2 AS HDC"
schreiben, da sonst nur hDc2 als HDC deklariert wird und hDc ein Integer bleibt.
Auch solltest du, wie Volta sagte, alles, was nur geht, in die WM_CREATE Abfrage packen, was ich auch gleich gemacht habe.
Ich verstehe auch nicht, wofür du die Variable "pinsel" brauchst, ist völlig unnötig, sodass ich mir erlaubt habe, diese zu löschen.
Solltest du weitere Fragen haben, zögere nicht und lass es mich wissen.
//EDIT
Ich habe bei mir einen Fehler entdeckt...Allein
Code: | IF GetAsyncKeyState(VK_RIGHT) AND x<480 THEN |
reicht nicht, da es "GetAsyncKeyState" egal ist, ob das Fenster den Focus hat oder nicht. Sodass die if-Abfrage so aussehen müsste:
Code: | IF GetFocus = hWnd And GetAsyncKeyState(VK_RIGHT) AND x<480 THEN |
Zuletzt bearbeitet von Dominik am 20.05.2006, 12:24, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 20.05.2006, 10:56 Titel: |
|
|
Hi Dominik.
du kannst natürlich auch schreiben: Code: | Dim As HDC hDc, hDc2 | dann sind beide Variablen HDC..
..wobei die Formulierung Dim hDc As HDC schon interessant ist, sieht irgendwie
nach Dim InTeGeR As INTEGER aus und ich weiß nicht, ob das geht..
Ich probiers aber mal aus..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 20.05.2006, 15:22 Titel: |
|
|
Hi Dominik,
klasse Demanstration wie man API-Funktionen struckturiert zum zeichnen einsetzt.
Wenn ich mal Probleme damit habe werde ich mich an dich wenden.
So sattelfest bin ich damit nicht.
(Die Abfrage der Tastenbetätigungen sollte sich aber auch in der Winproc (ohne Timer) lösen lassen.)
@Progger_X
schau dir das genau an, das meinte ich mit 'Aufrufe sinnvoll aneinander zu reihen'. API erfordert nun mal gewisse Spielregeln auch bei den Deklarationen (static).
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
|
Nach oben |
|
|
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 25.05.2006, 13:31 Titel: |
|
|
Hallo!
@Domenik: Danke, die Deklaration der Variablen war nen dummer Fehler...
Leider funktioniert nur dein Code nicht:
Zitat: |
Compiler output:
C:/Programme/Programmieren/FreeBASIC/Projekte/Aktuell/winapi/03.bas(85) : error 21: Type mismatch
WHILE wMsg <> WM_QUIT
^ |
@LutzIfer: Schau ich mir gleich an. |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 26.05.2006, 16:02 Titel: |
|
|
Hi!
@Volta
Volta hat Folgendes geschrieben: | klasse Demanstration wie man API-Funktionen struckturiert zum zeichnen einsetzt |
Das hört man gerne.
Volta hat Folgendes geschrieben: | Wenn ich mal Probleme damit habe werde ich mich an dich wenden |
Ich werde mein Bestes geben, um diese zu beseitigen.
@Progger_X
Ich hatte noch nachträglich etwas geändert und dann nicht mehr ausprobiert....(hab FreeBasic auf meinem Computer, mit dem ich in's Internet gehe, nicht installiert)
Ändere es mal so ab:
Code: |
WHILE wMsg.Message <> WM_QUIT
|
|
|
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.
|
|