| |
|
|
- Seite 1 - |
|
Michael Hettner | Hallo, wie kann ich die Position und die Abmaße eines Buttons im Hauptfenster ermitteln? |
|
|
| |
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
Thomas Freier | Ich verwende meist:
$H windows.ph
$H messages.ph
STRUCT RECT = Left&,Righ&,Top&,Bottom&
Declare appexit%
WindowStyle $003F
WindowTitle "anklicken und verschieben "
Window 207,114 - 771,611
Cls ~GetSysColor(15)
UseFont "MS Sans Serif",13,0,0,0,0
SetDialogFont 1
Var Text& = Create("Text",%hwnd,"veschieb mich",10,10,100,24)
Var Group& = Create("Groupbox",%hwnd,"veschieb mich",240,240,300,300)
Var Button& = Create("Button",%hwnd,"veschieb mich",140,10,100,24)
Var R# = New(RECT)
WhileNot appexit%
WaitInput
~EnumChildWindows(%hwnd,ProcAddr("MoveIt",2),MakeLong(%mousex,%mousey))
If %key = 2
Dispose hdr#
Dispose R#
appexit%=1
Endif
EndWhile
Proc MoveIt
Parameters wnd&,lParam&
~GetClientRect(wnd&,R#)
~MapWindowPoints(wnd&,%hwnd,R#,2)
If ~PtInRect(R#,LoWord(lParam&),HiWord(lParam&))
~ReleaseCapture()
UseCursor 5
SendMessage(wnd&,~WM_SYSCOMMAND,~SC_MOVE+1,0)
UseCursor 0
Return 0
endif
Return 1
EndProc
|
|
|
| |
|
|
|
|
p.specht
| Willst du den Button platzieren? Mit Maus linke obere Ecke anfahren und per %mousex, %mousey auslesen. Gleiches mit er rechten unteren Ecke, das gibt dann abzüglich der vorher ausgelesenen Werte die Größe.
Bei Buttons in fremden Programmtexten müsstes du das Handle wissen, dann wäre es vermutlich einfacher. In eignen Programmen weißt du ja die Werte, die du beim Create verwendet hast bereits ... |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 27.08.2021 ▲ |
|
|
|
|
Michael Hettner | Die Buttons können in meinem Programm frei verschoben werden. Die Positionen sollen dann in eine INI-Datei geschrieben werden, so das beim nächsten Programmaufruf sich die Buttons wieder am gleichen Fleck befinden. |
|
|
| |
|
|
|
RudiB. | probiers mal mit setWindowPos Handle,%mousex,%mousey |
|
|
| |
|
|
|
RudiB. | hab was gefunden... [...]
dann noch in die Whilenot ende& Schleife nach dem Waitinput
|
|
|
| |
|
|
|
H.Brill | Die Abmaße gehen ja einfach :
Declare Handle btn1, btn2, btn3, Long ende
Window 600, 400
btn1 = Create("Button", %HWnd, "Button1", 10, 10, 80, 25)
btn2 = Create("Button", %HWnd, "Button2", 10, 50, 70, 25)
btn3 = Create("Button", %HWnd, "Ende", 10, 90, 50, 25)
ende = 0
Whilenot ende
WaitInput
If Clicked(btn1)
MessageBox("Breite Btn1 : " + Str$(Width(btn1, 1)) + "\nHöhe Btn1 : " + Str$(Height(btn1, 1)), "Info", 0)
ElseIf Clicked(btn2)
MessageBox("Breite Btn2 : " + Str$(Width(btn2, 1)) + "\nHöhe Btn2 : " + Str$(Height(btn2, 1)), "Info", 0)
ElseIf Clicked(btn3)
MessageBox("Breite Btn3 : " + Str$(Width(btn3, 1)) + "\nHöhe Btn3 : " + Str$(Height(btn3, 1)), "Info", 0)
ende = 1
EndIf
EndWhile
End
Und so die relativen Koordinaten :
Declare Handle btn1, btn2, btn3, Long ende, rect#
Def GetWindowRect(2) !"USER32", "GetWindowRect"
Struct Brect = left&, top&, right&, bottom&
Dim Rect#, Brect
Window 600, 400
btn1 = Create("Button", %HWnd, "Button1", 10, 10, 80, 25)
btn2 = Create("Button", %HWnd, "Button2", 10, 50, 70, 25)
btn3 = Create("Button", %HWnd, "Ende", 10, 90, 50, 25)
ende = 0
Whilenot ende
WaitInput
If Clicked(btn1)
GetWindowRect(btn1, Rect#)
MessageBox("X1 : " + Str$(Rect#.left&) + "\nY1 : " + Str$(Rect#.top&) + "\nX2 : " + Str$(Rect#.right&) + "\nY2 : " + Str$(Rect#.bottom&), "Info", 0)
ElseIf Clicked(btn2)
GetWindowRect(btn2, Rect#)
MessageBox("X1 : " + Str$(Rect#.left&) + "\nY1 : " + Str$(Rect#.top&) + "\nX2 : " + Str$(Rect#.right&) + "\nY2 : " + Str$(Rect#.bottom&), "Info", 0)
ElseIf Clicked(btn3)
GetWindowRect(btn3, Rect#)
MessageBox("X1 : " + Str$(Rect#.left&) + "\nY1 : " + Str$(Rect#.top&) + "\nX2 : " + Str$(Rect#.right&) + "\nY2 : " + Str$(Rect#.bottom&), "Info", 0)
ende = 1
EndIf
EndWhile
Dispose Rect#
End
Müßte man dann nur wegen dem Fenster umrechnen, bzw. dieses berücksichtigen. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 28.08.2021 ▲ |
|
|
|
|
Michael Hettner | Danke, das funktioniert. ;) |
|
|
| |
|
|
|
p.specht
| Ich wäre sehr an dem Programmteil interessiert, mit dem Buttons verschoben werden können. Am Prinzip zumindest. Mir fällt nur Löschen und neues Create an Mausposition ein (in XProfan-11.2a free) ... |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 28.08.2021 ▲ |
|
|
|
|
Thomas Freier | Ich verwende meist:
$H windows.ph
$H messages.ph
STRUCT RECT = Left&,Righ&,Top&,Bottom&
Declare appexit%
WindowStyle $003F
WindowTitle "anklicken und verschieben "
Window 207,114 - 771,611
Cls ~GetSysColor(15)
UseFont "MS Sans Serif",13,0,0,0,0
SetDialogFont 1
Var Text& = Create("Text",%hwnd,"veschieb mich",10,10,100,24)
Var Group& = Create("Groupbox",%hwnd,"veschieb mich",240,240,300,300)
Var Button& = Create("Button",%hwnd,"veschieb mich",140,10,100,24)
Var R# = New(RECT)
WhileNot appexit%
WaitInput
~EnumChildWindows(%hwnd,ProcAddr("MoveIt",2),MakeLong(%mousex,%mousey))
If %key = 2
Dispose hdr#
Dispose R#
appexit%=1
Endif
EndWhile
Proc MoveIt
Parameters wnd&,lParam&
~GetClientRect(wnd&,R#)
~MapWindowPoints(wnd&,%hwnd,R#,2)
If ~PtInRect(R#,LoWord(lParam&),HiWord(lParam&))
~ReleaseCapture()
UseCursor 5
SendMessage(wnd&,~WM_SYSCOMMAND,~SC_MOVE+1,0)
UseCursor 0
Return 0
endif
Return 1
EndProc
|
|
|
| |
|
|
|
p.specht
| Voll krass extrageil! Tausend Dank, Thomas! |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 28.08.2021 ▲ |
|
|
|