Buttons bei Beep ohne effekt



  • Ok. Danke.
    Wie mach ich das denn am besten?
    Kann ich einen Button auch anders deaktivieren als mit:

    GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(FALSE);
    

    Gruß
    Andreas


  • Mod

    Nein! Das kann nicht sein.
    Wenn ein Button disbaled ist und dieser geklickt wird während er diabled ist wird das Event ignoriert.

    Das Problem liegt wahrscheinlich eher da dran, dass Deine Anwednung keinerlei Messages in den 3 Sekunden zulässt.

    Lagere das Tonabspielen in einen eigenen Thread uas.



  • Wie kann ich das tun und wie stell ich sicher das es erst weitergeht wenn der thread fertig ist?

    anbei mal der Code

    void CHzDlg::OnBnClickedButtonAbspielen()
    {
    	GetDlgItem(IDC_EDIT1)->SetFocus();
    	GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(FALSE);
    	UpdateData(TRUE);
    	HzBeep(m_iFreq, m_iTime*1000);
    	GetDlgItem(IDC_BUTTON_ABSPIELEN)->EnableWindow(TRUE);
    }
    
    void CHzDlg::HzBeep(int Frequenz, int TimeInSek)
    {
    	Beep(Frequenz,TimeInSek);
    }
    

    Die Funktion HzBeep hab ich gemacht um event. hier noch Dinge einzubauen.
    Kann mir jemand mit dem Thread helfen?



  • Kann mir jemand weiterhelfen?


  • Mod

    Enfach eine Funktion schreiben AfxBeginThread ausführen und dort den Ton abspielen lassen...



  • Also jetzt kann ich sofort wieder den Button Abspielen drücken und der Ton startet sofort neu. Und ich habe es nicht geschafft meine Parameter frequnez und time mit dem AfxBeginThread zu übergeben an HzBeep-Function.
    Kann mir jemand nochmal ne Hilfestellung geben?

    Gruß
    Andreas



  • die Daten kannst du doch in eine Struktur schreiben und diese über LPVOID pParam von AfxBeginThread an den tread übergeben. Bevor du deinen Tread startest deaktivierst du den Button und wenn der Thread abgelaufen ist, Sendest du eine Message damit der Button wieder aktiv wird



  • Hallo Andreas

    Du mußt einfach die WM_Message über die gedrückte Maustaste abfangen.
    Da diese wartet bis du aus dem "HzBeep()" raus bist, musst du sie danach aus der Warteschlange holen.

    void CBeepDlg::OnBeep() 
    {
    	MSG msg;
    
    	SetCursor(LoadCursor(NULL, IDC_WAIT));
    	GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
    
    	HzBeep(500,1000);
    
    	while (PeekMessage(&msg,NULL,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE) != 0) 
    	{
    	} 
    
    	GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
    
    	// Cursor wieder normal
        SetCursor(LoadCursor(NULL, IDC_ARROW));
    }
    

  • Mod

    @Paul: Wenn schon eine Message-Loop, dann bitte eine, die ale Nachrichten behandelt... So ist auch nur halbgar.

    Die Thread-Methode ist mit sicherheit die einfachste...



  • Vielen Dank Paul hat so geklappt.
    😃

    Gruß
    Andreas


Anmelden zum Antworten