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:

"fenster aktualisieren"-damit Programm weitläuft

 
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
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 06.08.2006, 11:23    Titel: "fenster aktualisieren"-damit Programm weitläuft Antworten mit Zitat

Ich versuche mich grade an "Windows"-Fenster.
Ich wollte einen Wecker programmieren aber mein Problem ist, dass sobald ich den Cursor außerhalb des Fensters positioniere das Programm anhält.
Ich dachte zuerst das das so funktioniert:
Code:

UpdateWindow hWnd

Tuts aber nicht.
Als Notlösung habe ich jetzt einfach "message=1" gesetzt.
Dann kann der Benutzer aber keine Eingaben mehr machn.

Habt ihr eine Lösung?


mfg noop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 06.08.2006, 14:32    Titel: Antworten mit Zitat

sobald der server wieder läuft, könntest du dir ja mal http://lutzifer.freebasic.de/winapi/ angucken - dort habe ich ein kleines tutorial über die anfänge des programmierens mit der winapi hingestellt.

evtl hat ytwinky noch eine alte unvollständige version dieses tutorials als chm-datei, musst ihn mal fragen.


gruß
Lutz böse Ifer
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 06.08.2006, 14:55    Titel: Antworten mit Zitat

Hatter natürlich..
Download lutziferswinapi_tut.chm
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
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 06.08.2006, 17:45    Titel: Antworten mit Zitat

@noop
Poste bitte den ganzen Code, raten ist immer so aufwendig für alle Beteiligten.
_________________
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
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 07.08.2006, 02:00    Titel: Antworten mit Zitat

ok danke
sobal ich zu Hause stell ich ihn ma online.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 07.08.2006, 07:02    Titel: Antworten mit Zitat

sry ich hab die Adresse verlegt wo ich Code hochladen kann.
Sobald ich sie weiß mach ichs.

Hier ist der Code:
http://www.freebasic.de/fbnp/index.php?view=504


Zuletzt bearbeitet von noop am 14.08.2006, 23:47, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 07.08.2006, 17:46    Titel: Antworten mit Zitat

Juhuu!
Quellcode zum Ausprobieren zwinkern .

Diese Ausgabe hier sagt schon ein paar Sachen:
Zitat:
Command executed:
"C:\FreeBASIC\fbc.exe" "C:\FreeBASIC\FBIDETEMP.bas"

Compiler output:
C:/FreeBASIC/FBIDETEMP.bas(213) : warning level 0: Passing scalar as pointer, at parameter 1 of FSOUND_STREAM_STOP()
C:/FreeBASIC/FBIDETEMP.bas(214) : warning level 0: Passing scalar as pointer, at parameter 1 of FSOUND_STREAM_CLOSE()
C:/FreeBASIC/FBIDETEMP.bas(216) : warning level 0: Function result was not explicitly set
C:/FreeBASIC/FBIDETEMP.bas(220) : warning level 0: Implicit conversion
C:/FreeBASIC/FBIDETEMP.bas(221) : warning level 0: Passing scalar as pointer, at parameter 2 of FSOUND_STREAM_PLAY()
C:/FreeBASIC/FBIDETEMP.bas(222) : warning level 0: Function result was not explicitly set

Results:
Compilation successful
Generated executable: C:\FreeBASIC\FBIDETEMP.exe

System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.16 for win32 (target:win32)
OS: Windows XP (build 2600, Service Pack 2)

Also Stream ist ein Pointer:
Code:
stream as any pointer

Bei function ende fehlt die Rückgabe, mach einfach ein kleines Return 0 oder eine Sub daraus.

So, zum eigentlichen Problem komm ich gleich.

(FMOD runterladen, Bitte warten ...)

Ich brauch nen Kaffee...

Jetzt geht's.
(fmod.dll merken, nette DLL happy )

So weit bin ich:
Code:

'Code größsten Teils aus den examples von fb kopiert.

option explicit
#include once "fmod.bi"
#include once "windows.bi"

const POLY_VERTICES = 12

#define DEG2RAD(x) x * (3.141593# / 180#)

dim shared timetogo as single, starttime as single, clockon as integer, stream as any pointer
starttime=timer
clockon=1
timetogo=5

declare sub ende
declare sub music

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



sub create_poly (byval x as integer, byval y as integer, _
             byval radius as integer, byval vertices as integer, _
             byval ang as integer, _
             vertTb() as POINT )
     
   dim as integer cx = x - radius, cy = y
   dim as integer stp = 180 \ vertices, df = 180 mod vertices
   dim as integer diam = radius * 2
   dim as integer deg = (ang \ 2) - stp
   dim as integer v = vertices
   dim as integer i
   
   for i = 0 to vertices
      v -= df
      if v <= 0 then
         v += vertices
      end if
     
        deg += stp
        dim as double r = diam * cos( DEG2RAD(deg) )
       
       with vertTb(i)
           .x = cx + r * cos( DEG2RAD(deg) )
           .y = cy + r * sin( DEG2RAD(deg) )
        end with
   next

end sub



function WndProc ( byval hWnd as HWND, _
                   byval wMsg as UINT, _
                   byval wParam as WPARAM, _
                   byval lParam as LPARAM ) as LRESULT
   
   dim as RECT rect
   static as POINT vertTB( 0 to POLY_VERTICES )

    function = 0

    '======Wecker
        if clockon=1 then
            locate 1:print cint(starttime), timetogo, cint(timer), cint(timetogo-(timer-starttime)), clockon
            wMsg=1
            if timer>starttime+timetogo then
                music
                clockon=0
            else
            end if
        else
        end if
    '==========


    select case( wMsg )
        case WM_CREATE           
           GetClientRect( hWnd, @rect )
           
           create_poly( rect.right \ 2, _
                     rect.bottom \ 2, _
                     iif(rect.right < rect.bottom, rect.right, rect.bottom) \ 2, _
                     POLY_VERTICES, _
                     0, _
                     vertTb() )
           
            SetWindowRgn( hWnd, CreatePolygonRgn( @vertTb(0), POLY_VERTICES, WINDING ), TRUE )
           
            exit function
       
        case WM_PAINT
          dim as PAINTSTRUCT pnt
          dim as HDC hDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rect )
           
            SetBkMode( hDC, TRANSPARENT   )
            SetTextColor( hDC, BGR( val("&h88"), 127, 255 ) )
           
            DrawText( hDC, _
                        "Wecker", _
                        -1, _
                         @rect, _
                         DT_SINGLELINE or DT_CENTER or DT_VCENTER )
                       
            EndPaint( hWnd, @pnt )
           
            exit function           
       
      case WM_LBUTTONDOWN
         SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, NULL )

      case WM_KEYDOWN
         if( lobyte( wParam ) = 27 ) then
                ende
            PostMessage( hWnd, WM_CLOSE, 0, 0 )
            exit function
         end if

       case WM_DESTROY
            PostQuitMessage( 0 )
            exit function
    end select
   
    function = DefWindowProc( hWnd, wMsg, wParam, lParam )   
end function



sub remove_caption(byval hwnd as HWND )
   dim as RECT rect

     dim as integer style = GetWindowLong( hwnd, GWL_STYLE ) and (not WS_CAPTION)
     SetWindowLong( hwnd, GWL_STYLE, style )
     GetClientRect( hwnd, @rect )
     AdjustWindowRect( @rect, style, cast( BOOL, GetMenu( hwnd ) ) )
     SetWindowPos( hwnd, 0, 0, 0, rect.Right, rect.Bottom, _
              SWP_NOMOVE or SWP_NOZORDER or SWP_FRAMECHANGED or SWP_NOSENDCHANGING )
end sub




function WinMain ( byval hInstance as HINSTANCE, _
                   byval hPrevInstance as HINSTANCE, _
                   byval szCmdLine as string, _
                   byval iCmdShow as integer ) as integer   
     
    dim as MSG wMsg
    dim as WNDCLASS wcls
    dim as HWND hWnd
     
    function = 0
     
    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( LTGRAY_BRUSH )
       .lpszMenuName  = NULL
       .lpszClassName = @"Wecker"
    end with
         
    if( RegisterClass( @wcls ) = FALSE ) then
       MessageBox( null, "Failed to register wcls!", "Error", MB_ICONERROR )
       exit function
    end if
   
    hWnd = CreateWindowEx( 0, _
                       "Wecker", _
                           NULL, _
                           WS_OVERLAPPED, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           300, _
                           300, _
                           NULL, _
                           NULL, _
                           hInstance, _
                           NULL )
                         
    remove_caption( hWnd )
   
    ShowWindow( hWnd, iCmdShow )
    UpdateWindow( hWnd )
     
    while( GetMessage( @wMsg, NULL, 0, 0 ) <> false ) 
        TranslateMessage( @wMsg )
        DispatchMessage( @wMsg )
    wend
   
    function = wMsg.wParam

end function



sub ende
FSOUND_Stream_Stop stream
FSOUND_Stream_Close stream
FSOUND_Close
end sub

sub music
FSOUND_Init( 44100, 4, 0 )
stream = FSOUND_Stream_Open( "C:\Windows\Media\ringin.wav", FSOUND_MPEGACCURATE, 0, 0 )
FSOUND_Stream_Play( FSOUND_FREE, stream )
end sub

Das eigentliche Problem konnte ich nicht beheben, Nullahnung von der WinAPI.

Scheinpaar klemmt er an:
Code:
 DispatchMessage

Eigentlich Logisch, wenn ich Link lese.
Vielleicht must du eine Neuefunktion deklarieren, die dafür zuständig ist wenn der Mauszeiger drausen ist?
Wie gesagt, ich weiss es nicht genauer.
_________________
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: 07.08.2006, 21:01    Titel: Antworten mit Zitat

Hi noop,
für dein Problem kann ich dir leider nur einen Hinweis geben,
hier hat Antoni eine Digiclock geprogt:
http://www.freebasic.net/forum/viewtopic.php?p=37117#37117
Er baut sein Prog aber ganz anders auf (für mich etwas undurchschaubar), was mir aber auffiel war die Timer-Funktion die er benutzt
Code:
Sub on_Create(hwnd As hwnd)
....
SetTimer (hwnd, ID_TIMER, 1000, Byval NULL)
...
und
Code:
Sub on_timer(hwnd As hwnd)
    InvalidateRect (hwnd,Byval NULL, TRUE)
End Sub
Das wird wohl für die Aktualisierung der Zeitanzeige, auch wenn das Window nicht aktiv ist, sorgen

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
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 08.08.2006, 01:52    Titel: Antworten mit Zitat

Ok danke erstmal.
Ich werd mir das mal angucken.
Ich muss mich wohl mal ein bisschen mehr mit der Win API beschäftigen.

mfg noop
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 12.08.2006, 17:24    Titel: Antworten mit Zitat

Hallo noop,

du gehst an dieses Programm falsch heran.
Das liegt vermutlich daran, dass du die WinAPI noch nicht so gut kennst.
Wie auch immer. Ich habe dein Programm überarbeitet und hoffe,
dass es so funktioniert, wie du es dir vorstellst.
Du solltest, vor allem wenn du den Source-Code online stellst, immer Kommentare einfügen, da
es sonst immer recht aufwendig ist, den Durchblick zu bekommen.
Ich habe dort, wo ich Änderungen vorgenommen habe, Kommentare eingefügt.

Code:
'Code größsten Teils aus den examples von fb kopiert.

option explicit
#include once "fmod.bi"
#include once "windows.bi"

const POLY_VERTICES = 12


#define DEG2RAD(x) x * (3.141593# / 180#)

dim shared stream as any pointer
'starttime =timer   'unnötig
'clockon=1         
Const timetogo=5 'In Sekunden

declare sub ende
declare sub music
declare sub create_poly (byval x as integer, byval y as integer, _
                         byval radius as integer, byval vertices as integer, _
                         byval ang as integer, _
                         vertTb() as POINT )

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



sub create_poly (byval x as integer, byval y as integer, _
                 byval radius as integer, byval vertices as integer, _
                 byval ang as integer, _
                 vertTb() as POINT )
     
   dim as integer cx = x - radius, cy = y
   dim as integer stp = 180 \ vertices, df = 180 mod vertices
   dim as integer diam = radius * 2
   dim as integer deg = (ang \ 2) - stp
   dim as integer v = vertices
   dim as integer i
   
   for i = 0 to vertices
      v -= df
      if v <= 0 then
         v += vertices
      end if
     
        deg += stp
        dim as double r = diam * cos( DEG2RAD(deg) )
       
       with vertTb(i)
           .x = cx + r * cos( DEG2RAD(deg) )
           .y = cy + r * sin( DEG2RAD(deg) )
        end with
   next

end sub



function WndProc ( byval hWnd as HWND, _
                   byval wMsg as UINT, _
                   byval wParam as WPARAM, _
                   byval lParam as LPARAM ) as LRESULT
   
    dim as RECT rect
    static as POINT vertTB( 0 to POLY_VERTICES )
    static tmr as uint
    function = 0

'#####geändert
    'Die Überprüfungen hattten an dieser Stelle der WndProc garnichts zu suchen.
    'Die Aufgabe der WndProc ist es ausschließlich Fensternachrichten zu behandeln.
    'Erstelle lieber einen Timer. Bei jedem Tick des Timers wird an das Fenster die WM_TIMER-Nachricht gesendet,
    'wenn du keine Timerprocedure angiebst.


    select case( wMsg )
    case WM_CREATE           
           GetClientRect( hWnd, @rect )
           
           create_poly( rect.right \ 2, _
                     rect.bottom \ 2, _
                     iif(rect.right < rect.bottom, rect.right, rect.bottom) \ 2, _
                     POLY_VERTICES, _
                     0, _
                     vertTb() )
           
            SetWindowRgn( hWnd, CreatePolygonRgn( @vertTb(0), POLY_VERTICES, WINDING ), TRUE )

            'Hier wird der Timer erstellt, der überprüfen soll, ob der Wecker klingeln soll.
            'Er gehört dem Fenster "hWnd", erhält die Kennungsnr. 1 und soll alle 5 Sekunden eine WM_TIMER
            'Nachricht an das Fenster senden. Dadurch, dass wir den letzten Parameter "NULL" setzten wird die WM_TIMER
            'Nachricht überhaupt gesendet, geben wir hier einen Zeiger auf eine Function an, dann wird diese Function
            'bei jedem Tick des Timers aufgerufen.
            Tmr = SetTimer(hWnd, 1, timetogo * 1000, NULL)
           
            exit function
    case WM_PAINT
          dim as PAINTSTRUCT pnt
          dim as HDC hDC
         
            hDC = BeginPaint( hWnd, @pnt )
            GetClientRect( hWnd, @rect )
           
            SetBkMode( hDC, TRANSPARENT   )
            SetTextColor( hDC, BGR( val("&h88"), 127, 255 ) )
           
            DrawText( hDC, _
                        "Wecker", _
                        -1, _
                         @rect, _
                         DT_SINGLELINE or DT_CENTER or DT_VCENTER )
                       
            EndPaint( hWnd, @pnt )
           
            exit function           
       
    case WM_LBUTTONDOWN
        SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, NULL )
        exit function
    case WM_KEYDOWN
        if( lobyte( wParam ) = 27 ) then
            ende
            PostMessage( hWnd, WM_CLOSE, 0, 0 )
            exit function
        end if
    case WM_TIMER
        'Der Wecker muss klingeln!
    'geändert: Das brauchen wir alles nicht mehr. Der Timer macht das überprüfen überflüssig, da er ja nach 5 Sek. automatisch
    '          das Fenster benachrichtigt.
    '======Wecker
        'if clockon=1 then
            'locate 1:print cint(starttime), timetogo, cint(timer), cint(timetogo-(timer-starttime)), clockon
            'wMsg=1
            'if timer>starttime+timetogo then
       
        music                            'Klingeln
        ShowWindow( hWnd, SW_SHOWNORMAL) ' Das Fenster anzeigen.
       
        'clockon=0
            'end if
        'end if
    '==========
    'Nun wird der Timer wieder gelöscht, da der Wecker nur einmal klingeln soll.
        KillTimer(hWnd, 1)
    case WM_DESTROY
        ende    'geändert
        PostQuitMessage( 0 )
        exit function
    end select
   
    function = DefWindowProc( hWnd, wMsg, wParam, lParam )   
end function



sub remove_caption(byval hwnd as HWND )
   dim as RECT rect

     dim as integer style = GetWindowLong( hwnd, GWL_STYLE ) and (not WS_CAPTION)
     SetWindowLong( hwnd, GWL_STYLE, style )
     GetClientRect( hwnd, @rect )
     AdjustWindowRect( @rect, style, cast( BOOL, GetMenu( hwnd ) ) )
     SetWindowPos( hwnd, 0, 0, 0, rect.Right, rect.Bottom, _
              SWP_NOMOVE or SWP_NOZORDER or SWP_FRAMECHANGED or SWP_NOSENDCHANGING )
end sub




function WinMain ( byval hInstance as HINSTANCE, _
                   byval hPrevInstance as HINSTANCE, _
                   byval szCmdLine as string, _
                   byval iCmdShow as integer ) as integer   
     
    dim as MSG wMsg
    dim as WNDCLASS wcls
    dim as HWND hWnd
     
    function = 0
     
    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( LTGRAY_BRUSH )
       .lpszMenuName  = NULL
       .lpszClassName = @"Wecker"
    end with
         
    if( RegisterClass( @wcls ) = FALSE ) then
       MessageBox( null, "Failed to register wcls!", "Error", MB_ICONERROR )
       exit function
    end if
   
    hWnd = CreateWindowEx( 0, _
                       "Wecker", _
                           NULL, _
                           WS_OVERLAPPED, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           300, _
                           300, _
                           NULL, _
                           NULL, _
                           hInstance, _
                           NULL )
                         
    remove_caption( hWnd )
   
    'Ich habe es so verstanden, dass das Fenster nur dann angezeigt werden soll, nachdem der Wecker geklingelt hat.
    'Das heißt, wir erstellen zwar das Fenster, machen es aber noch nicht sichtbar.
    UpdateWindow( hWnd )
     
    while( GetMessage( @wMsg, NULL, 0, 0 ) <> false ) 
        TranslateMessage( @wMsg )
        DispatchMessage( @wMsg )
    wend
   
    function = wMsg.wParam

end function



sub ende
FSOUND_Stream_Stop stream
FSOUND_Stream_Close stream
FSOUND_Close
end sub

sub music
FSOUND_Init( 44100, 4, 0 )
stream = FSOUND_Stream_Open( "C:\Windows\Media\ringin.wav", FSOUND_MPEGACCURATE, 0, 0 )
FSOUND_Stream_Play( FSOUND_FREE, stream )
end sub
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 15.08.2006, 08:18    Titel: Antworten mit Zitat

Danke erstmal für deine Verbesserungen.
Ich war auf einem Ausflug und konnnte deshalb nicht antworten.
Ich werd mir den Code heute mal angucken.

noop

edit:
Nein, der Wecker soll die ganze Zeit angezeigt werden.
Ich musste bloß wMsg=1 setzen damit das Fenster überhaupt eine Nachricht bekommt und mein Programm weiterläuft und der Wecker funktioniert. Deswegen wurde das fenster überhaupt gar nicht angezeigt...weil wMsg ja keine verwertbare Information enthielt...
Sieht aber sonst ganz gut aus, danke.

EDIT2:
Ok funzt jetzt wunderbar.
Hier der Code.


Editiert durch Moderator: Beide Folge-Threads zu einem zusammengefasst. (A.K.)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 15.08.2006, 23:53    Titel: Antworten mit Zitat

Da der Wecker jetzt die ganze Zeit angezeigt wird, kannst du die folgende markierte Zeile löschen:
Code:

'Ausschnitt aus der WndProc
#     case WM_LBUTTONDOWN
#         SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, NULL )
#         exit function
#     case WM_KEYDOWN
#         if( lobyte( wParam ) = 27 ) then
#             ende
#             PostMessage( hWnd, WM_CLOSE, 0, 0 )
#             exit function
#         end if
#     case WM_TIMER
#         music                            'Klingeln
-----------------------------weg damit---------------------------------------------------
|#         ShowWindow( hWnd, SW_SHOWNORMAL) ' Das Fenster anzeigen.|
--------------------------------------------------------------------------------
#     'Nun wird der Timer wieder gelöscht, da der Wecker nur einmal klingeln soll.
#         KillTimer(hWnd, 1)
#         Tmr = 0
#     case WM_DESTROY
#         ende    'geändert
#         PostQuitMessage( 0 )
#         exit function



In dem Case-Zweig WM_DESTROY musst du auch noch etwas ändern.
Da man jetzt das Programm vor dem Wecken beenden kann wird der Timer, wenn man das macht, nicht gelöscht.
Deshalb änderst du WM_DESTROY am besten so ab:

Code:

     case WM_DESTROY
         ende    'geändert
         If Tmr <> 0 Then KillTimer(hWnd, 1) ' Löscht den Timer, falls er noch aktiv ist.
         PostQuitMessage( 0 )
         exit function
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 20.08.2006, 07:59    Titel: Antworten mit Zitat

Ok.Danke.

Die eine Zeile muss allerdings in etwa stehen bleiben, sonst wird das Fenster nicht angezeigt, wenn es hinter anderen liegt.

Code:

    case WM_TIMER
        music                            'Klingeln
          ShowWindow( hWnd, SW_HIDE) ' Fenster verstecken damit es angezeigt werden kann...sonst bleibt es hinter anderen Fenstern liegen.
          ShowWindow( hWnd, SW_SHOW) ' Das Fenster anzeigen.
    'Nun wird der Timer wieder gelöscht, da der Wecker nur einmal klingeln soll.
        KillTimer(hWnd, 1)


Ohne diese Zeile
Code:

ShowWindow( hWnd, SW_HIDE)

funktioniert es allerdings nicht.
Gibt es da vllt. eine bessere Lösung?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 20.08.2006, 20:48    Titel: Antworten mit Zitat

Ja,
verwende statt den beiden ShowWindow(....) folgendes (1x):
Code:
SetForegroundWindow(hWnd)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 21.08.2006, 09:41    Titel: Antworten mit Zitat

Ok thx.
Funzt wunderbar.
http://www.freebasic.de/fbnp/index.php?view=506
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 22.08.2006, 04:42    Titel: Antworten mit Zitat

Neues Problem:
Mein Programmname wird in der Taskleiste gar nicht angezeigt.
Auch dem Taskmanager entgeht es unter Programme völlig.
Nur unter Prozesse steht korrekt Wecker.exe.
Ich will es aber eigentlcih nicht verstecken.
Ich denk mal dass es daher kommt, dass die Titelleiste entfernt wird.
Gibt es da eine Lösung, dass es doch einen Namen hat?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 22.08.2006, 22:41    Titel: Antworten mit Zitat

Du musst deinem Fenster einen Namen geben, sonst wird es nicht im Task-Mager angezeigt. lächeln
Code:

hWnd = CreateWindowEx(WS_EX_APPWINDOW, _
                           "Wecker", _
                           NULL, _       'Hier eine Überschrift für das Fenster angeben.
                           WS_OVERLAPPED, _
                           CW_USEDEFAULT, _
                           CW_USEDEFAULT, _
                           300, _
                           300, _
                           NULL, _
                           NULL, _
                           hInstance, _
                           NULL )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
noop



Anmeldungsdatum: 04.05.2005
Beiträge: 259

BeitragVerfasst am: 23.08.2006, 05:56    Titel: Antworten mit Zitat

mit dem Kopf durch die Mauer wollen
Ich dachte darüber hätte man das schon angegeben.
ok, danke.funzt jetzt.

mfg noop
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