Deutsch
Forum

Skalierbares-Fenster erstellen, ohne Dicken Rahmen

 
- Seite 1 -



Julian
Schmidt
Hallo,
ich würde gerne aus optischen Gründen ein Fenster erstellen das weiterhin skalierbar ist, allerdings keinen Dicken Rahmen besitzt. Ist so etwas möglich?

LG

Julian57
 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
20.09.2011  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Andreas
Miethe


iF (21.09.11)
Du hast ja schon einen fetten Block: case (%mouseXheight(%hWnd)-10) : hwnd.scaleByMouse()


iF (21.09.11)
da kannst Du doch der hWnd.scaleByMouse-Proc als Parameter übergeben welche Ecke/ Kante gemeint war um zu Ersparen das Du das in der Proc erst wieder ermitteln musst.


Das geht mir irgendwie gegen den Strich

Das wird normalerweise über die Message WM_NCHITTEST geregelt.

Hier mal ein kleines Beispiel für einen skalier / verschiebbaren Button. Sollte sich wohl für ein Fenster anpassen lassen.
 $H Windows.ph
 $H Messages.ph
 $H Structs.ph
STRUCT TRect         = ~Rect
STRUCT TPoint        = ~Point

Proc HitTest

    Parameters hCtl&,lParam&
    Declare Point#
    Declare Rect#
    Dim Point#,TPoint
    Dim Rect#,TRect
    Point#.x& = LoWord(lParam&)
    Point#.y& = HiWord(lParam&)
    ~ScreenToClient(hCtl&,Point#)
    ~GetWindowRect(hCtl&,Rect#)
    ~MapWindowPoints(~GetDesktopWindow(),%Hwnd,Rect#,2)

    If (Point#.y& < 4) AND (Point#.x& < 4)

        Dispose Point#,Rect#
        Return  ~HTTOPLEFT

    ElseIf (Point#.y& < 4) AND (Point#.x& >= (Rect#.right& - Rect#.left&-4))

        Dispose Point#,Rect#
        Return  ~HTTOPRIGHT

    ElseIf (Point#.y& >= (Rect#.bottom& - Rect#.top&-4)) AND (Point#.x& >= (Rect#.right& - Rect#.left&-4))

        Dispose Point#,Rect#
        Return  ~HTBOTTOMRIGHT

    ElseIf (Point#.x& < 4) AND (Point#.y& >= (Rect#.bottom& - Rect#.top& - 4))

        Dispose Point#,Rect#
        Return  ~HTBOTTOMLEFT

    ElseIf Point#.y& < 4

        Dispose Point#,Rect#
        Return  ~HTTOP

    ElseIf Point#.x& < 4

        Dispose Point#,Rect#
        Return ~HTLEFT

    ElseIf Point#.x& >= (Rect#.right& - Rect#.left& - 4)

        Dispose Point#,Rect#
        Return ~HTRIGHT

    ElseIf Point#.y& >= (Rect#.bottom& - Rect#.top& - 4)

        Dispose Point#,Rect#
        Return ~HTBOTTOM

    Else

        Dispose Point#,Rect#
        Return ~HTCAPTION

    EndIf

EndProc

SubClassProc

    If SubClassMessage(&sWnd,~WM_NCHITTEST)

        Set("WinProc", 0)
        Return HitTest(&swnd,&slParam)

    Endif

EndProc

cls
Var Ende& = 0
Var Button& = Create("Button",%hwnd,"OK",10,10,120,30)
SubClass Button&,1

whilenot ende&

    waitinput

endwhile

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.09.2011  
 



Ja natürlich und da gibt es viele Wege -

erzeuge z.B. einfach ein Fenster das keinen dicken Rahmen besitzt und reagiere in der subClassProc auf wm_mouseMove an richtiger Position um mit wm_setCursor um den Mauspfeil optisch anzupassen und bei wm_lButtonDown speicherst in Globalen aktuelle Breite und Höhe und Mausposition und ein IchSkaliereGrad-Flag und zusätzlich bei wm_mouseMove wenn IchSkaliereGrad-Flag gesetzt ist einfach per setWindowPos die FensterGröße anpassen.
 
20.09.2011  
 




Julian
Schmidt
iF (20.09.11)
erzeuge z.B. einfach ein Fenster das keinen dicken Rahmen besitzt und reagiere in der subClassProc auf wm_mouseMove an richtiger Position um mit wm_setCursor um den Mauspfeil optisch anzupassen und bei wm_lButtonDown speicherst in Globalen aktuelle Breite und Höhe und Mausposition und ein IchSkaliereGrad-Flag und zusätzlich bei wm_mouseMove wenn IchSkaliereGrad-Flag gesetzt ist einfach per setWindowPos die FensterGröße anpassen.


Hört sich alles andere als einfach an.
Hast du so was schon gemacht und vlt einen Quelltext parat?
 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
20.09.2011  
 



Nein ich habe dazu nichts parat aber ein Beispiel dafür schreibt sich fast von selbst:
/*
{$cleq}
{$compiler c:\xprofan11\}
{$runtime c:\xprofan11\}
*/
windowstyle 1 | 2 | 8 | 16 | 512
window 640,480
userMessages 16,513,20//wm_close,wm_lButtonDown,wm_eraseBkGnd
subClass %hWnd,1

while 1

    waitInput

    select %uMessage

        caseof 16 : break

        caseof 513

        case (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10) : hWnd.scaleByMouse()

    endSelect

wend

end

subClassProc

    case subClassMessage(%hWnd, 512):useCursor (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10)*7//wm_mouseMove

endProc

proc hWnd.scaleByMouse

    declare m#
    dim m#,8
    external("user32","GetCursorPos",m#)
    var omx%=long(m#,0)
    var omy%=long(m#,4)
    var wi&=%winRight-%winLeft
    var he&=%winBottom-%winTop

    while isKey(1)

        waitInput 10
        external("user32","GetCursorPos",m#)
        setWindowPos %hWnd=%winLeft,%winTop - wi&-omx%+long(m#,0),he&-omy%+long(m#,4)

    wend

    dispose m#

endProc

Eine XPSE-Variante:

Bei diesem Beispiel hast Du bezogen auf das Hauptfenster unten rechts einen Greifpunkt.
 
20.09.2011  
 




Julian
Schmidt
Kann man diese Greifpunkte auch auf alle Ecken, Seiten übertragen?
 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
20.09.2011  
 



Du kannst doch per Code so viele Ecken und Kanten definieren wie Du magst und auch auf Murmelei reagieren. oO
 
20.09.2011  
 




Julian
Schmidt
Öhm...ja
nur ich bekomme das mit den Cursors nicht geregelt.

Was ist das für eine komische Konstruktion im SubclassProc?
useCursor (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10)*7

Die normalen Parameter für UseCursor sehen doch anders aus!?
windowstyle 1 | 2 | 8 | 16 | 512 | 64
window 640,480
cls RGB(255,0,0)
userMessages 16,513,20
subClass %hWnd,1

while 1

    waitInput

    select %uMessage

        caseof 16 : break

        caseof 513

        case (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX<10) and (%mouseY<10) : hwnd.scaleByMouse()
        case (%mouseX>width(%hWnd)-10): hwnd.scaleByMouse()
        case (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX<10) : hwnd.scaleByMouse()
        case (%mouseY<10) : hwnd.scaleByMouse()

    endSelect

    case iskey(27) : end

wend

end

subClassProc

    case subClassMessage(%hWnd, 512): case (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10): UseCursor 7//wm_mouseMove
    case subClassMessage(%hWnd, 512): case (%mouseX<10) and (%mouseY<10): UseCursor 9//wm_mouseMove

endProc

proc hwnd.scaleByMouse

    declare m#
    dim m#,8
    external("user32","GetCursorPos",m#)
    var omx%=long(m#,0)
    var omy%=long(m#,4)
    var wi&=%winRight-%winLeft
    var he&=%winBottom-%winTop

    while isKey(1)

        waitInput 10
        external("user32","GetCursorPos",m#)
        setWindowPos %hWnd=%winLeft,%winTop - if(wi&-omx%+long(m#,0)>0,wi&-omx%+long(m#,0),10),if(he&-omy%+long(m#,4)>0,he&-omy%+long(m#,4),10)

    wend

    dispose m#

endProc

 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
20.09.2011  
 



... aber auch nur weil Du es eben nicht regelst.

Du definierst z.B. nicht useCursor 0 im Fall das eben kein Sondercursor gezeigt werden soll.

Diese von Dir als "komisch" und als "Konstruktion" bezeichnete Anweisung sieht dies aber vor:

denn wenn das Argument false ist wird useCursor 0 angewiesen statt 7.

Den Code auf alle Ecken und Kanten umzustellen ist reine Fleißarbeit -

ich wollte Dir ja nur zeigen a) das und b) wie man es anstellen könnte.
 
21.09.2011  
 




Julian
Schmidt
War trotzdem eine komische Konstruktion. ^^
Aber jetzt ist mir auch klar wie es funktionierte.
Entweder wirft
(%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10)
1 oder 0 zurück.
Dementsprechend: 0*7=0 & 1*7=7

Inzwischen ist das mit dem Cursors alles geregelt.
Ich finde nur noch einen Bug in den Snippet und zwar das Skalieren von der Links-Oberen Ecke.
Außerdem kann man das Fenster bei 2 Ecken,Kanten auf eine Größe von 0px ziehen, welches ich einfach nicht rausbekomme. Kann wer helfen?
windowstyle 1 | 2 | 8 | 16 | 512 | 64
window 600,400
cls RGB(255,0,0)
userMessages 16,513,20
subClass %hWnd,1

while 1

    waitInput

    select %uMessage

        caseof 16 : break

        caseof 513

        case (%mouseX<10) and (%mouseY<10) : hwnd.scaleByMouse()'Ecken
        case (%mouseX>width(%hWnd)-10) and (%mouseY<10) : hwnd.scaleByMouse()
        case (%mouseX<10) and (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX<10) : hwnd.scaleByMouse()'Kanten
        case (%mouseY<10) : hwnd.scaleByMouse()
        case (%mouseX>width(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()

    endSelect

    case iskey(27) : end

Endwhile

end

subClassProc

    if subClassMessage(%hWnd, 512)

        if ((%mouseX<10) and (%mouseY<10)) or ((%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10))

            UseCursor 7

        elseif ((%mouseX<10) and (%mouseY>height(%hWnd)-10)) or ((%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10))

            UseCursor 8

        elseif (%mouseX<10) or (%mouseX>width(%hWnd)-10)

            UseCursor 9

        elseif (%mouseY<10) or (%mouseY>height(%hWnd)-10)

            UseCursor 10

        else

            UseCursor 0

        Endif

    Endif

endProc

proc hwnd.scaleByMouse

    declare m#
    dim m#,8
    external("user32","GetCursorPos",m#)
    var omx%=long(m#,0)
    var omy%=long(m#,4)
    var wi&=%winRight-%winLeft
    var he&=%winBottom-%winTop
    var wleft&=%winleft
    var wtop&=%winTop

    while isKey(1)

        waitInput 10
        external("user32","GetCursorPos",m#)
        case (omx%>%winLeft) and (omy%>%winTop) : setWindowPos %hWnd=%winLeft,%winTop - if(wi&-omx%+long(m#,0)>10,wi&-omx%+long(m#,0),10),if(he&-omy%+long(m#,4)>10,he&-omy%+long(m#,4),10)
        case (omx%<%winLeft+10) : setWindowPos %hWnd=long(m#,0),%winTop,(wleft&+wi&)-long(m#,0),he&
        case (omy%<%winTop+10) : setWindowPos %hWnd=%winLeft,long(m#,4),wi&,(wtop&+he&)-long(m#,4)

    Endwhile

    dispose m#

endProc

 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
21.09.2011  
 



Du hast ja schon einen fetten Block:
da kannst Du doch der hWnd.scaleByMouse-Proc als Parameter übergeben welche Ecke/ Kante gemeint war um zu Ersparen das Du das in der Proc erst wieder ermitteln musst.
 
21.09.2011  
 




Julian
Schmidt
Meinst du das wird dann kürzer?
Abfragen muss ich es immer, sei es nun im Proc, oder im "fetten Block"?

Außerdem das Ermitteln jeder Kante, Ecke im Proc ist auch nicht so schwer!
Es flackert ganz schrecklich ab und zu beim verschieben! Ein Fehler?
windowstyle 2+16+64
window 600,400
cls RGB(255,0,0)
userMessages 16,513,20
subClass %hWnd,1

while 1

    waitInput

    select %uMessage

        caseof 16 : break

        caseof 513

        case (%mouseX<10) and (%mouseY<10) : hwnd.scaleByMouse()'Ecken
        case (%mouseX>width(%hWnd)-10) and (%mouseY<10) : hwnd.scaleByMouse()
        case (%mouseX<10) and (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseX<10) : hwnd.scaleByMouse()'Kanten
        case (%mouseY<10) : hwnd.scaleByMouse()
        case (%mouseX>width(%hWnd)-10) : hwnd.scaleByMouse()
        case (%mouseY>height(%hWnd)-10) : hwnd.scaleByMouse()

    endSelect

    case iskey(27) : end

Endwhile

end

subClassProc

    if subClassMessage(%hWnd, 512)

        if ((%mouseX<10) and (%mouseY<10)) or ((%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10))

            UseCursor 7

        elseif ((%mouseX<10) and (%mouseY>height(%hWnd)-10)) or ((%mouseX>width(%hWnd)-10) and (%mouseY>height(%hWnd)-10))

            UseCursor 8

        elseif (%mouseX<10) or (%mouseX>width(%hWnd)-10)

            UseCursor 9

        elseif (%mouseY<10) or (%mouseY>height(%hWnd)-10)

            UseCursor 10

        else

            UseCursor 0

        Endif

    Endif

endProc

proc hwnd.scaleByMouse

    declare m#
    dim m#,8
    external("user32","GetCursorPos",m#)
    var omx%=long(m#,0)
    var omy%=long(m#,4)
    var wi&=%winRight-%winLeft
    var he&=%winBottom-%winTop
    var wleft&=%winleft
    var wtop&=%winTop

    while isKey(1)

        waitInput 10
        external("user32","GetCursorPos",m#)
        case (omx%>%winLeft) and (omy%>%winTop) : setWindowPos %hWnd=%winLeft,%winTop - if(wi&-omx%+long(m#,0)>10,wi&-omx%+long(m#,0),10),if(he&-omy%+long(m#,4)>10,he&-omy%+long(m#,4),10)'Kante Unten,Recht; Ecke Rechts-Unten, Rechts-Oben
        case (omx%<%winLeft+10) and (omy%<%winTop+10) : setWindowPos %hWnd=long(m#,0),long(m#,4),(wleft&+wi&)-long(m#,0),(wtop&+he&)-long(m#,4)'Ecke Links, Oben
        case (omx%<%winLeft+10) : setWindowPos %hWnd=long(m#,0),%winTop,(wleft&+wi&)-long(m#,0),he&'Kante Links
        case (omy%<%winTop+10) : setWindowPos %hWnd=%winLeft,long(m#,4),wi&,(wtop&+he&)-long(m#,4)'Kante Oben
        case (omx%<%winLeft+10) and (omy%>%winTop+10) : setWindowPos %hWnd=long(m#,0),%winTop,(wleft&+wi&)-long(m#,0),if(he&-omy%+long(m#,4)>10,he&-omy%+long(m#,4),10)'Ecke Links-Unten

    Endwhile

    dispose m#

endProc

 
XProfan X2
Win7 Home Premium, SP1, AMD Athlon(tm) II Neo K125 Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
21.09.2011  
 




E.T.
Warum muss den alles immer wieder so kompliziert sein !!??
Wenn ich hier im Forum die Suche benutze finde ich etliche Beispiele zur Fenster-Scalierung, sogar mit allen darauf befindlichen Elementen.

If hat dazu ein paar Klasse Sachen beigetragen... nur man muss auch mal die SuFu nutzen, und daraus selbst etwas weiter entwickeln.

Wer mir wohl auch angewöhnen, erst mal nach ner Lösung zu fragen, bevor ich mir selber den Kopf anstrenge...

SORRY !!!
 
XProfan X2
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...
21.09.2011  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

27.886 Betrachtungen

Unbenanntvor 0 min.
H.Brill16.09.2023
R.Schneider04.04.2022
Peter Max Müller01.11.2017
Jörg Sellmeyer04.02.2016
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