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:

einfach winapi frage
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
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 13:43    Titel: einfach winapi frage Antworten mit Zitat

hallo
bei folgendem von mir aus dem hello world programm gebasteltem programm:
http://schrodt.dotmatrix.at/hae.bas

wurmt mich folgendes problem:
die sub rennt nebenher als thread.
und zählt count im sekundentakt hoch
nun müsste ja auch jede sekunde die while wend schleife:

while ((GetMessage( @wMsg, NULL, 0, 0 ) <> FALSE) or ( countold <> count ) )

TranslateMessage( @wMsg )
DispatchMessage( @wMsg )
countold = count

wend

anspringen , da countold nach jeder sekunde sich von count unterscheidet.
tuts aber nicht! wenn man zb in die schleife hineinschreibt : print "test"
dann wird das test erst dann geschrieben wenn man zb das fenster resized , was eine fenster message ist und daher in die erste bedingung der schleife passt.

wenn als getmessage solange blockiert bis was brauchbares daherkommt ,(was ich vermute) wie kann ich dann von einer sub aus z.b. was in ein fenster hineinschreiben?
ich hab schon versucht , das wmpaint in die sub zu kopieren und den windowhandler global deklariert.
hat aber nicht funktioniert.
kann man irgendwie von aussen aus die message ändern?
oder wie mach ichdas alles?
danke an alle und so.
m.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.08.2007, 13:46    Titel: Antworten mit Zitat

Hi dotmarkus,
Wilkommen im Forum..
Welche FreeBASIC-Version verwendest du?
Welche Optionen hast du gesetzt?
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
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 13:49    Titel: die version hab ich mir gestern runtergeladen Antworten mit Zitat

und in den optionen hab ich nichts verändert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

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

übrigens : hallo auch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 04.08.2007, 13:55    Titel: Antworten mit Zitat

Hm.
Wenn die MessageSchleife nur einmal die Sekunde durchlaufen wird, ist nur 1x die Sekunde das Fenster "empfangsbereit"... die restliche Zeit wäre es "eingefroren"

Wenn du nur 1xdie Sekunde was machen willst, musst du die entsprechenden HWND's shared deklarieren, dann kannst du in einem eigenem thread unabhängig von der Message rummmalen.
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:00    Titel: Antworten mit Zitat

tatsächlich ist die "einmalprosekunde" schleife in einem thread , dh unabhängig von der msg schleife.

die msg schleife wurde nur von mir so modifiziert , dass sie auch schaut ob sich count verändert hat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 04.08.2007, 14:02    Titel: Antworten mit Zitat

Wozu soll sie das denn tuen?
Rumpinseln kannst du in deinem Fenster immer...
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.08.2007, 14:02    Titel: Antworten mit Zitat

Hallo,

bitte stell sicher, dass du mindestens FB 0.17 verwendest. Wenn du deine Version von freebasic.de hast, kannst du davon ausgehen, dass sie nicht auf dem neusten Stand ist. Bitte beschaff dir in dem Fall gemäß dieser Anleitung die aktuellste Softwareversion. Du kannst deine installierte FB-Version herausfinden, indem du in der Kommandozeile (cmd.exe) Folgendes eingibst:
Code:
C:\<PfadZurFBInstallation>\FBC -version


Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:14    Titel: Antworten mit Zitat

hallo
ich hab nun compiler 0.17b und in folgendem geändertem code ist im loop thread auch noch wmpaint drin
hWnd ist global.

geht aber immer noch nicht


''
''
''
''
Code:


dim shared count as integer
dim shared countold as integer
dim shared  hWnd as integer

#include once "windows.bi"

declare function        WinMain     ( byval hInstance as HINSTANCE, _
                                      byval hPrevInstance as HINSTANCE, _
                                      szCmdLine as string, _
                                      byval iCmdShow as integer ) as integer
                                 
                                 
    ''
    '' Entry point   
    ''
   end WinMain( GetModuleHandle( null ), null, Command$, SW_NORMAL )

'' ::::::::
'' name: WndProc
'' desc: Processes windows messages
''
'' ::::::::
function WndProc ( byval hWnd as HWND, _
                   byval message as UINT, _
                   byval wParam as WPARAM, _
                   byval lParam as LPARAM ) as LRESULT


    function = 0
   
    ''
    '' Process messages
    ''
    select case( message )
        ''
        '' Window was created
        ''       
        case WM_CREATE           
            exit function
       
        ''
        '' Windows is being repainted
        ''
        case WM_PAINT
          dim rct as RECT
          dim pnt as PAINTSTRUCT
          dim hDC as HDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rct )
           
            DrawText( hDC, _
                    str$(count), _
                    -1, _
                      @rct, _
                      DT_SINGLELINE or DT_CENTER or DT_VCENTER )
           
            EndPaint( hWnd, @pnt )
           
            exit function           
       
      ''
      '' Key pressed
      ''
      case WM_KEYDOWN
         if( lobyte( wParam ) = 27 ) then
            PostMessage( hWnd, WM_CLOSE, 0, 0 )
         end if

        ''
        '' Window was closed
        ''
       case WM_DESTROY
            PostQuitMessage( 0 )
            exit function
    end select
   
    ''
    '' Message doesn't concern us, send it to the default handler
    '' and get result
    ''
    function = DefWindowProc( hWnd, message, wParam, lParam )   
   
end function


SUB mythread 
   
do

count = count +1
sleep 1000
print count
dim rct as RECT
          dim pnt as PAINTSTRUCT
          dim hDC as HDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rct )
           
            DrawText( hDC, _
                    str$(count), _
                    -1, _
                      @rct, _
                      DT_SINGLELINE or DT_CENTER or DT_VCENTER )
           
            EndPaint( hWnd, @pnt )
loop

END SUB

'' ::::::::
'' name: WinMain
'' desc: A win2 gui program entry point
''
'' ::::::::
function WinMain ( byval hInstance as HINSTANCE, _
                   byval hPrevInstance as HINSTANCE, _
                   szCmdLine as string, _
                   byval iCmdShow as integer ) as integer   
     
    dim wMsg as MSG
    dim wcls as WNDCLASS     
    dim szAppName as string
   
     
    function = 0
     
    ''
    '' Setup window class
    ''
    szAppName = "HelloWin"
     
    with wcls
       .style         = CS_HREDRAW or CS_VREDRAW
       .lpfnWndProc   = @WndProc
       .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
         
    ''
    '' Register the window class     
    ''     
    if( RegisterClass( @wcls ) = FALSE ) then
       MessageBox( null, "Failed to register wcls!", szAppName, MB_ICONERROR )
       exit function
    end if
       
   ''
    '' Create the window and show it
    ''
    hWnd = CreateWindowEx( 0, _
                       szAppName, _
                           "The Hello Program", _
                           WS_OVERLAPPEDWINDOW, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           NULL, _
                           NULL, _
                           hInstance, _
                           NULL )
                         

    ShowWindow( hWnd, iCmdShow )
    UpdateWindow( hWnd )
     
   
   
     
    ''
    '' Process windows messages
   
    threadcreate(@mythread,0)

   
   
       
   
    while ((GetMessage( @wMsg, NULL, 0, 0 ) <> FALSE)  ) 
       
        TranslateMessage( @wMsg )
        DispatchMessage( @wMsg )
           
    wend
   
   
    ''
    '' Program has ended
    ''
    function = wMsg.wParam

end function

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.08.2007, 14:21    Titel: Antworten mit Zitat

Ohne deinen Code oben groß studiert zu haben, vielleicht folgender Tipp: Du könntest dir mal die WinAPI Beispiele im examples/ Ordner der FreeBASIC 0.17 Installation anschauen. Diese Beispiele der FB-Entwickler sind nämlich auf ihre Funktionstüchtigkeit getestet. lächeln
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.08.2007, 14:26    Titel: Antworten mit Zitat

dotmarkus hat Folgendes geschrieben:
geht aber immer noch nicht
..das ist ja mal eine erschöpfende Auskunft..
der zählt doch wunderbar
..
59
60
61
..
Was mich wundert ist, daß du als FB-Neuling gar keine Fragen zu den Fehlermeldungen des Kompilers hast..
..oder wird dein SourceCode ohne Fehler und Warnungen kompiliert?
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
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:29    Titel: Antworten mit Zitat

der loop schreibt bei dir die zahl ins fenster?

bei mir steht im window immer nur 0

bzg fehlermeldungen:
ja die machen mich fertig zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 04.08.2007, 14:36    Titel: Antworten mit Zitat

Code:
dim shared  hWnd as integer
muss
Code:
dim shared hWnd as HWND
heißen zwinkern
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 04.08.2007, 14:38    Titel: Antworten mit Zitat

Moooment..
Print schreibt auf die Konsole! Das hast du so programmiert und ich habe nur gesagt, daß es dort auch angezeigt wird..
..im Window, wo du das ausgeben möchtest(vermute ich mal) passiert das natürlich nicht, da du das ja auch nicht so programmiert hast..
btw:
Wie du siehst, sind deine Fragen hier einfacher zu beantworten, als im Chat..
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..

Zuletzt bearbeitet von ytwinky am 04.08.2007, 14:40, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:40    Titel: Antworten mit Zitat

das print hab ich nur eingefügt im in der console zu sehen ob die sub läuft
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:44    Titel: Antworten mit Zitat

csde rats und sebastian
hier hab ich das hello world example aus den 0.17b exampes verwendet
hwnd ist als HWND deklariert (global)
und in der console sieht man auch den sub laufen
1
2
3
etc...
aber das fenster zeigt nachwievor nur hello world an.
wie schreib ich nun von einer sub ins window ? das was ich da reingepastet habe scheint nicht zu funktionieren

http://schrodt.dotmatrix.at/hae3.bas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 04.08.2007, 14:48    Titel: Antworten mit Zitat

Code:
#define WIN_INCLUDEALL 1
#include once "windows.bi"

dim shared count as integer
dim shared countold as integer
dim shared  hWnd as HWND



declare function        WinMain     ( byval hInstance as HINSTANCE, _
                                      byval hPrevInstance as HINSTANCE, _
                                      szCmdLine as string, _
                                      byval iCmdShow as integer ) as integer
                                 
                                 
    ''
    '' Entry point   
    ''
   end WinMain( GetModuleHandle( null ), null, Command, SW_NORMAL )

'' ::::::::
'' name: WndProc
'' desc: Processes windows messages
''
'' ::::::::
function WndProc ( byval hWnd as HWND, _
                   byval message as UINT, _
                   byval wParam as WPARAM, _
                   byval lParam as LPARAM ) as LRESULT


    function = 0
   
    ''
    '' Process messages
    ''
    select case( message )
        ''
        '' Window was created
        ''       
        case WM_CREATE           
            exit function
       
        ''
        '' Windows is being repainted
        ''
        case WM_PAINT
          dim rct as RECT
          dim pnt as PAINTSTRUCT
          dim hDC as HDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rct )
           
            DrawText( hDC, _
                    str$(count), _
                    -1, _
                      @rct, _
                      DT_SINGLELINE or DT_CENTER or DT_VCENTER )
            EndPaint( hWnd, @pnt )
           
            exit function           
       
      ''
      '' Key pressed
      ''
      case WM_KEYDOWN
         if( lobyte( wParam ) = 27 ) then
            PostMessage( hWnd, WM_CLOSE, 0, 0 )
         end if

        ''
        '' Window was closed
        ''
       case WM_DESTROY
            PostQuitMessage( 0 )
            exit function
    end select
   
    ''
    '' Message doesn't concern us, send it to the default handler
    '' and get result
    ''
    function = DefWindowProc( hWnd, message, wParam, lParam )   
   
end function


SUB mythread
   
do

count = count +1
sleep 1000
print Str(count) + "(" + Str(hWnd) + ")"
          dim rct as RECT
          dim pnt as PAINTSTRUCT
          dim hDC as HDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rct )
           
            DrawText( hDC, _
                    str(count), _
                    -1, _
                      @rct, _
                      DT_SINGLELINE or DT_CENTER or DT_VCENTER )
                     
            SendMessage(hWnd,WM_PAINT, NULL, NULL)
           
            EndPaint( hWnd, @pnt )
loop

END SUB

'' ::::::::
'' name: WinMain
'' desc: A win2 gui program entry point
''
'' ::::::::
function WinMain ( byval hInstance as HINSTANCE, _
                   byval hPrevInstance as HINSTANCE, _
                   szCmdLine as string, _
                   byval iCmdShow as integer ) as integer   
     
    dim wMsg as MSG
    dim wcls as WNDCLASS     
    dim szAppName as string
   
     
    function = 0
     
    ''
    '' Setup window class
    ''
    szAppName = "HelloWin"
     
    with wcls
       .style         = CS_HREDRAW or CS_VREDRAW
       .lpfnWndProc   = @WndProc
       .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
         
    ''
    '' Register the window class     
    ''     
    if( RegisterClass( @wcls ) = FALSE ) then
       MessageBox( null, "Failed to register wcls!", szAppName, MB_ICONERROR )
       exit function
    end if
       
   ''
    '' Create the window and show it
    ''
    hWnd = CreateWindowEx( 0, _
                       szAppName, _
                           "The Hello Program", _
                           WS_OVERLAPPEDWINDOW, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           NULL, _
                           NULL, _
                           hInstance, _
                           NULL )
                         

    ShowWindow( hWnd, iCmdShow )
    UpdateWindow( hWnd )
     
   
   
     
    ''
    '' Process windows messages
   
    threadcreate(@mythread,0)

   
   
       
   
    while ((GetMessage( @wMsg, NULL, 0, 0 ) <> FALSE)  )
       
        TranslateMessage( @wMsg )
        DispatchMessage( @wMsg )
           
    wend
   
   
    ''
    '' Program has ended
    ''
    function = wMsg.wParam

end function

probiers mal aus....
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:50    Titel: Antworten mit Zitat

im window steht nun nachwievor 0
dafür steht der windowhandler nach der zahl in klammer (bei der ausgabe in der console)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 04.08.2007, 14:51    Titel: Antworten mit Zitat

Kompilir das mal mit "-mt" (Threadsafe)...
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dotmarkus



Anmeldungsdatum: 04.08.2007
Beiträge: 14

BeitragVerfasst am: 04.08.2007, 14:57    Titel: Antworten mit Zitat

hab ich gemacht . das ergebnis schaut bei mir nachwievor so aus:



Editiert durch Moderator: Riesiges Bild zwecks Thumbnailerstellung bei Imageshack hochgeladen. (Sebastian)

danke (dotmarkus)
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