Le comportement par défaut de dans une zone de texte Double-cliquer est de sélectionner une partie du texte. Je veux le remplacer en sélectionnant un mot. Mais j'ai trouvé que gérer l'événement doubleclick (ou surcharger la méthode OnDoubleClick) fait d'abord le comportement par défaut, puis exécute mon code. Est-il possible de désactiver le comportement par défaut.Est-il possible de désactiver de zone de texte sélectionner une partie du texte par double-cliquez sur
Répondre
Il ne semble pas que vous pouvez le faire avec des gestionnaires d'événements WinForms standard (DoubleClick
et MouseDoubleClick
ne vous donne aucun moyen de supprimer le comportement par défaut), mais vous pouvez le faire en créant une coutume WndProc
et la manipulation du messages de fenêtre vous-même.
Dans l'exemple ci-dessous, je remplace le Control.WndProc
par défaut dans la classe PreviewTextBox
que je crée. J'expose l'événement PreviewDoubleClick
par cette classe qui, si elle est manipulée dans le code client, peut être utilisé pour supprimer le comportement par défaut double-cliquez en définissant e.Handled = true;
. Dans cet exemple, l'événement est géré dans le gestionnaire d'événements OnPreviewDoubleClick
, où vous pouvez ajouter votre code personnalisé pour réagir au double-clic comme vous le souhaitez.
Si vous avez besoin d'informations supplémentaires sur la souris à propos du double-clic, je crois que vous pouvez l'obtenir à travers les champs Message.LParam
/Message.WParam
dans le WndProc
.
(le code ci-dessous suppose que vous avez un code derrière le formulaire déjà configuré)
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
class DoubleClickEventArgs : EventArgs
{
public bool Handled
{
get;
set;
}
}
class PreviewTextBox : TextBox
{
public event EventHandler<DoubleClickEventArgs> PreviewDoubleClick;
protected override void WndProc(ref Message m)
{
if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK))
{
var e = new DoubleClickEventArgs();
if (PreviewDoubleClick != null)
PreviewDoubleClick(this, e);
if (e.Handled)
return;
}
base.WndProc(ref m);
}
const int WM_DBLCLICK = 0xA3;
const int WM_LBUTTONDBLCLK = 0x203;
}
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
_textBox = new PreviewTextBox();
_textBox.Text = "Test text foo bar";
_textBox.PreviewDoubleClick += new EventHandler<DoubleClickEventArgs>(OnPreviewDoubleClick);
Controls.Add(_textBox);
}
void OnPreviewDoubleClick(object sender, DoubleClickEventArgs e)
{
e.Handled = true;
}
PreviewTextBox _textBox;
}
}
grand! Ça marche. Merci beaucoup! – leon