Gruppenfeld



  • Hallo zusammen.

    Habe ein kleines prob. mit einem Gruppenfeld. Ich habe ein Gruppenfeld mit
    ein paar Optionsfeldern drin. Habe im Gruppenfeld "Gruppe" angeklickt und habe dem Gruppenfeld eine Steuervariable CButton zugeordnet. Jetzt möchte ich das komplette
    Gruppenfeld inclusive Optionsfelder bei bedarf mit ShowWindow sichtbar oder unsichtbar machen. wie kann ich das in einen aufwand machen? oder muss ich für jedes Optionsfeld einzeln ShowWindow aufrufen also auch genausoviele CButton erzeuge? Wobei das meine ich nicht geht da ich ja pro Gruppe nur eine Variable zuordnen kann.



  • Weiß das wirklich niemand????

    mfg Tom



  • Ein Trippel Hinweise (vgl. ein Paar (=2) Hinweise) °~>
    1.
    Es gibt die Funktion

    GetDialogItem
    

    ,
    mit der man die einzelnen Steuerelemente
    anhand der ID ansprechen kann, ohne
    Variablen zu erstellen:

    /*  Optional:
    this->       */
        GetDialogItem( IDC_BUTTON1 );
    

    2.
    Wenn du das Gruppenfeld unsichtbar machst,
    verschwinden nicht die Optionsfelder, die
    angeblich auf ihm plaziert sind.
    Denn alle sinjd sozusagen auf gleicher
    Ebene.
    Um dies zu verändern, muss man viele Ein-
    Stellungen ändern, und das bei jedem
    Optionsefeld einzeln:
    Schritt 1:

    // Man muss alle Steuerelemte dem Gruppenfeld
    //  unterorndnen:
    /*  Optional:
    this->       */
        GetDlgItem(/* Optionsfeld-ID */)->
            SetParent(
                GetDlgItem(/* Gruppenfeld-ID */));
    ...
    

    Schritt 2:

    // Man muss alle Steuerelemte verschieben, da
    //  der Koorinatenursprung (wo x=0 und y=0 ist)
    //  Dialogfeldes ungleich dem des Gruppenfeldes
    //  ist (meißt oben links in der Ecke).
    CRect rGrp, // Größe des Gruppenfeldes
          rOpt; // Größe des Optionsefeldes
    
    /*  Optional:
    this->       */
        GetDlgItem(/* Gruppenfeld-ID */)->
            GetWindowRect( rGrp );
    
        GetDlgItem(/* Optionsfeld-ID */)->
            GetWindowRect( rOpt );
    
        GetDlgItem(/* Optionsfeld-ID */)->
            SetWindowRect( rOpt - rGrp ); // <- Hier bin ich mir nicht so sicher
    ...
    

    Schritt 3:

    // Man muss jedes Steuerelement informieren, dass
    //  sich was getan hat.
        GetDlgItem(/* Gruppenfeld-ID */)->
            UpdateWindow();
    
        GetDlgItem(/* Optionsfeld-ID */)->
            UpdateWindow();
    ...
    

    3.
    Ich würde alle ID in einem Array speichern
    und dann jedes Optionsfeld einzelnd
    mithilfe einer For-Schleife abklappern
    "abklappern".

    Ich Entschuldige mich schon einmal vorweg
    für die Die Rechtschreib-, Syntax- und oder oder logische Fehler.



  • Oder etwas in der Art:

    void EnableWindowGroup(HWND hwnd, int enable)
    {
    	// Find first window of group
    	while (hwnd && !(::GetWindowLong(hwnd,GWL_STYLE) & WS_GROUP))
                hwnd = ::GetWindow(hwnd, GW_HWNDPREV);
    
    	if (!hwnd) {
    	    ASSERT(FALSE); 
                return;
    	}
    
    	// Perform operation for all windows of this group
    	do {
    	    if (!enable) {
    		::EnableWindow(hwnd, FALSE); ::ShowWindow(hwnd, SW_SHOW);
    	    }
    	    else if (enable > 0) {
    		::EnableWindow(hwnd, TRUE);  ::ShowWindow(hwnd, SW_SHOW);
    	    }
    	    else {
    		::ShowWindow(hwnd, SW_HIDE); ::EnableWindow(hwnd, FALSE);
    	    }
    	    // Cannot use GetNextDlgGroupItem() here,
    	    // because hidden windows are skipped by Windows.
    	    hwnd = ::GetWindow(hwnd,GW_HWNDNEXT);
    	} while (hwnd && !(::GetWindowLong(hwnd,GWL_STYLE) & WS_GROUP));
    }
    

    und an das HWND eines CWnd kommst Du ja über dessen Membervariable m_hWnd

    P.S: Sorry, die Formatierung ist leider etwas aus dem Tritt geraten, da ich hier ne Tabsize von 4 eingestellt habe.

    P.P.S: Sowas sollte man eigentlich in die FAQ packen!


Anmelden zum Antworten