Deutsch
Forum

Position und Abmaße eines Buttons ermitteln

 
- Seite 1 -



Michael
Hettner
Hallo,
wie kann ich die Position und die Abmaße eines Buttons im Hauptfenster ermitteln?
 
27.08.2021  
 



« 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

 
Gruß Thomas
Windows XP SP2, XProfan X2
28.08.2021  
 




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.
 
27.08.2021  
 




RudiB.
probiers mal mit setWindowPos Handle,%mousex,%mousey
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
27.08.2021  
 




RudiB.
hab was gefunden... [...] 

dann noch in die Whilenot ende& Schleife nach dem Waitinput
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
27.08.2021  
 




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. ;)
 
28.08.2021  
 




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 11
Computer: 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

 
Gruß Thomas
Windows XP SP2, XProfan X2
28.08.2021  
 




p.specht

Voll krass extrageil! Tausend Dank, Thomas!
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
28.08.2021  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.469 Betrachtungen

Unbenanntvor 0 min.
Georg Teles14.05.2024
Sven Bader21.11.2023
Michael Hettner21.09.2023
Axel Berse13.08.2023
Mehr...

Themeninformationen



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