Announcement

Collapse
No announcement yet.

"Virtuelles" Scrollen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Virtuelles" Scrollen

    Hi!<p>

    Folgendes: Ich möchte einem beliebigem Fenster mit scrollbarem Inhalt, wenn ich die rechte Maustaste drücke scrollen.<p>

    Das Abfragen, ob die rechte Maustaste gedrückt ist (oder eben nicht) sollte über eine API-Funktion gehen (obwohl das nicht recht klappt). Aber wie scrolle ich den Inhalt des Fensters (bzw. sogar des Abschnitts) über dem ich mich befinde? Und wie unterscheide ich scrollbare Regionen innerhalb eines Programmes (z.B. Explorer)?<p>

    Danke im Vorraus für Eure Mühe!<br>
    Patrik

  • #2
    Hallo,

    heutzutage wird für das Scrollen eine Rad-Maus eingesetzt, die rechte Maustaste ist für Popup-Menüs etc. zuständig. Hält man sich an die Windows-Regeln, muss man sich um die in der Frage angesprochenen Sonderfälle nicht kümmern, da dies Windows automatisch erledigt.

    Das folgende Beispiel stammt aus meinem neuen Buch <b>Delphi Win32-Lösungen</b> und demonstriert die Auswertung der Rad-Maus. Wird dort am "Rad gedreht", so schickt die Anwendung WM_VSCROLL-Botschaften an das entsprechende Fenster, so das ein Scrollen ausgelöst wird:
    <pre>
    (* Botschaftsdefinition aus dem Win32-SDK:

    WM_MOUSEWHEEL
    fwKeys = LOWORD(wParam); // key flags
    zDelta = (short) HIWORD(wParam); // wheel rotation
    xPos = (short) LOWORD(lParam); // horizontal position of pointer
    yPos = (short) HIWORD(lParam); // vertical position of pointer

    »fwKeys« : Status der CTRL-, SHIFT- und Maustasten
    »zDelta« : Information, ob das Rad vor- oder zurückgedreht wurde
    »xPos« : Mauszeigerposition beim Auslösen der Botschaft
    »yPos« : Mauszeigerposition beim Auslösen der Botschaft

    Das Beispielprogramm zeigt die Mauszeigerposition nur an, wertet
    die Daten jedoch nicht weiter aus. Damit kann mit dem Rad der
    Inhalt von TMemo auch dann gescrollt werden, wenn der Mauszeiger
    das fokussierte (!) Programmfenster verläßt. *)
    ...
    procedure TFormMain.WndProc(var Message: TMessage);
    var
    zDelta : SmallInt;
    begin
    // nur die MouseWheel-Botschaft auswerten
    if (Message.Msg = FWMMouseWheel) then begin
    Inc(FWMCount);
    // Wurde das Rad vor- oder zurückgedreht ?
    zDelta := HiWord(Message.wParam);
    if zDelta < 0 then begin
    // -1 = eine Zeile zurück
    PostMessage(Memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
    Inc(FzDelta);
    end else begin
    // 0 = eine Zeile vor
    PostMessage(Memo1.Handle, WM_VSCROLL, SB_LINEUP, 0);
    Dec(FzDelta);
    end;
    // das Ganze optisch zur Kontrolle anzeigen
    with ListView1 do begin
    Items[0].SubItems[0] := IntToStr(FWMCount);
    Items[2].SubItems[0] := IntToStr(FzDelta);
    Items[4].SubItems[0] := IntToStr(LoWord(Message.lParam));
    Items[5].SubItems[0] := IntToStr(HiWord(Message.lParam));
    end;
    end;
    inherited;
    end;
    </pre&gt

    Comment

    Working...
    X