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:

Problem mit Tutorial auf freebasic.de

 
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
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 06.05.2006, 16:13    Titel: Problem mit Tutorial auf freebasic.de Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 08.05.2006, 12:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 14.05.2006, 12:12    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 14.05.2006, 13:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 14.05.2006, 14:53    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 14.05.2006, 15:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 14.05.2006, 15:55    Titel: Antworten mit Zitat

Danke! Das geht erstmal lächeln

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(2cool : 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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 15.05.2006, 11:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 15.05.2006, 16:44    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 15.05.2006, 17:34    Titel: Antworten mit Zitat

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(2cool : 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:
mit den Augen rollen 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 15.05.2006, 21:46    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 17.05.2006, 15:08    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 17.05.2006, 18:20    Titel: Antworten mit Zitat

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. verwundert
_________________
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
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

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

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 missbilligen .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 20.05.2006, 02:08    Titel: Antworten mit Zitat

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

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



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 20.05.2006, 10:56    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 20.05.2006, 15:22    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 20.05.2006, 17:08    Titel: Antworten mit Zitat

http://forum.qbasic.at/viewtopic.php?p=30499 zwinkern
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 25.05.2006, 13:31    Titel: Antworten mit Zitat

Hallo!

@Domenik: Danke, die Deklaration der Variablen war nen dummer Fehler... mit dem Kopf durch die Mauer wollen

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



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 26.05.2006, 16:02    Titel: Antworten mit Zitat

Hi!

@Volta
Volta hat Folgendes geschrieben:
klasse Demanstration wie man API-Funktionen struckturiert zum zeichnen einsetzt


Das hört man gerne. happy

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. lächeln

@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
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
Seite 1 von 1

 
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