| |
|
|
Nico Madysa |
$H Windows.ph
cls
var Long upDownIsVisible = Create("SpinEdit", %hWnd, "0;0;10", 25, 25, 100, 20)
var Long hidesUpDownControlsAfterIt = Create("GroupBox", %hWnd, "a", 0, 0, 200, 200)
var Long upDownIsHidden = Create("SpinEdit", %hWnd, "0;0;10", 25, 50, 100, 20)
Create("Text", %hWnd, "Press any key to repair the second spin edit", 230, 5, 100, 100)
waitinput
RescueLostUpDown(upDownIsHidden)
waitinput
end
proc RescueLostUpDown
parameters Long spinEdit
' Retrieve handle of updown control
var Long theLostOne = GetHandle(%hWnd, ItemID(spinEdit) + 1)
' move groupbox behind updown control
~SetWindowPos(hidesUpDownControlsAfterIt, theLostOne, 0, 0, 0, 0, ~SWP_NOMOVE | ~SWP_NOSIZE)
' this line shouldn't even be necessary.
SendMessage(theLostOne, $469, spinEdit, 0)' UDM_SETBUDDY
endproc
Man beachte, dass das UpDown-Control im ersten Bild immer noch da ist. Es kann angeklickt werden, IsWindowEnabled und IsWindowVisible liefern beide true , das einzig Auffälige ist, dass der Nutzer es nicht sehen kann. |
|
|
| |
|
|
|
E.T. | it's not a bug, it's a feature
...
var Long upDownIsVisible = Create("SpinEdit", %hWnd, "0;0;10", 25, 25, 100, 20)
var Long upDownIsHidden = Create("SpinEdit", %hWnd, "0;0;10", 25, 50, 100, 20)
var Long hidesUpDownControlsAfterIt = Create("GroupBox", %hWnd, "a", 0, 0, 200, 200)
...
... und schon passt es |
|
|
| 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... | 20.02.2014 ▲ |
|
|
|
|
Nico Madysa | Dieser Methode der Problemlösung bin ich mir durchaus bewusst. Deswegen habe ich die beiden SpinEdits in meinem Beispiel so angeordnet: Um zu zeigen, dass es die Groupbox ist, die sich auf der Z-Achse zwischen Edit und UpDown-Control mogelt.
Mir fällt es nur gelinde gesagt schwer, einen Anwendungsbereich für so ein "Feature" zu finden.
Außerdem fühlt es sich nicht gerade konsistent an, dass sich die Groupbox auf der Z-Achse gerade zwischen zwei sehr stark zusammengehörige Controls schiebt.
Außerdem wird der Code auch nicht gerade lesbarer, wenn alle Groupboxen nach allen Spinedits ereugt werden.
Außerdem hat mich dieser Mist mehrere Stunden Debugging gekostet und hat mir moderat aufs Gemüt geschlagen. |
|
|
| |
|
|
|
E.T. | Hm, das das UpDown-Control nach dem RescueLostUpDown im Edit des SpinEdits liegt ist aber auch nicht Sinn der der Sache, oder |
|
|
| 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.02.2014 ▲ |
|
|
|
|
Nico Madysa | Es liegt nicht im Edit-Feld, sondern das Editfeld wird verkürzt, um Platz für das UpDown-Control zu machen. Kannst du nachprüfen, in dem du die Message mehrmals versendest. Das MSDN [...] sagt auch:
An up-down control with the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style aligns with the left or right edge of its buddy window. The width of the buddy window is decreased to accommodate the width of the up-down control.
Und klar ist es nur eine sehr krude Lösung. Für mich funktioniert sie aber, weil ich für mein größenveränderbares Fenster sowieso regelmäßig SetWindowPos auf das Editfeld anwenden muss und das UpDown-Control dabei gleich mit in die Rechnung einbeziehen kann.
' Ausschnitt: mainwindow.inc
/* <...> */
proc ?_Init
/* <...> */
Window x, y - dx, dy
/* <...> */
?_form.intervalEdit& = Create("SpinEdit", %hWnd, intervalEditCaption, 0, 0, 0, 0)
?_intervalUpDown = GetHandle(%hWnd, ItemID(?_form.intervalEdit&) + 1)
/* <...> */
' Workaround for updown control being overlaid by groupbox!
SetWindowPos(mainwindow.advancedGroup, mainwindow.intervalUpDown, 0, 0, 0, 0, ~SWP_NOSIZE | ~SWP_NOMOVE)
/* <...> */
Subclass %hWnd, 1
endproc
/* <...> */
proc ?_AdjustContents
parameters Long width, height
declare Long currentX, currentY, currentHeight
/* <...> */
var Long tracker = BeginDeferWindowPos(controlCount)
casenot tracker: return 0
/* <...> */
' Das Editfeld nimmt hier die gesamte zur
' Verfügung stehende Breite ein.
tracker = DeferWindowPos(tracker, ?_form.intervalEdit&, 0, \
currentX, currentY, groupInnerWidth, editHeight, flags)
/* <...> */
var Int result = EndDeferWindowPos(tracker)
' Hier wird das Editfeld so verkürzt, dass das UpDown-Control genug Platz hat.
SendMessage(?_intervalUpDown, ~WM_USER + $69, ?_form.intervalEdit&, 0)' UDM_SETBUDDY
return result
endproc
Dass bei einem SetWindowPos auf das SpinEdit das zugehörige UpDown-Control nicht mitverschoben wird, ist noch so ein Gag, den ich noch nicht mal erwähnt habe ... |
|
|
| |
|
|
|
RGH | Dummerweise sind beide Controls getrennte Controls und das eine weiß nichts vom anderen. Nur der Programmierer selbst, weiß, dass sie zusammengehören. Ich sehe da im Moment keine sinnvolle Möglichkeit, das mit erträglichem Aufwand zu ändern.
Gruß Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 25.09.2014 ▲ |
|
|
|