| |
|
|
Georg Teles | Guten Abend,
bin dabei eines meiner Programme "upzudaten" und mir fiel jetzt erst auf, warum der ButtonKlick manchmal garnicht reagiert hatte:
Da mein Programm (XTraBar) die Buttons erst beim Start definiert, kann ich keine absoluten Variablen abfragen, da je nach Konfiguration alle 50 oder nur 1 Button erstellt wird.
Verhalten: "normaler Button": %Message = 78 (klick) oder = 32 (wisch) SKControl erstellter Button: %Message = 272 (klick) oder = 32 (wisch)
= 78 / 272 treten auf, wenn man diese Buttons normal anklickt. = 32 tritt auf (beide Buttons betreffend), sobald man den Button anklickt (ohne loszulassen) und in eine Richtung "wischt" ohne diesen zu verlassen und die Maustaste dann loslässt.
Das kann ich mir halbwegs erklären, wenn ich die Bedeutungen der Messages in der folgenden Liste anschaue...
32 = WM_SETCURSOR (wisch normaler Button UND SKConrtol Button) 78 = WM_NOTIFY (klick normaler Button) 272 = WM_COMMAND (klick SKControl Button)
aber...
das Problem: Der obere Screenshot wurde unter Win10 geschossen.
Win XP, 7 und 8: einfacher Button: %Message = 78 oder = 32 (also gleich wie Win10) SKConrtol Button: %Message = 32 (immer)
Eventuell hat das etwas mit den Fensterobjekten und wie Windows diese behandelt zutun - ich vermute, unter Win 10 werden die Aktionen hier besser ausgewertet ?
Lösung: Ein Workarea hierzu habe ich hier [...] eingestellt, was nun ziemlich gut funktioniert.
Quelltext zum Screenshot oben, hierfür benötigt man die SKControl:
$I SKControl.inc
declare hdll&
'Dll laden & initialisieren
let hdll& = UseDll("SKControl.dll")
SKCtrl_InitDll()
WindowStyle 2+4+16+20+512
Window 200,200-500,600
WindowTitle "Test"
declare normalBmp#,hoverBmp#,clickedBmp#
dim normalBmp#,200
string normalBmp#,0 = (GetDir$("@")+"\\1.bmp")
dim hoverBmp#,200
string hoverBmp#,0 = (GetDir$("@")+"\\2.bmp")
dim clickedBmp#,200
string clickedBmp#,0 = (GetDir$("@")+"\\3.bmp")
var b% = Create("Button",%hWnd,"einfacher Button",250,20,200,40)
var tb11& = SKCtrl_CreateUserButton(%hwnd,0,normalBmp#,hoverBmp#,clickedBmp#,250,80,200,40,%hInstance)
locate 0,0
print "einfacher Button = 78 ODER =32"
print "User def. Button =273 ODER =32"
print
While 1=1
WaitInput
print %Message
SetFocus(%hWnd)
Case %Key = 2:Break
EndWhile
'Speicher freigeben...
dispose normalBmp#
dispose hoverBmp#
dispose clickedBmp#
'Dll deinitialisieren (Wichtig!) und freigeben
SKCtrl_DeInitDll()
FreeDll hdll&
END
Grüße Georg |
|
|
| |
|
|
|
H.Brill | Ich dachte immer, daß Clicked() beides auswertet : wm_lButtonDown + wm_LButtonUp also Drücken und Loslassen.
Das Wischen kenne ich nicht. Höchstens bei Drag&Drop, wo man das Control mit der Maus festhält und irgendwohin zieht.
Was brauchst du denn genau ? |
|
|
| 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. | 12.06.2020 ▲ |
|
|
|
|
Matthias Arlt | Mit Wischen ist wohl das bloße Überfahren des Controls mit der Maus gemeint. Dabei wird WM_SETCURSOR=32 zusammen mit WM_MOUSEMOVE=512 ausgelöst. |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 12.06.2020 ▲ |
|
|
|
|
Georg Teles | H.Brill (12.06.2020)
Ich dachte immer, daß Clicked() beides auswertet : wm_lButtonDown + wm_LButtonUp also Drücken und Loslassen.
ja das ist richtig, funktioniert auch hier wie es soll - wenn man zwischen wm_lButtonDown + wm_LButtonUp nun "wischt", also versucht den Button quasi zu "markieren" ist die %Message dann 32 = WM_SETCURSOR wogegen der normale Klick 78 = WM_NOTIFY - Das passt auch alles
H.Brill (12.06.2020)
Was brauchst du denn genau ?
mich würde eher interessieren, wie der SKControl erstellt wird oder eher eine %Message-Liste des Verhaltens von SK-Controls, da der Button zB zum enfachen Button andere %Messages liefert
Matthias Arlt (12.06.2020)
Mit Wischen ist wohl das bloße Überfahren des Controls mit der Maus gemeint. Dabei wird WM_SETCURSOR=32 zusammen mit WM_MOUSEMOVE=512 ausgelöst.
ja so ähnlich
Grüße |
|
|
| |
|
|
|
Matthias Arlt | In der SKControl findet ein komplettes Subclassing aller enthaltenen Controls statt. XProfan selbst kannte diese Möglichkeit damals noch nicht. Während der Erstellung z.B. des Buttons wird auf WM_PAINT reagiert und das Zeichnen nach Userangaben durchgeführt. Alle auf diese Weise erstellten Controls werden in einer DLL-internen Liste verwaltet. Von dem, was weiterhin im Subclassing passiert, wird vmtl. nicht alles an Profan bzw. die Original-Prozedur durchgereicht (oder kommt dort auch an), sondern nur, was für den damaligen Profan-Funktionsumfang (Messagehandling) relevant war. Der zwischenzeitlich aufgekommene XP-Style (Theme), den es mit der SKControl nicht gibt, brachte dahingehend weitere Unterschiede mit sich. |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 13.06.2020 ▲ |
|
|
|
|
H.Brill | Vielleicht kannst man was rausbekommen, wenn man die Messagebehandlung abschaltet (Hilfe : Messageverwaltung selbst übernehmen) und dann mit GetMessage probiert. Ich kenne aber die SKControl nicht, bzw. habe noch nicht mit der gearbeitet.
Ich fände es auch besser, wenn XProfan sämtliche Messages durchreichen würde. Das xprofane Messagehandling kann ja so bleiben. |
|
|
| 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. | 13.06.2020 ▲ |
|
|
|
|
Georg Teles | Hallo,
ja durch Messagehandling bekommt man die richtigen Messages, so kam ich auf die 2 Rückgabewerte. Dass alle Controls DLL-intern verwaltet werden war mir nicht bewusst.
Danke für die Infos, das genügt mir |
|
|
| |
|
|