Forum | | | | - 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 |
| | | | |
| | « 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. |
| | | | |
| | 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? |
| | | | |
| | | 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:
{$cleq}
{$compiler c:\xprofan11\}
{$runtime c:\xprofan11\}
windowstyle 1 | 2 | 8 | 16 | 512
window 640,480
userMessages wm_close,wm_lButtonDown
subClass hWnd,true
setClassLong(hWnd,gcl_style,getClassLong(hWnd,gcl_style)-cs_hRedraw-cs_vRedraw)
do {
waitInput
select %uMessage
caseof wm_close : break
caseof wm_lButtonDown
case (mouseX>width(hWnd)-10) and (mouseY>height(hWnd)-10) : hWnd.scaleByMouse()
endSelect
}
end
subClassProc{
case subClassMessage(hWnd, wm_mouseMove) : useCursor (mouseX>width(hWnd)-10) and (mouseY>height(hWnd)-10)*7
}
hWnd.scaleByMouse(){
mem m=point
getCursorPos(m)
long omx=m::x&,\
omy=m::y&,\
wi=winRight-winLeft,\
he=winBottom-winTop
do {
casenot isKey(1) : break
waitInput 10
getCursorPos(m)
setWindowPos hWnd=winLeft,winTop - wi-omx+m::x&,he-omy+m::y&
}
dispose m
}
Bei diesem Beispiel hast Du bezogen auf das Hauptfenster unten rechts einen Greifpunkt. |
| | | | |
| | Julian Schmidt | Kann man diese Greifpunkte auch auf alle Ecken, Seiten übertragen? |
| | | | |
| | | Du kannst doch per Code so viele Ecken und Kanten definieren wie Du magst und auch auf Murmelei reagieren. oO |
| | | | |
| | 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
|
| | | | |
| | | ... 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. |
| | | | |
| | 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
|
| | | | |
| | | 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. |
| | | | |
| | 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
|
| | | | |
| | 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 X2Grüß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 ▲ |
| |
|
AntwortenThemenoptionen | 27.899 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |