L'utilisation de la roue de défilement Maj + est assez courante pour le défilement horizontal. p>
Les deux sont assez faciles à capturer. Je peux utiliser l'événement de la mouse à la souris avec un drapeau défini par la clé, les événements de porte-clés pour garder une piste lorsque la touche Maj enfoncée. P>
Cependant, comment puis-je déclencher le défilement horizontal? Je suis au courant de WM_MouseHheel, qui peut être utilisé pour déclencher l'événement? P>
mise à jour:
Pour un system.windows.form code> Il existe un
horizonontalscroll code> de type
hscrollproperties code>. Vous pouvez manipuler l'attribut code> code> sur cet objet pour modifier la position de la barre de défilement horizontale. Cependant, jusqu'à présent, je n'ai pas repéré d'autres commandes sur lesquelles cet objet est disponible. P>
3 Réponses :
Dans votre fichier de concepteur, vous devez ajouter manuellement un délégué d'événement de la souris. puis, dans votre code derrière, vous pouvez ajouter ce qui suit. P> private const int WM_SCROLL = 276; // Horizontal scroll
private const int SB_LINELEFT = 0; // Scrolls one cell left
private const int SB_LINERIGHT = 1; // Scrolls one line right
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private void RichTextBox_MouseWheel(object sender, MouseEventArgs e)
{
if (ModifierKeys == Keys.Shift)
{
var direction = e.Delta > 0 ? SB_LINELEFT : SB_LINERIGHT;
SendMessage(this.richTextBox.Handle, WM_SCROLL, (IntPtr)direction, IntPtr.Zero);
}
}
Cela fonctionne, mais provoque seulement le défilement de la barre de défilement, au lieu de Thunking (oui qui est un terme technique;)) C'est comme la roue normalement. La solution hacky de @alvin Wong fonctionne parfaitement.
Na, je voudrais totalement i> utilise Alvin (en supposant que ça marche). C'est Way i> Nettoyant et il n'utilise pas de méthodes externes ou de constons, etc. Je suggérais vivement que l'OP modifie la réponse à la réponse d'Alvin.
Le même code que celui fourni par Xixonia dans vb.net
Si vous créez votre propre contrôle dérivé de USERCONTROL code> ou
ScrollControl code> ou
formulaire code>, vous pouvez utiliser cette solution simple:
protected override void OnMouseWheel(MouseEventArgs e)
{
if (this.VScroll && (Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
this.VScroll = false;
base.OnMouseWheel(e);
this.VScroll = true;
}
else
{
base.OnMouseWheel(e);
}
}
Je n'ai pas testé cela, mais si cela fonctionne, c'est la voie à suivre.
@Christophalerharris Oui, ça marche sous Windows i>. Je ne sais pas si cela fonctionne sous Linux (mono) (mais en utilisant P / Invoke échouera définitivement de toute façon.) Toutefois, cette solution est bien hacky.
Je ne dirais pas que cette solution est hacky. Vous modifiez le comportement par défaut d'un événement en fonction de critères externes. Votre code reflète directement cela et le fait sans s'appuyer sur des DLL propriétaires. Je dirais que les classes Windowsforms vous fournissent une API hacky, fortement manipulée, mais que votre code l'utilise de la meilleure façon possible pour ce scénario spécifique.
Grande question, j'ai voulu le savoir aussi.