![]() |
Mousewheel kontrollieren
Finde keine Möglichkeit zu kontrollieren wann das Rad nicht mehr bewegt wird.
Mit welcher Message könnte man das gegenprüfen? Ich zeichne die aktuelle Value beim scrollen auf ein Bitmap und setze dann beim Scrollen bWheel auf True. Jetzt benötige ich eine Message in der ich bWheel wieder auf false setzen kann. gibt es da was? Bei HSCROLL kann ich das kontrollieren über TB_ENDTRACK wie bei WM_MOUSEWHEEL ? gruss |
AW: Mousewheel kontrollieren
Ne, der Ansatz ist verkehrt.
Führe die Aktion, die von bWheel = True ausgelöst wird, immer nur einmal aus, wenn die Message eintrudelt und höre dann auf. Natürlich entsprechend des Vorzeichen des Wertes von WheelDelta reagieren. |
AW: Mousewheel kontrollieren
Zitat:
gruss |
AW: Mousewheel kontrollieren
Hallo EWeiss,
Delphi ist eine Ereignisorientierte Sprache. Das Programm wartet in der Regel auf irgendwelche Ereignisse und reagiert dann darauf. Wenn der Benutzer das Mausrad ein Ritzel weiterdreht, wird je nach Drehrichtung um eine bestimmte Weite (üblicherweise 3 Zeilen) gescrollt. Drehst Du das Mausrad drei Ritzel weit, wird zuerst das erste Ritzel abgearbeitet, dann das zweite und anschließend das dritte. Jedes Ritzel ist ein Ereignis. Deshalb benötigt man kein "Mausrad nicht mehr drehend"-Ereignis. Gruß e-gon |
AW: Mousewheel kontrollieren
Zitat:
Was passiert denn in deiner Anwendung, wenn bWheel auf True gesetzt wird? |
AW: Mousewheel kontrollieren
Zitat:
Und nach dem zeichnen wird bWheel auf false gesetzt. Das ist mir aber zu kurz weil dann direkt wieder auf die Anzeige der Zeit geschaltet wird. Bei der Scrollbar wird das zeichnen der Zeit erst dann fortgesetzt wenn ich das Thumbnail nicht mehr drücke. Zitat:
gruss |
AW: Mousewheel kontrollieren
Zitat:
Stelle dir eine MouseWheel-Aktion vor wie einmal draufklicken und loslassen auf den Thumbnail der Scrollbar vor. Wenn es dir zeitlich nicht reicht, weil dann die Timestamp-Anzeige (?) über die Stelle sofort rüberpinselt verzögere das doch per Timer?
Delphi-Quellcode:
if bWheel then
begin PaintThings; StartTimer; end; ... procedure TimerEvent; begin //so und soviele Millisekunden später; StopDoingPaintThings; bWheel := False; StopTimer; end; |
AW: Mousewheel kontrollieren
Zitat:
ok zur Veranschaulichung! Bsp. HSCROLL sobald einer der unteren messagen eintritt wird gP.bVolume auf True gesetzt. lasse ich die Maus los schalte ich sie bei TB_ENDTRACK wieder auf false. Im Timer wird dann die Schrift.. Value der Lautstärke auf ein Overlay Bitmap gezeichnet solange bis die Maus losgelassen wird und das Ereignis TB_ENDTRACK eintritt.
Code:
Timer..
case WM_HSCROLL:
{ switch LOWORD(wParam) { case TB_ENDTRACK: gP.bVolume = FALSE; break; case TB_THUMBTRACK: // ziehen des "Sliders" case TB_TOP: // Pos1 case TB_BOTTOM: // Ende case TB_LINEDOWN: // Pfeiltasten oben/unten case TB_PAGEDOWN: // Bild runter & in die Leiste geklickt case TB_PAGEUP: // Bild auf & in die Leiste geklickt { gP.bVolume = TRUE; gP.Position = (int)SendMessage(gP.hTBVolume, TBM_GETPOS, 0, 0); if (gP.Position == 0) KVideo_SetVolume(-10000); else KVideo_SetVolume(LONG(5000 * log10(gP.Position)) - 10000); } break; } } break;
Code:
bei Volumen ist das kein Problem weil ich hier ein Ereignis auswerten kann.
if (gP.bWheel)
{ WCHAR wWheel[MAX_PATH] = { 0 }; WCHAR wtmpWheel[MAX_PATH] = { 0 }; if (gP.zoom < 10) { _snwprintf_s(wtmpWheel, MAX_PATH, 259, L"%I64u Zoom", gP.zoom); Str_Combine(wWheel, L"0", wtmpWheel); } else _snwprintf_s(wWheel, MAX_PATH, 259, L"%I64u Zoom", gP.zoom); DrawTextToDC(gP.OverlayDC, (WCHAR*)wWheel, rc.left, rc.top, nColor, gP.FontName, 36, n3D, ZD_TextHorzUp, gP.PrivateFont); gP.bWheel = FALSE; } else if (gP.bVolume) { WCHAR wVolume[MAX_PATH] = { 0 }; WCHAR wtmpVolume[MAX_PATH] = { 0 }; int volume = (int)SendMessage(gP.hTBVolume, TBM_GETPOS, 0, 0); if (volume < 100) { _snwprintf_s(wtmpVolume, MAX_PATH, 259, L"%d Vol", volume); Str_Combine(wVolume, L"0", wtmpVolume); } else _snwprintf_s(wVolume, MAX_PATH, 259, L"%d Vol", volume); DrawTextToDC(gP.OverlayDC, (WCHAR*)wVolume, rc.left, rc.top, nColor, gP.FontName, 36, n3D, ZD_TextHorzUp, gP.PrivateFont); } else DrawTextToDC(gP.OverlayDC, (WCHAR*)OverlayTime, rc.left, rc.top, nColor, gP.FontName, 36, n3D, ZD_TextHorzUp, gP.PrivateFont); Das geht aber nicht bei MouseWheel. gruss |
AW: Mousewheel kontrollieren
Was du suchst ist also ein Timer, der nach x Millisekunden des Nichtdrehens etwas macht? Beim Mausrad gibt es nunmal kein Ende, denn woher soll der PC wissen, ob ich nach dem letzten Scrollereignis nicht doch nochmal einen Schritt drehen will oder vielleich doch nicht mehr oder erst in 10 Sekunden oder in einer Stunde?
|
AW: Mousewheel kontrollieren
Zitat:
Muss doch irgendwie gehen andere machen das doch auch mit ihrem Overlay Bitmaps. Wenn ich direkt nach DrawText.. bWheel auf False setze ist das zu kurz. Und mit Sleep und Konsorte bringt das nichts. gruss |
AW: Mousewheel kontrollieren
Lies meinen ersten Satz und dann rate mal, wie die das machen. :stupid:
|
AW: Mousewheel kontrollieren
Zitat:
Wenn du gelesen hast das die ganze Geschichte in einem Timer abläuft dann wüsstest du warum ich es nicht über einen zusätzlichen Timer regeln will. OK. Dann werde ich es in Kombination mit der Shift taste regeln. Dann kann ich darauf reagieren wenn die Taste losgelassen wird. gruss |
AW: Mousewheel kontrollieren
Zitat:
Weil den Hammer benutze ich schon, um meinen wackligen Tisch zu stabilisieren, da möchte ich ihn nicht noch zusätzlich benutzen. Eine Harke hat ja auch einen Stil und vorne Metall dran, dass muss ja wohl auch damit gehen" Nimm doch unsere Ratschläge einfach an Emil...Es geht nicht immer alles nur weil du es so möchtest. So funktioniert das im Leben nicht. Oft sind deine "Lösungen" schlimme von Hinten-durch-die-Brust-ins-Auge-Geschichten, die du wie eine Löwenmutter ihr Junges bis aufs Blut verteidigst. Eine Anwendung kann auch mehr als einen Timer haben, trau dich! |
AW: Mousewheel kontrollieren
Zitat:
Zitat:
Das reicht da braucht man keinen Timer. Hätte ich auch vorher drauf kommen können. Was soll's
Code:
case WM_MOUSEWHEEL:
{ if (GetKeyState(VK_SHIFT) < 0) { gP.bWheel = TRUE; if ((short)GET_WHEEL_DELTA_WPARAM(wParam) > 0) gP.zoom--; else gP.zoom++; if (gP.zoom < 0) gP.zoom = 0; if (gP.zoom > 99) gP.zoom = 99; KVideo_Zoom(gP.zoom); } } break;
Code:
gruss
case WM_KEYUP:
switch (wParam) { case VK_SHIFT: gP.bWheel = FALSE; } break; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz