Deutsch
Forum

EINFACHE Resize-Routine

 

Christof
Neuß
Hallo,

und hier mal wieder eine Einsteigerfrage.

Ich habe ein sehr einfaches Hauptfenster. Darin sind nur ein paar Buttons und ein paar Texte enthalten. Wenn der Anwender das Fenster vergrößert oder verkleinert sollen nur die enthaltenen Objekte entprechend größer oder kleiner werden (also prozentual zum Hauptfenster). Das kann auch gerne erst nach dem Loslassen der Maustaste erfolgen.

Grundsätzlich fange ich mit ...%key=4 also das Ereignis ab und verzweige in die Resize-Routine.
Dort müsste ich eigentlich nur für alle enthaltenen Objekte die Position und die Größe neu setzen. Wie ich diese berechne ist mir auch klar.

Was mir nicht klar ist:

Wie kann ich z.B. alle enthaltenen Objekte in ein Array packen, damit diese nacheinander abgearbeitet werden, ohne dass ich bei einem neuen Objekt daran denken muss, dieses in die Resize-Routine einzubinden?

Wie kann ich die akutelle Position des Objektes ermitteln, um dann die neue Position zu setzen?

Vielleicht habe ich aber auch wieder mal Tomaten auf den Augen....

DANKE für jede Hilfe.
KompilierenMarkierenSeparieren
 $P+
SET(ERRORLEVEL,0)
DECLARE RICHEDIT1&
DECLARE BUTTON1&,BUTTON2&,BUTTON3&,BUTTON4&,BUTTON5&,BUTTON6&,BUTTON7&,BUTTON8&
DECLARE Textfeld1&,ENDE%
DECLARE RADIOBUTTON1&, RADIOBUTTON2&
DECLARE Breite%, Hoehe%
DEF GETSYSCOLOR(1) !USER32,GetSysColor
VAR RZVersion$=X
VAR Arial16Fett&=Create(Font,Arial,16,0,1,0,0)
VAR Arial18Fett&=Create(Font,Arial,18,0,1,0,0)
WINDOWSTYLE 63
WINDOWTITLE Union Investment
WINDOW 143,41-756,587
CLS GETSYSCOLOR(15)
USEFONT ARIAL,16,0,0,0,0
SETDIALOGFONT 1
Breite%=Width(%HWND)
Hoehe%=Height(%HWND)
Hier kann ggf. Ihr Menü hin
BUTTON1&   = CREATE(BUTTON,%HWND,--- Bitte zuerst RZ-Version wählen ---,0020,0025,0450,0030)
BUTTON2&   = CREATE(BUTTON,%HWND,2. Union Investment-Volumina aus Internet ziehen,0020,0060,0450,0030)
BUTTON3&   = CREATE(BUTTON,%HWND,3. Stammdaten zur Berichtserstellung erfassen,0020,0095,0450,0030)
BUTTON4&   = CREATE(BUTTON,%HWND,4. Qualitative Fragen beantworten,0020,0130,0450,0030)
BUTTON5&   = CREATE(BUTTON,%HWND,5. Analyseprogramm starten,0020,0165,0450,0030)
BUTTON6&   = CREATE(BUTTON,%HWND,6. Auswertungsdatei versenden,0020,0200,0450,0030)
SetFont Button1&, Arial18Fett
SetFont Button2&, Arial18Fett
SetFont Button3&, Arial18Fett
SetFont Button4&, Arial18Fett
SetFont Button5&, Arial18Fett
SetFont Button6&, Arial18Fett
BUTTON7&  = CREATE(BUTTON,%HWND,Drucken,0662,0517,0070,0030)
BUTTON8&  = CREATE(BUTTON,%HWND,ENDE,0662,0199,0070,0030)
SetFont Button8&, Arial18Fett
RADIOBUTTON1& = CREATE(RADIOBUTTON,%HWND,BB3  ,0490,0165,0060,0030)
RADIOBUTTON2& = CREATE(RADIOBUTTON,%HWND,agree,0560,0165,0060,0030)

if RZVersion$=BB3

    SetCheck RADIOBUTTON1&,1
    SetText BUTTON1&, 1. Info-Abfragen erstellen

elseif RZVersion$=agree

    SetCheck RADIOBUTTON2&,1
    SetText BUTTON1&, 1. IDA-Abfragen erstellen

endif

Textfeld1& = CREATE(Text,%HWND,Bitte klicken Sie nacheinander die Buttons an.
Im unteren Textfeld werden Ihnen dann Hinweise
für die einzelnen Schritte gezeigt oder Daten abgefragt.,0490,0027,0254,0130)
SetFont Textfeld1&, Arial16Fett
RICHEDIT1& = CREATE(RICHEDIT,%HWND,,0018,0234,0716,-0277)
SETFOCUS(%HWND)
REPAINT

WHILENOT ENDE%

    WAITINPUT

    If %KEY=2 Schließ-X wurde geklickt

        ENDE%= 1

    ELSEIF %KEY=4  Größe wurde geändert

        Resize()

    ELSEIF CLICKED(BUTTON1&) BUTTON IDA-Abfragen oder Info-Abfragen

        IF GetCheck(RADIOBUTTON1&)=1

            HinweisText1BB3()

        elseIf GetCheck(RADIOBUTTON2&)=1

            HinweisText1agree()

        else

            MessageBox(Bitte zuerst RZ-Version wählen!!!,ACHTUNG,4144)

        ENDIF

    ELSEIF CLICKED(BUTTON2&) BUTTON

    ELSEIF CLICKED(BUTTON3&) BUTTON

    ELSEIF CLICKED(BUTTON4&) BUTTON

    ELSEIF CLICKED(BUTTON5&) BUTTON

    ELSEIF CLICKED(BUTTON6&) BUTTON

    ELSEIF CLICKED(BUTTON7&) BUTTON

    ELSEIF CLICKED(BUTTON8&) BUTTON

        ENDE%=1

    ELSEIF CLICKED(RADIOBUTTON1&)

        SetText BUTTON1&, 1. Info-Abfragen erstellen

    ELSEIF CLICKED(RADIOBUTTON2&)

        SetText BUTTON1&, 1. IDA-Abfragen erstellen

    ENDIF

ENDWHILE

DeleteObject Arial16Fett
DeleteObject Arial18Fett

PROC HinweisText1BB3

    SetText Richedit1&,
    Hier der eine Text

ENDPROC

PROC HinweisText1agree

    SetText Richedit1&,
    Und hier der andere Text

ENDPROC

PROC Resize

    VAR BreiteFaktor!=Width(%HWND)/Breite%
    VAR HoeheFaktor!=Height(%HWND)/Hoehe%
    VAR NeuePosW%=0
    VAR NeuePosS%=0
    VAR NeueBreite%=0
    VAR NeueHoehe%=0

ENDPROC

 
Win10 16 GB RAM
11.02.2009  
 



Christof Neuß
Wie kann ich z.B. alle enthaltenen Objekte in ein Array packen, damit diese nacheinander abgearbeitet werden, ohne dass ich bei einem neuen Objekt daran denken muss, dieses in die Resize-Routine einzubinden?


Z.B. indem Du Dir eine (pseudo) Markup-Language bereitstellst die den Stapel der/Deiner Controls je nach Deinen vergebenen Attributen anordnet. Komfortabel ist das Prinzip jedoch (leider) erst dann, wenn die Markup-Language entsprechend mächtig und ausgearbeitet ist, also in Deinem Fall viel Vorarbeit. Solch Markup-Language sollten wir vielleicht mal gemeinsam angehen bzw. ausarbeiten. Ein natives Beispiel als DLL ist z.B. ProLayout [...]  von René.

Christof Neuß
Wie kann ich die akutelle Position des Objektes ermitteln, um dann die neue Position zu setzen?


Die aktuelle Position z.B. per getClientRect [...]  , (aber) um eine neue Position zu setzen (z.B. per setWindowPos) benötigt man die alte Position meistens eher nicht.

Tatsächlich ist das Anordnen/Bereitstellen der Controls der Grossteil der Aussenwirkung eines Programmes und damit (leider) nicht zu einer einfachen Formel zusammenfassbar - die Lösungen sind meist ziemlich angepasst - und mit XProfan gibt es lauter Lösungswege je nach den tatsächlichen Anforderungen an das Programm. [...]  [...]  [...]  [...] 

Ab XProfan11 würde ich die SubClassProc nutzen, um auf Änderungen der Größe reagieren zu können.

Ein Minimalbeispiel kann ich im Moment nicht posten.
 
11.02.2009  
 




RGH
Hallo,

so geht es:

1. Ich packe alle Elemente des Dialogs/Fensters in ein dynamisches Array. Hier im Beispiel ist es das Array Elemente&[]

2. Ich benötige zwei Apifunktionen und eine Struktur:
DEF GetWindowRect(2) !"USER32","GetWindowRect"
DEF MapWindowPoints(4) !"USER32,MapWindowPoints"
STRUCT Groesse = X1&, Y1&, X2&, Y2&

GetWindowsRect ermittelt die Bildschirmposition eines Elementes und liefert zwei Eckpunkte zurück: Links Oben und Rechts Unten. Der erste Parameter ist das Handle des Elementes, der zweite die Adresse der Struktur für die beiden Punkte. Nach dem Aifruf ist die Struktur gefüllt: In X1&/Y1& ist der Punkt links oben und in X2&/Y&2 der Punkt rechts unten. ACHTUNG: Die Koordinaten beziehen sich auf den Bildschirm (%DeskTop) und nicht auf unser Fenster (%Hwnd)! Hier kommt die zweie Funktion zum Einsatz:
MapWindowPoints rechnet die Koordinaten um: Der erste Parameter ist der ursprüngliche Bezugspunkt (in unserem Fall %DeskTop) und der zweite der gewünschte Bezugspunkt (in unserem Fall %HWnd). Der dritte Parameter enthält die Adresse eines Long-Array mit den umzurechnenden Punkten. In unserem Fall ist das GROESSE# mit zwei Punkten. Der letzte Parameter ist die Anzahl der Punkte, also hier die 2.
Groesse ist eine struktur die vier Long-Werte für die zwei Punkte enthält und entspricht somit der Windows-Struktur RECT.

In der Prozedur Resize wird nun mit GetWindowsRect für jedes Element die Bildschirmposition ermittelt und mit MapWindowPoints in die %HWnd-Position umgerechnet. Dann wird die neue Position und Größe unter Berücksichtigung des Breite- und Höhefaktors errechnet und mit SetWindowPos gesetzt.

Hier das (etwas abgespeckte, aber funktionsfähige) Programm:
 $P+
SET("ERRORLEVEL",0)
DECLARE ENDE%
DECLARE Breite%, Hoehe%
DECLARE Elemente&[]
DEF GetSysColor(1) !"USER32","GetSysColor"
DEF GetWindowRect(2) !"USER32","GetWindowRect"
DEF MapWindowPoints(4) !"USER32","MapWindowPoints"
STRUCT Groesse = X1&, Y1&, X2&, Y2&
DECLARE Groesse#
DIM Groesse#, Groesse
WINDOWSTYLE 63
WINDOWTITLE "Union Investment"
WINDOW 143,41-756,587
CLS GetSysColor(15)
Breite%=Width(%HWND)
Hoehe%=Height(%HWND)
Elemente&[0] = CREATE("BUTTON",%HWND,"--- Bitte zuerst RZ-Version wählen ---",0020,0025,0450,0030)
Elemente&[1] = CREATE("BUTTON",%HWND,"2. Union Investment-Volumina aus Internet ziehen",0020,0060,0450,0030)
Elemente&[2] = CREATE("BUTTON",%HWND,"3. Stammdaten zur Berichtserstellung erfassen",0020,0095,0450,0030)
Elemente&[3] = CREATE("BUTTON",%HWND,"4. Qualitative Fragen beantworten",0020,0130,0450,0030)
Elemente&[4] = CREATE("BUTTON",%HWND,"5. Analyseprogramm starten",0020,0165,0450,0030)
Elemente&[5] = CREATE("BUTTON",%HWND,"6. Auswertungsdatei versenden",0020,0200,0450,0030)
Elemente&[6] = CREATE("BUTTON",%HWND,"Drucken",0662,0517,0070,0030)
Elemente&[7] = CREATE("BUTTON",%HWND,"ENDE",0662,0199,0070,0030)
Elemente&[8] = CREATE("RADIOBUTTON",%HWND,"BB3  ",0490,0165,0060,0030)
Elemente&[9] = CREATE("RADIOBUTTON",%HWND,"agree",0560,0165,0060,0030)
SetCheck Elemente&[8],1
SetText Elemente&[0]," 1. Info-Abfragen erstellen"
Elemente&[10] = CREATE("Text",%HWND,"Bitte klicken Sie nacheinander die Buttons an.",0490,0027,0254,0130)
'+
'Im unteren Textfeld werden Ihnen dann Hinweise
'+ für die einzelnen Schritte gezeigt oder Daten abgefragt.
Elemente&[11] = CREATE("RICHEDIT",%HWND,"",0018,0234,0716,-0277)
SETFOCUS(%HWND)
REPAINT

WHILENOT ENDE%

    WAITINPUT

    If %KEY=2'Schließ-X wurde geklickt

        ENDE%= 1

    ELSEIF %KEY=4'Größe wurde geändert

        Resize()

    ELSEIF CLICKED(Elemente&[0])'BUTTON IDA-Abfragen oder Info-Abfragen

        IF GetCheck(Elemente&[8])=1

            HinweisText1BB3()

        elseIf GetCheck(Elemente&[9])=1

            HinweisText1agree()

        else

            MessageBox("Bitte zuerst RZ-Version wählen!!!","ACHTUNG",4144)

        ENDIF

    ELSEIF CLICKED(Elemente&[1])'BUTTON

    ELSEIF CLICKED(Elemente&[2])'BUTTON

    ELSEIF CLICKED(Elemente&[3])'BUTTON

    ELSEIF CLICKED(Elemente&[4])'BUTTON

    ELSEIF CLICKED(Elemente&[5])'BUTTON

    ELSEIF CLICKED(Elemente&[6])'BUTTON

    ELSEIF CLICKED(Elemente&[7])'BUTTON

        ENDE%=1

    ELSEIF CLICKED(Elemente&[8])

        SetText Elemente&[0], "1. Info-Abfragen erstellen"

    ELSEIF CLICKED(Elemente&[9])

        SetText Elemente&[0], "1. IDA-Abfragen erstellen"

    ENDIF

ENDWHILE

PROC HinweisText1BB3

    SetText Elemente&[11],"Hier der eine Text"

ENDPROC

PROC HinweisText1agree

    SetText Elemente&[11],"Und hier der andere Text"

ENDPROC

PROC Resize

    VAR BreiteFaktor! = Width(%HWND)/Breite%
    VAR HoeheFaktor!  = Height(%HWND)/Hoehe%
    Breite%=Width(%HWND)
    Hoehe%=Height(%HWND)
    VAR NeuePosW%=0
    VAR NeuePosS%=0
    VAR NeueBreite%=0
    VAR NeueHoehe%=0

    WhileLoop 0, SizeOf(Elemente&[])-1

        GetWindowRect(Elemente&[&loop], Groesse#)
        MapWindowPoints(%DeskTop, %HWnd, Groesse#, 2)

        With Groesse#

            NeuePosW%   = Int(.X1& * BreiteFaktor!)
            NeuePosS%   = Int(.Y1& * HoeheFaktor!)
            NeueBreite% = Int((.X2& - .X1&) * BreiteFaktor!)
            NeueHoehe%  = Int((.Y2& - .Y1&) * HoeheFaktor!)

        EndWith

        SetWindowPos Elemente&[&loop] = NeuePosW%, NeuePosS% - NeueBreite%, NeueHoehe%

    EndWhile

ENDPROC


Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
11.02.2009  
 




Christof
Neuß
Ups,

hätte nicht gedacht, dass dies so schwer ist unter XProfan. Eigentlich ist es doch sehr profan.

Das mit dem

getClientRect

habe ich nicht verstanden. Wenn ichs richtig sehe, bekomme ich doch damit nur einfach einen Teil des Fensters zurück. Ich brauche aber die Anfangskoordinaten z.B. des Richedit-Objektes.

Mein Gedankengang ist folgender:
Wenn ich die akutellen Positionen und Größen der vorhandenen Objekte kenne, kann die Koordinaten einfach mit den Vergrößerungs- (oder Verkleinerungs-)Faktoren für Breite und Höhe multiplizieren und habe so neue Anfangs- und Größenkoordinaten für jedes Objekt. Jetzt bräuchte ich diese nur neu setzen (Oh Mann, wie macht man einen bestehenden Button denn einfach größer? Ich muss noch viel lernen in XProfan!) und dann neu anordnen. Fertig!

Aber so gehts wohl nicht, oder?

Danke trotzdem!
Ich werd mal versuchen, mich durchzuwurschteln. Kann man ja nur Erfahrungen bei sammeln
 
Win10 16 GB RAM
11.02.2009  
 




Christof
Neuß
Hallo Roland,

danke. Jetzt haben sich Deine Antwort und mein BlaBla überschnitten.
Werde erstmal Deine Antwort durcharbeiten...
 
Win10 16 GB RAM
11.02.2009  
 




Christof
Neuß
Das hilft gut weiter. Super. Danke!

Ich kann darauf aufbauen!
 
Win10 16 GB RAM
11.02.2009  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.240 Betrachtungen

Unbenanntvor 0 min.
Sven Bader24.02.2021
Jörg Sellmeyer23.06.2020
Peter Max Müller07.10.2017
Julian Schmidt01.12.2013

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

Christof Neuß (4x)
RGH (1x)
iF (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie