 |
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 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 13:43 Titel: einfach winapi frage |
|
|
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 |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.08.2007, 13:46 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 13:49 Titel: die version hab ich mir gestern runtergeladen |
|
|
und in den optionen hab ich nichts verändert |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 13:53 Titel: |
|
|
übrigens : hallo auch. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 04.08.2007, 13:55 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:00 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 04.08.2007, 14:02 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:14 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.08.2007, 14:26 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:29 Titel: |
|
|
der loop schreibt bei dir die zahl ins fenster?
bei mir steht im window immer nur 0
bzg fehlermeldungen:
ja die machen mich fertig  |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 04.08.2007, 14:38 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:40 Titel: |
|
|
das print hab ich nur eingefügt im in der console zu sehen ob die sub läuft |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:44 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 04.08.2007, 14:48 Titel: |
|
|
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 |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:50 Titel: |
|
|
im window steht nun nachwievor 0
dafür steht der windowhandler nach der zahl in klammer (bei der ausgabe in der console) |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 04.08.2007, 14:57 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|