Deutsch
Quelltexte/ Codesnippets

Fenster Getcursorpos Getwindowrect Hover Maus Mouse Screentoclient Window Windowfrompoint

 

Julian
Schmidt
Viele Funktionen rund um Maus und Fenster.
Def SetCursorPos(2)!"User32","SetCursorPos"
Windowstyle 10
WindowTitle "Beispiel für GetwindowRect, GetCursorPos, ScreenToClient, WindowfromPoint und ihre Anwendung"
CLS
WindowZ(%hwnd,-1)
Var pic1&=Create("hNewPic", 100, 100, RGB(0,0,255))
Var pic2&=Create("hNewPic", 100, 100, RGB(255,0,0))
Var picbt&=Create("PicButton",%hwnd,0,(width(%hwnd)-100)/2,(height(%hwnd)-100)/2,100,100)
Settext picbt&,"Bildbutton zur Demonstration eines Hoverbuttons mit HandleHover"
Var text&=Create("Text",%hwnd,"",0,0,width(%hwnd),16)
Var pos&=Create("Text",%hwnd,"",0,height(%hwnd)-16,width(%hwnd),16)
Var Dlg&=Create("Text",%hwnd,"",0,16,width(%hwnd),16)
Line width(%hwnd)/2,0 - width(%hwnd)/2,height(%hwnd)
Usermessages 16

WhileNot (%umessage=16) or iskey(27)

    Waitinput 30
    Sendmessage(picbt&,$F7 | 247,0,If(HandleHover()=picbt&,pic1&,pic2&))'Hover-Button mit HandleHover(), Alternativ die Verwendung von IsMouseHover()
    Settext text&,IF(IsMouseInDg(%hwnd, 0, 0, width(%hwnd)/2, height(%hwnd))=1,"Maus auf linker Seite",IF(IsMouseInDg(%hwnd, width(%hwnd)/2, 0, width(%hwnd), height(%hwnd))=1,"Maus auf rechter Seite","Maus außerhalb des Client_Bereichs von hWnd"))
    Settext pos&, "Position von %hwnd (global): "+Str$(WindowRect(%hwnd,"X1"))+"x"+Str$(WindowRect(%hwnd,"Y1"))
    Settext Dlg&, "Maus über den Handle '"+Str$(HandleHover())+"' mit dem Titel '"+Mid$(Gettext$(HandleHover()),1,45)+"...'"
    Settext %hwnd, "CursorPosGlobal: "+Str$(CursorPos("X1"))+"x"+Str$(CursorPos("Y1"))+" - CursorPosLokal auf hWnd: "+Str$(CursorPos("X1",%hwnd))+"x"+Str$(CursorPos("Y1",%hwnd))

EndWhile

deleteobject pic1&
deleteobject pic2&
end

Proc IsMouseHover

    Parameters hdl&
    Return Between(CursorPos("X1"), WindowRect(hdl&,"X1"), WindowRect(hdl&,"X2"), CursorPos("Y1"), WindowRect(hdl&,"Y1"), WindowRect(hdl&,"Y2"))

EndProc

Proc IsMouseIn

    Parameters x1%,y1%,x2%,y2%
    Return Between(CursorPos("X1"), x1%, x2%, CursorPos("Y1"), y1%, y2%)

EndProc

Proc IsMouseInDg

    Parameters hdl&,x1%,y1%,x2%,y2%
    Return Between(CursorPos("X1",hdl&), x1%, x2%, CursorPos("Y1",hdl&), y1%, y2%)

EndProc

Proc WindowSize

    Parameters hdl&,x%,y%
    SetWindowPos hdl& = WindowRect(hdl&,"X1"),WindowRect(hdl&,"Y1") - x%,y%

EndProc

Proc WindowZ

    Parameters hdl&, modus%
    'Modus =  0 : TOP| 1 : BOTTOM | -1 : TOP-MOST | -2 : BOTTOM-MOST
    SetWindowPos hdl& = WindowRect(hdl&,"X1"),WindowRect(hdl&,"Y1") - WindowRect(hdl&,"Breite"),WindowRect(hdl&,"Höhe"); modus%

EndProc

Proc HandleHover

    Declare mpos#
    Dim mpos#,8
    External("user32","GetCursorPos",mpos#)
    Var hdl&=External("USER32","WindowFromPoint",long(mpos#,0),long(mpos#,4))
    Dispose mpos#
    Return hdl&

EndProc

Proc HandleHoverPos

    Parameters x&,y&
    Return External("USER32","WindowFromPoint",x&,y&)

EndProc

Proc CursorPos

    Parameters Modus$
    Modus$=Lower$(Modus$)
    Declare x%, mpos#
    Dim mpos#,8
    External("user32","GetCursorPos",mpos#)
    Case @&(2)<>0 : External("USER32","ScreenToClient",@&(2),mpos#)
    Case Modus$="x1" : x%=long(mpos#,0)
    Case Modus$="y1" : x%=long(mpos#,4)
    Case Modus$="x2" : x%=IF(@&(2)<>0,WindowRect(@&(2),"Breite"),%maxx)-long(mpos#,0)
    Case Modus$="y2" : x%=IF(@&(2)<>02,WindowRect(@&(2),"Höhe"),%maxy)-long(mpos#,4)
    Dispose mpos#
    Return x%

EndProc

Proc WindowRect

    Parameters hdl&,Modus$
    Modus$=Lower$(Modus$)
    Declare x%, b#
    Dim b#,16
    External("USER32", "GetWindowRect",hdl&,b#)
    Case @&(3)<>0 : External("USER32","ScreenToClient",@&(3),b#) : External("USER32","ScreenToClient",@&(3),b#+8)
    Case Modus$="breite" : x%=Long(b#,8)-Long(b#,0)
    Case Modus$="höhe" : x%=Long(b#,12)-Long(b#,4)
    Case Modus$="x1" : x%=Long(b#,0)
    Case Modus$="y1" : x%=Long(b#,4)
    Case Modus$="x2" : x%=Long(b#,8)
    Case Modus$="y2" : x%=Long(b#,12)
    Dispose b#
    Return x%

EndProc

Proc Workarea

    Parameters Modus$
    modus$=lower$(modus$)
    Declare Rect#,x%
    Dim Rect#,16
    External("User32","SystemParametersInfoA",48,0,Rect#,0)
    case modus$="x1" : x%=Long(Rect#,0)
    case modus$="y1" : x%=Long(Rect#,4)
    case modus$="x2" : x%=Long(Rect#,8)
    case modus$="y2" : x%=Long(Rect#,12)
    Dispose Rect#
    Return x%

EndProc


Nachtrag von iF: 

Martin Kempf (21.01.2016)
Danke, super Sache, funktioniert.
Hinweis noch: Ich arbeite mit 2 Bildschirmen: Die Proc HandleHover produziert einen Absturz, wenn die Maus von dem einen zum anderen Bildschirm springt.
 
XProfan X2
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
06.02.2012  
 



Ich würde davon abraten eigene Funktionen mit API-Funktionsnamen zu belegen -

so gibt es GetCursorPos (  [...]  ) bereits und wenn man z.B. XPSE nutzt dann kann man einfach APIs schreiben ohne zu deklarieren und wer mag schon dahingehende Kollisionen.
 
07.02.2012  
 




E.T.
iF (07.02.12)
... und wenn man z.B. XPSE nutzt dann kann man einfach APIs schreiben...


Ah, wollt schon immer die API's so schreiben, wie sie mir gefallen

Aber mal im Ernst: Wer kennt schon alle API-Bezeichnungen ?? Richtig: XPSE !!
Das würde ich doch glatt mal als Idee für die nächste XPSE-Version aufgreifen:
Kollisions-Kontrolle von Funktions-Namen mit API-Funktionsnamen .

Man(n) gönnt sich ja sonst nix, außer XProfan & XPSE 
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
07.02.2012  
 



Diese Kontrolle ist nicht notwendig da man mit ~ explizit auf API-Funktionen verweisen kann, so geht so zu unterscheiden:

und XPSE kann so durchaus ermöglichen API-gleichnamige eigene Funktionen zu deklarieren.

Mein Rat bezog sich halt eher darauf eine eigene setPixel-Funktion der besseren Unterscheidung wegen eher z.B. mySetPixel zu nennen
 
07.02.2012  
 




Julian
Schmidt
Aktualisiert
 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
01.01.2013  
 



Martin Kempf (21.01.2016)
Danke, super Sache, funktioniert.
Hinweis noch: Ich arbeite mit 2 Bildschirmen: Die Proc HandleHover produziert einen Absturz, wenn die Maus von dem einen zum anderen Bildschirm springt.
 
21.01.2016  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

14.269 Betrachtungen

Unbenanntvor 0 min.
H.Brill vor 20 Tagen
Rainer Hoefs29.04.2023
RudiB.12.09.2022
p.specht18.11.2021
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

iF (3x)
Julian Schmidt (2x)
E.T. (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