Ein paar fragen ;-)



  • ich bastel grad an einem Programm und im rechts sind einfach 10 texte angeordnet (static text) einfach durchnummeriert IDC_text1 bis IDC_text10. allesamt sind deaktiviert nun möchte ich mit einer funktion bei jedenaufruf einem nach den anderen aktivieren (aber es oll immer nur einer aktiviert sein). daher meine Fragen wie aktivier ich solch einen "Static text" und wie sollte funktion fürs "hochschalten aussehen".

    Und das nächstde ist ich möchte eine abfrage machen 4 Buttons und in einem string habe ich dann je nachdem was sich besser machen würde (entweder nummern oder buchstaben) den richtigen Button gespeichert wie sieht solch eie funktion aus? dieses vergleichen vorallem wie mach ich das mit der abfrage der Buttons. weil ich würde gern eine funktion haben die mir dann aber sagen kann welcher der buttons gedrückt wurde

    danke schonmal und nen Schönen Herrentag noch





  • @Erhard Henkes

    vielleicht bin ich heut einfach zu schusselig aber dein link hat mich kein bischen weitergebracht. aber kennen tue ich dein MFC einsteiger tutrial war mir bisher oft ne große hilfe (hoffentlich baustde es bei gelegenheit noch weiter aus)

    vorallem muss ich den static text dann wieder ne variable zuweisen weil das hab ich momentan nicht da ich den text ja nicht verändern möchte



  • Sorry, hatte den Eindruck, hier fehlen massiv Grundlagen.
    z.B. zu Frage 1 (IDC_TEXT1 bis IDC_TEXT9 nacheinander angelegt):

    void CStaticTextDlg::OnButton_StaticText_Hochschalten() 
    {
    		static BYTE zahl    = 0;
    		const  BYTE ZAHLMAX = 9; // Anzahl STATICs minus 1
    
    		for( int i = 0; i<=ZAHLMAX; ++i)
    			GetDlgItem(IDC_TEXT1 + i)->EnableWindow(FALSE);
    
    		GetDlgItem(IDC_TEXT1 + zahl)->EnableWindow();
    
    		zahl++;
    		if(zahl > ZAHLMAX) 
    			zahl = 0;
    }
    

    Frage2 ist unklar formuliert. Wenn ich eine Funktion haben will, die auf einen Button reagiert, dann erzeuge ich mir eine Funktion OnButton...(...).



  • eine frage hätte ich noch zum verwenden von GetDlgItem meine funktion ist in der klasse Quiz drin kann man von dortaus aufs Main windows(oder wie das auch heisst zugreifen?). Irgendwie hab ich schon überlegt ob man der funktion irgendwie nen Pointer oder Handle übergeben muss das habe ich aber noch nie gemacht.

    und zum zweiten problem kenn ich halt nur folgende möglichkeit

    void COneMillionDlg::OnButton1()
    {
    	if(!m_Quiz.IsAnswerCorrect())m_Quiz.NextQuestion;
    
             m_Quiz.YouLose()
    }
    
    void COneMillionDlg::OnButton2()
    {
    	if(!m_Quiz.IsAnswerCorrect())m_Quiz.NextQuestion;
    
             m_Quiz.YouLose()
    }
    
    void COneMillionDlg::OnButton3()
    {
    	if(!m_Quiz.IsAnswerCorrect())m_Quiz.NextQuestion;
    
             m_Quiz.YouLose()
    }
    
    void COneMillionDlg::OnButton4()
    {
    	if(!m_Quiz.IsAnswerCorrect())m_Quiz.NextQuestion;
    
             m_Quiz.YouLose()
    }
    

    so kenne ich das bisher meine frage ist nun ob es auch eine möglichkeit folgender art gibt

    PSEUDOCODE
    
    void COneMillionDlg::OnButtonsClicked()
    {
    --welcher button wurde gedrückt
    
    --rufe funktion is answercorrect mit parameter(welcher button gedrückt wurde) auf
    
    behandle richtig und falsche antwort 
    
    }
    


  • Mach das z.B. so:

    void COneMillionDlg::OnButton1(){Button(1);}
    void COneMillionDlg::OnButton2(){Button(2);}
    void COneMillionDlg::OnButton3(){Button(3);}
    void COneMillionDlg::OnButton4(){Button(4);}
    
    void COneMillionDlg::Button(int i)
    {
        if(!m_Quiz.IsAnswerCorrect(i))
            m_Quiz.ShowQuestion(i+1);
        m_Quiz.YouLose()
    }
    

    Wie man klassenübergreifend zugreift, siehst Du z.B. hier (Doc und View):
    http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel7.htm

    void CTest_View::OnDraw(CDC* pDC)
    {
      CTest_Doc * pDoc = GetDocument(); // Zeiger auf andere Klasse beschaffen
      pDC->MoveTo(pDoc->ErstesQuadrat); // Zeiger_auf_fremde_Klasse->Member verwenden
      pDC->LineTo(pDoc->ErstesQuadrat.x + pDoc->Laenge, pDoc->ErstesQuadrat.y); 
    //...
    


  • sorry aber irgendwie klappt das nicht nicht ganz.

    hätte vielleicht dazu sagen sollen das ich eine dialogbasierte anwendung habe



  • Was kommt für eine Fehlermeldung?! WO ist dein Problem?!



  • ich bekomme es nicht hin von meiner Klasse auf IDC_TEXT1 zuzugreifen

    Fehlermeldungen gabs verschiedene je nachdem was ich probiert habe.

    z.b. habe ich dann einfach folgendes versucht

    void Quiz::SetNextQuizState(HWND hwnd)
    {
    .
    .
    .
        GetDlgItem(hwnd, IDC_TEXT1)->EnableWindow();
    

    das endet dann in

    error C2039: 'EnableWindow' : is not a member of 'HWND__'
    


  • Du benutzt die API-Version von GetDlgItem, offensichtlich ist Quiz nicht von CWnd abgeleitet. Du könntest aber z.B.

    CWnd::FromHandle( GetDlgItem(hwnd, IDC_TEXT1) )->EnableWindow();
    

    benutzen.



  • erstmal @conan danke das funktioniert jetzt

    eins habe ich aber noch folgendes funktioniert

    CWnd::FromHandle( GetDlgItem(hwnd, IDC_TEXT1) )->EnableWindow();
    

    dies aber nicht

    int a = 3;

    CWnd::FromHandle( GetDlgItem(hwnd, IDC_TEXT1 + a) )->EnableWindow();
    

    eigentlich doch genau nach Erhard Henkes vorschlag der Kompiler meckert auch nicht nur beim aufruf des programmes gibts nen absturz



  • Die Frage ist, was du denkst 😃

    Ich gehe davon aus, das du der Meinung bist das wenn du

    IDC_TEXT1 + a
    

    schreibst, IDC_TEXT13 daraus kommt? oder IDC_TEXT4 ?! Beides nicht.

    IDC_TEXT1 ist ja ein #define in der resource.h. Nun wird durch den Preprozessor aber IDC_TEXT1 durch den definierten Wert ersetzt. K. Gehen wir bsw davon aus das folgendes in der resource.h steht:

    #define IDC_TEXT1 105
    

    Dann würde aus:

    CWnd::FromHandle(GetDlgItem(hWnd, IDC_TEXT1+a))->EnableWindow();
    
    CWnd::FromHandle(GetDlgItem(hWnd, 105+a))->EnableWindow();
    

    d.h. würd dir GetDlgItem einen Handle des ctrls mit der ID 105+a zurückliefern.



  • Wenn Du die ID im Ressourceneditor erstellst oder eingibst, ist nicht gewährleistet, das die tatsächlichen Werte die dahinter stehen, in einer Reihenfolge angelegt werden. Das müsstest Du von Hand erledigen IMHO in der ressource.h.

    OT: wie stehts um den Ticker ? 😉

    Edit: Ah, dass war knapp 🙄



  • @(D)Evil und connan

    Da habe ich was verhunzt, das die resource da nicht hintereinander kommen.

    Peinlich solch ein schusselfehler zu begehen

    @connan am Newsticker wird weiterhin gebastelt

    momentan versuche ich krampfhaft das hauptfenster in den Tray zu schicken.
    Aber bisher ohne erfolg 😉 egal nach welchem tutorial ich vorgehe es gibt keine fehlermeldungen sonder dass programm startet einfach nicht



  • sorry aber ich glaub ich drehe durch

    void Quiz::SetNextQuizState(HWND hwnd)
    {
    
        CWnd::FromHandle( GetDlgItem(hwnd, IDC_TEXT1 + QuizState) )->EnableWindow(FALSE);
    
    	QuizState++;
    
        CWnd::FromHandle( GetDlgItem(hwnd, IDC_TEXT1 + QuizState) )->EnableWindow();
    
    return;
    }
    

    IDC_TEXT1 ist bei mir jetzt

    #define IDC_TEXT1                       1007
    

    also müsste beim ersten durchlauf der schleife ja reintheoretisch

    1007 + 0 deaktiviert werden
    und 1007 + 1 namentlich IDC_TEXT2 aktiviert werden lustigerweise
    wird aber IDC_TEXT6 oder als resource 1012 aktiviert
    beim nächsten aufruf wird dann auch nicht IDC_TEXT7 (1013) sondern IDC_TEXT5(1011) aktiviert



  • 😃 👍 Richtig lustig hier.



  • void Quiz::SetNextQuizState(HWND hwnd)
    {
    
        CWnd::FromHandle(GetDlgItem(hwnd, IDC_TEXT1 + QuizState))->EnableWindow(FALSE);
    
        nQuizState++;
    
        CWnd::FromHandle(GetDlgItem(hwnd, IDC_TEXT1 + QuizState))->EnableWindow();
    }
    

    Das hat jawohl wenig mit einer schleife zu tun...



  • @(D)Evil ne schleife die gibts da auch nicht währe ja auch sinnlos

    jedesmal wenn eine eine Frage richtig beantwortet wird soll diese Funktion den Punkte stand erhöhen

    und es passiert ja gemau das was sie eigentlich machen soll der vorhergehende text wird abgeschaltet der nächste ein. nur halt durcheinander und verkehrt herum.



  • Ach zeig einfach mal deine verdammte resource.h 😉



  • Null Problemo

    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by OneMillion.rc
    //
    #define IDM_ABOUTBOX                    0x0010
    #define IDD_ABOUTBOX                    100
    #define IDS_ABOUTBOX                    101
    #define IDD_ONEMILLION_DIALOG           102
    #define IDR_MAINFRAME                   128
    #define IDC_Frage                       1001
    #define IDC_ANTW_A                      1002
    #define IDC_ANTW_B                      1003
    #define IDC_ANTW_C                      1004
    #define IDC_ANTW_D                      1005
    #define IDC_TEXT0                       1006
    #define IDC_TEXT1                       1007
    #define IDC_TEXT2                       1008
    #define IDC_TEXT3                       1009
    #define IDC_TEXT4                       1010
    #define IDC_TEXT5                       1011
    #define IDC_TEXT6                       1012
    #define IDC_TEXT7                       1013
    #define IDC_TEXT8                       1014
    #define IDC_START                       1015
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        129
    #define _APS_NEXT_COMMAND_VALUE         32771
    #define _APS_NEXT_CONTROL_VALUE         1016
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    

Log in to reply