Suche Funktionen für C

HI,

welche Message mus ich abfangen, damit das Programm nicht mehr auf eine Message Wartet. Eingesetzt wird GetMessage(). Mein Problem ist, das das Programm dauernd am Arbeiten ist und wird Teilweise nur dann Fortgesetzt wenn ein Event Passiert, also z.B. Mausbewegungen usw. Ansonsten bleibt es anscheint bei GetMessage stehen.

Folgene Events werden abgefragt:

Code:
     case WM_CREATE : [...] return 0 ;
     case WM_SETFOCUS : SetFocus (hwndEdit); SetFocus (hwndStatus);return 0 ;
     case WM_SIZE : [...]  return 0 ;
     case WM_COMMAND :return 0;               
     case WM_DESTROY : ProgrammFertig=TRUE; PostQuitMessage(0);return 0;

Welche Message muss ich abfangen damit statt DefWindowProc (), 0 gesendet wird, was ja zur weiterführung des Programmes führt

Ab und zu wird im Programm folgende, Routine ausgeführt damit die Messages verarbeitet werden können:

Code:
int s,gm;
    static int ok=TRUE;
    if(ProgrammFertig==FALSE)
    {
      AddTextZeile(TEXT("Get Msg Anfang"));
      for (s=1;s<20;s++){
         if(ok==TRUE)
         {
            if (GetMessage (msg, NULL, 0, 0))
            {
               TranslateMessage (msg);
               DispatchMessage (msg);
            }
            else
            {ok=FALSE;}
         }
      }
      AddTextZeile(TEXT("Get Msg Ende\n"));
    }

Wegen der Funktion AddTextZeile() weiss ich das er irgendwo zwischen den Beiden Aufrufen immer wartet, und das anscheint auf eine Message.

Also wie kann ich das Verhindern?
 
Weiss den Keiner eine Antwort? Ich glaub ich brauch nur eine Message die von Windows dauernd gesendet wird, wie z.B. Timerticks oder so und die dann mit Return 0 beantworten statt mit DefWindowProc (). Ich habe schon einiges Probiert z.B alle message von 6 bis 1024 mit 0 zu beantworten aber das Resultat war das sich das Fenster gleich schloss :(
 
OK PeekMessage() ist die Lösung, habe ich gerade rausgefunden. Aber nun ist das Problem das die Anzeige in der Liste unangenehm Flackert

Code:
if (PeekMessage (msg, NULL,WM_SIZE,WM_SIZE,PM_NOREMOVE))
            {
               TranslateMessage (msg);
               DispatchMessage (msg);
            }

Nach der Jetziger Einstellung wird nur eine Größenänderung des Fensters zugelassen so viel ich weiss, obwohl das auch nicht möglich ist. Das Fenster wird mit dem Warte-Mauszeiger komplett belegt was mir teilweise schon mal passen tut, dann kann das Fenster nicht frühzeitig beendet werden, bevor die Arbeit des Programmes beendet ist.

Wie bekomme ich nun das unangenehme Flackern weg?

EDIT: Ok das Flackern ist jetzt auch verschwungen, ich hatte unnötiger weise noch ein paar Messages als 0 zurückgesendet. :rolleyes:
 
Zuletzt bearbeitet:
Hi,

mit welcher Funktion unter Windows bekomme ich genau heraus in Welchen Verzeichnis mein Programm liegt. Das erste Argument gibt ja nur den Namen aber nicht das Directory wieder :( Ich habe es schon mit GetCurrentDirectory versucht, aber da wird nur das letzte angesprochende Directory ausgegeben, das ist mir zu unsicher. Ausserdem Liefert es nur das Dir aus, wovon aus das Programm aufgerufen wurde. Ich brauche aber das Dir in dem mein Prog liegt, zum Speichern und Laden von Einstellungen, die sollen nicht sonst wie versteut auf der Platte liegen.
 
Benutze GetModuleFilename( NULL ). Damit bekommst du den kompletten Pfad zu deiner EXE-Datei. Du musst nur noch bis zum letzten Backslash alles wegmachen (ist ja der Dateiname drin) und schon hast du einwandfrei deinen Pfad.

Funktioniert immer.
 
Endurion hat gesagt.:
Benutze GetModuleFilename( NULL ). Damit bekommst du den kompletten Pfad zu deiner EXE-Datei. Du musst nur noch bis zum letzten Backslash alles wegmachen (ist ja der Dateiname drin) und schon hast du einwandfrei deinen Pfad.

Funktioniert immer.

Werde ich Probieren :) Eine Routine die mit nur den Pfad zurück gibt habe ich mir schon geschrieben, die brauchte ich schon um mit den Filerequester nur den Path zurück zu bekommen :) Ich konnte leider bis her noch nicht rausfinden wie ich den Windowseigenen Verzeichnis-Wahl - Requester aufrufen kann. :( Ich kenne noch nicht mal die Funktion dazu :(
 
Endurion hat gesagt.:
Benutze GetModuleFilename( NULL ). Damit bekommst du den kompletten Pfad zu deiner EXE-Datei. Du musst nur noch bis zum letzten Backslash alles wegmachen (ist ja der Dateiname drin) und schon hast du einwandfrei deinen Pfad.

Funktioniert immer.

Klappt übrigens Super :)

Neues Problem: Ich möchte meine GUI Sperren das mach ich mit EnableWindow

Code:
// Gesamte GUI Sperren/Freigeben (06.02.2006) 
void GUIFreigeben(INT Entsperren){
      EnableWindow (hwndPrefs    ,Entsperren);
      EnableWindow (hwndPrefsWahl,Entsperren);
     [*Weitere Gadgets*]
      EnableWindow (hwndPattern  ,Entsperren);
      EnableWindow (hwndGenerier ,Entsperren);
      // Fenster selber
      EnableWindow (hwnd,Entsperren);SetFocus(hwnd);
      SetGUIFocus();
}

Nun tritt das Problem auf das die GUI nicht sofort als gesperrt gezeichnet wird. Erst wenn eine MessageBox sich öffnet wird die GUI neu gezeichnet und als gesperrt makiert, dann ist es aber schon fast zu spät. Der Focus wird aber am Ende mit SetGUIFocus() gesetzt hat aber anscheint keine Auswirkung. Die GUI wieder Freizugeben dagegen klappt aber sofort. :confused: Variable "Entsperren" enthält übrigens FALSE fürs Sperren TRUE fürs freigeben.
 
Ich hänge mal ein BIld an damit ihr seht worum es geht. Solange die Generierung Läuft soll das ganze Fenster gesperrt werden
 

Anhänge

  • SN-ListDatei-Forum2.png
    SN-ListDatei-Forum2.png
    95,4 KB · Aufrufe: 22
Wenn du das Generieren direkt auf den Knopfdruck hin machst (im selben Thread), dann "hängt" natürlich das Fenster. Die Nachrichtenpumpe wird in der Zeit nicht aufgerufen.

Wenn du das so haben möchtest, müsstest du dir die Generierung in einen eigenen Thread setzen. Dann reagiert das Fenster zu dem Zeitpunkt auch noch und zeigt solche Änderungen direkt an.
 
Wenn du das so haben möchtest, müsstest du dir die Generierung in einen eigenen Thread setzen. Dann reagiert das Fenster zu dem Zeitpunkt auch noch und zeigt solche Änderungen direkt an.

A propos eigener Thread: Cusco, du würdest sicher mehr Antworten bekommen, wenn du für deine Fragen eigene Threads (mit passenden Titel) erstellen würdest, anstatt immer alles hier hineinzupacken.

Nebenbei: Hallo, Endurion! :)
 

Neue Beiträge

Zurück