Ein paar fragen ;-)



  • 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
    


  • Hau mal bidde einen Breakpoint nach nQuizState++; rein und guck mal was die Variable fürn Value hat...



  • das haut genau hin nach dem ersten aufruf habe ich 1 nach dem zweiten aufruf 2 usw.



  • gut problem erledigt habe zwar ein rebuild gemacht hatte aber vergessen mal ein clean durchzuführen. nach dem Clean funktioniert es perfekt



  • 🙂


Anmelden zum Antworten