Steuerelemente ermitteln / Größe anpassen



  • Hi,

    in meinem MFC-Projekt (dialogbasierend) möchte ich alle Steuerelemente meines
    Hauptdialoges ermitteln. Und dann alle Steuerelemente in der Größe (Breite und
    Höhe) verändern.

    Könnt ihr mir einen Ansatz dazu geben, welche Funktionen dazu notwendig wären?
    Gibt es sowas wie GetNextControl und konsorten?



  • Wenn ich mich nicht irre, hiess das GetNextDlgItem(...). [edit]...nee, so hiess es wohl doch nicht... [/edit]
    Ansonsten guck mal hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39118.html


  • Mod



  • Ich sehe noch nicht, wie ich die Steuerelemente in meiner Anwendung
    mit GetWindow ermitteln soll. Werden damit nicht nur Haupt-Fenster ermittelt (das was ich im Taskmanager sehe) 😕



  • Ich sehe erst jetzt was du meintest und versuche es zu verstehen:

    CDialog::OnPaint(); 
        CDialog::OnSize(nType, cx, cy); 
        CEdit * ped=(CEdit *) GetDlgItem(IDC_EDIT1); 
        if(!ped) 
            return; 
    
        CRect rect; 
        GetClientRect(rect);  
    
    //hier probiere ich noch rum...und brauche bitte eure Hilfe
    for (CWnd* pChild = GetWindow(GW_CHILD); pChild; pChild = pChild->GetNextWindow(GW_HWNDNEXT))
    {
    
    	pChild->MoveWindow(0,rect.bottom-rect.top-(rect.bottom-rect.top)/10,rect.right-rect.left,(rect.bottom-rect.top)/10);   
    
    }
    

    Ich habe noch nicht raus, wie man richtig die Controls enumeriert.
    Kann mir das jemand verraten?


  • Mod

    Was ist Dein Problem?



  • Ich bin definitiv zu blöde zu ermitteln wie ich in Abhängigkeit
    von der Dialoggröße meine Controls mit MoveWindow im Verhältnis
    anpasse 🙄



  • ueberlade die funktion "OnSize" {WM_SIZE}
    dort bekommst du die hoehe und breite des fensters uebergeben

    oder du holst dir die groesse des fenster mit

    CRect rect;
    this->GetWindowRect(&rect);
    element.MoveWindow(10, 10, rect.Wide()/2, rect.Height()/2);

    nun ist das "element" von ganz links ganz oben bis zur mitte

    in OnSize kannst du direkt mit cx und cy arbeiten und brauchst die groesse nicht holen



  • Hi, ich teste damit jetzt etwas herum.

    Damit ich die Controls nur im Verhältnis mit vergrößer müsste ich
    dann vermutlich die alte Dialggröße ermitteln und die %-Zahl der Vergrößerung
    ermitteln. Wenn dann also 10% Vergrößert wurde, müsste ich in MoveWindow
    bei den Parametern +10% hinzurechnen.

    Stimmt das so in etwa?


  • Mod

    Dazu würde ich beim Start in OnInitDialog die originalen Größen speichern. In OnSize die entsprechende Rechnung durchführen und die Controls vergrößern.

    Achtung: OnSize wird auch aufgerufen, wenn noch kein Control erzeugt wurde.



  • das achtung ist richtig
    immer bei OnSize

    if(element)
    element.MoveWindow

    Ich selber machs immer so das ich mir nicht merke wie gross das fenster vorher war, sondern ich mach immer sowas wie

    cx / 2 - 160
    oder soetwas in der art - dann ist es immer abhaengig zur derzeitigen groesse



  • Würde ich dann so in OnInit verfahren?

    //postion des buttons merken:
    mybutton1->GetWindowRect(&rcButton); 
    ScreenToClient(&rcButton); 
    
    //original dialoggröße merken:
    GetClientRect(diarect);
    

    Dann müsste ich in OnSize wieder die gezogene neue Größe
    nehmen (cx und cy) und von der Ursprungsgröße abziehen.
    Das Ergebnis wäre meine Addition zur neuen Position, an der ich
    meinen Button wieder mit MoveWindow() setze?!

    Oder war das Meilen daneben 😃



  • Sry Mr Evil, hatte deinen Beitrag noch nicht gesehen.

    Kannst du mir mal ein Beispiel posten, wenn es nicht zu viel
    Umstände macht? Ich würde mich gern mal an einem funktionierenden
    Snippet probieren und damit experimentieren. Die Treffer über
    Google gehen weit über das hinaus, was ich bisher gelesen/gelernt habe.



  • www.simracing-factory.de/evil/SizeDemo.rar

    Standard dialog-anwendung erstellt

    meine aenderungen:
    - drei list controlls gesetzt
    - ok und cancel buttons entfernt
    - variablen fuer die controlls erstellt
    - code hinzugefuegt bei OnInitDialog
    - OnSize ueberladen und dort code eingefuegt

    der fuer dich relevante teil ist in
    //-------------------------------------------------------------------------------------------------
    eingerahmt

    viel spass



  • Evil ich glaube sein Problem war, dass er die Berechnung nicht versteht.
    Dein Beispiel gibt ja auch mehr oder weniger absolute Werte an!

    Wenn er die Elemente im Seitenverhältnis an der gleichen Stelle behalten
    will und auch deren Größe im gleichen Maßstab mitändern will, wird man viel
    mehr Aufwand betreiben müssen.

    Ich hab das Problem auch bei manchen kleinen Tools.Und zwar wird alles
    bei einer Auflösung von 1024x768 relative groß dargestellt. Dann kommt ein
    Spezi mit ner Auflösung die eine Stufe größer ist, und schon hat er nur noch
    einen Minidialog aufm Schirm!

    Gibts dazu denn nicht schon fertige Klassen? In den Windows-Forms ist unten
    rechts in der ecke standardmäßig ein schöner Resizepunkt eingebaut.
    DAS wäre was cooles als Option in den MFC, wenn es sich auf die Controls auswirkt! 💡



  • es sind mehr oder weniger absolute werte, welche sich aber an die bildschirmgroesse anpassen

    zb sag ich 160 pixel kleiner als die halbe breite
    wenn das fenster vergroessert wird, ist die halbe seite auch groesser, und dadurch das element ebenso

    das bedeutet: groesseres fenster = proportional groessere elemente - passt doch

    Josche schrieb:

    ...rechts in der ecke standardmäßig ein schöner Resizepunkt eingebaut.
    DAS wäre was cooles als Option in den MFC, wenn es sich auf die Controls auswirkt! 💡

    mein beispiel mal compiliert ? du wirst sehen das sich alle elemente dynamisch vergroessern wie das fenster ohne ein festen wert {o;


Anmelden zum Antworten