das fenster wird nicht geschlossen.



  • hi.
    ich schreibe meine progs für windows-ce.
    mir ist vor einiger zeit aufgefallen,
    das die programme, die ich schreibe leider nicht beendet werden sondern einfach im hintergrund weiterlaufe wenn ich auf das "X" rechts oben klicke.

    #include <windows.h>

    LRESULT WndProc(HWND,UINT,WPARAM,LPARAM);

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
    WNDCLASS wc;
    HWND hwnd;
    MSG msg;

    memset(&wc,0,sizeof(wc));
    wc.style = CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC) WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = L"myapp";

    RegisterClass(&wc);

    hwnd = CreateWindow(L"myapp",L"Fenstername",WS_VISIBLE,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow(hwnd);

    while(GetMessage(&msg,NULL,0,0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }

    LRESULT WndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
    {

    switch(message)
    {
    case WM_DESTROY:
    DestroyWindow(hWnd);
    PostQuitMessage(0);
    return 0;

    case WM_CLOSE:
    DestroyWindow(hWnd);
    PostQuitMessage(0);
    return 0;
    }

    return DefWindowProc(hWnd, message, uParam, lParam);
    }

    wenn mir jemand den fehler zeigen könnte?
    ich habe keine ahnung was ich noch alles machen soll.

    danke schon mal im voraus
    mfg noname01





  • So wie ich das seh, sollte man nur in WM_CLOSE DestroyWindow(hWnd) benutzen und nur in WM_DESTROY PostQuitMessage(0)! (kann man natürlich auch wo anders einsetzten aber in beiden Messages beides aufzurufen erscheint mir falsch)

    Versuch einfach mal, die jeweils doppelte Funktion zu löschen ;)!

    Mfg.



  • das war nur lauter verzeiflung das ich die funktionen hab doppelt ausführen lassen.es geht nämlich auch in einfacher ausführung nicht.
    ich könnt in die luft springen.naja hoffentlich findet einer den bug.



  • Man könnte ja das 'Gerüst für ein standard Windows-Programm' von http://www.winapi.net/
    wenigstens mal anschauen, wenn man es schon nicht kopieren will!



  • vieleicht solltest du mal folgendes probieren:

    ...
    LRESULT WndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
    {
    
    switch(message)
    {
    case WM_DESTROY:
    {//soweit ich weiss sind die klammern wichtig
    PostQuitMessage(0);
    return 0;
    }
    }
    
    return DefWindowProc(hWnd, message, uParam, lParam);
    }
    

    hab keinen plan obs daran liegt, probiers einfach mal aus!



  • nein.

    das funzt net aber du has recht zur übersicht
    und problemvermeidung sollte man die "{" setzten.



  • wenn man so die msdn durchsieht, sind da nich immer noch jede menge zusatzinfos für WIN-CE??? vieleicht findeste da ja was

    [ Dieser Beitrag wurde am 30.06.2003 um 17:11 Uhr von CaGa editiert. ]



  • bei winapi.net wird die wndclassex benutzt diese klasse steht mir aber leider nicht bei der programmierung für win-ce zur verfügung.



  • dann nimmst du eben die normale WNDCLASS struktur. der einzige unterschied ist, das man noch ein kleines icon setzen kann. hat doch mit dem problem nichts zu tun.



  • es geht immer noch nicht.
    kann vieleicht einer mal schauen warum das prog weiterläuft?
    das fenster wird ja geschlossen darüber bin ich ja froh aber das prog läuft leider im hintergrund weiter.

    gibt es noch andere möglichkeiten ein winprog zu beenden?



  • zeig jetzt nochmal den ganzen code wie du ihn jetzt hast! dann werden wir dir helfen



  • ich hab nochmal etwas rumexperimentiert

    #include <windows.h>

    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR szCmdLine, int iCmdShow)
    {
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass;

    memset(&wndclass,0,sizeof(wndclass));

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = (WNDPROC)WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hIcon = NULL;
    wndclass.hInstance = hInstance;
    wndclass.hCursor = NULL;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = L"myapp";

    RegisterClass(&wndclass);

    hwnd = CreateWindow (L"myapp",L"Fenstername", WS_VISIBLE,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
    }
    return msg.wParam ;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    switch (iMsg)
    {
    case WM_CREATE :

    return 0 ;

    case WM_PAINT :

    return 0 ;

    case WM_DESTROY:
    DestroyWindow(hwnd);
    PostQuitMessage (0);
    return 0 ;
    }

    return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }

    ich glaube, das das "X" oben rechts das fenster zwar schließt aber weder eine WM_close noch eine WM_QUIT message sendet.
    das heist PostQuitMessage geht aber der auslöser fehlt anscheinend



  • mach auf jeden fall den code für WM_PAINT weg, wenn du nichts zeichnest. das erzeugt 100 % auslastung.

    aber die anwendung lässt sich doch erfolgreich beenden mit ALT + F4. Das X wird ja garnicht angezeigt



  • nein ich schreibe für windows-ce 🙂
    das ist ja das prob und da gibts kein alt-f4.



  • achso.

    und wie soll das programm nun beendet werden? setz doch noch den fensterstyle WS_OVERLAPPEDWINDOW damit das fenster auch die buttons in der titelleiste hat (x).



  • In WM_PAINT sollte NIE nur return 0; stehen! Entweder gar nicht abfangen oder BeginPaint & EndPaint darin aufrufen.
    Wenn überhaupt, wird DestroyWindow in WM_CLOSE aufgerufen (kannst du aber auch weglassen) und in WM_DESTROY wird nur PostQuitMessage aufgerufen (KEIN DestroyWindow) (und halt am Ende return 0;)



  • Original erstellt von <noname01>:
    ich glaube, das das "X" oben rechts das fenster zwar schließt aber weder eine WM_close noch eine WM_QUIT message sendet.

    it's not a bug, it's a feature 😃

    wenn ich mich so ein halbes jahr zurück erinnere, da hab ich auch mal ein paar progs für pocket pcs geschrieben...hatte genau den gleichen effekt. die anwendung bleibt im hintergrund aktiv wenn man sie über dieses 'X' das man ja nicht selbst gemacht hat schliesst. bei mir war das kein problem, weil ich eh nen soft reset gemacht hab...
    *grübel*
    man hat doch eh diesen anwendungsmanager oder so... 😕

    ich weis leider auch nicht mehr so...kann auch nix testen...



  • Hmm, vielleicht setzt du nen Punkt wo du hinklickst der dann PostQuitMessage(0) aufruft?! .. oder wenn eine bestimmte Taste oder Zeichenkette eingegeben wird?!

    <- nur Vorschläge .. weiss nicht inwieweit man sowas auf Win-CE realisieren kann (ich weiss noch nicht mal was Win-CE ist aber egal ;))!

    Mfg 🙂



  • naja windows-ce ist das betriebssystem für die PDA (das sind diese kleinen taschencomputer mit touchdisplay und nem stift).

    gut zu wissen ist erstmal,
    das es sich um keinen bug von meiner seite her handelt.

    schlecht ist allerdings,
    das ich immer noch nicht die message abfangen kann die dieses "X" sendet wenn es gedrückt wird.

    denn dann könnte man ja an der stelle einhaken und PostQuitMessage senden.

    nein es sollte schon über dieses "X" geschlossen werden oder jemand verät mir wie ich eine fullschreen-anwendung für win-ce zaubere.

    und nein overlappedwindow ist nicht win-ce kompatibel



  • ist das mit dem 'X' nicht bei allen anwendungen so gewesen? wo ist denn das problem, dass du sie unbedingt schliessen willst wenn mann das 'X' drückt... 😕


Anmelden zum Antworten