Forum | | | | 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
|
| | | | |
| | | | | | | |
| | 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:
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 |
| | | | |
| | Christof Neuß | Hallo Roland,
danke. Jetzt haben sich Deine Antwort und mein BlaBla überschnitten. Werde erstmal Deine Antwort durcharbeiten... |
| | | | |
| | Christof Neuß | Das hilft gut weiter. Super. Danke!
Ich kann darauf aufbauen! |
| | | | |
|
AntwortenThemenoptionen | 1.239 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |