Cette question - au bout de six ans - semble encore obtenir un certain intérêt, donc je vais jeter mes 2 cents: Ce qui fonctionne pour moi est 1) Faire un UserControl et changer la classe de base à 2 DateTimePicker Prenez un petit instantané bitmap du contrôle chaque fois que la valeur change 3) Interceptez le message WM_PAINT et si notre contrôle est désactivé, dessinez le bitmap à la place du contrôle. (Remarque: propriété AutoScaleMode dans le concepteur.cs fait erreur de compilation si juste enlever)
public partial class DateTimePickerWithReadOnly : DateTimePicker
{
Bitmap ReadOnlyImage;
// We maintain a "shadow" control to avoid capturing selections in the snapshot.
// If you use different formatting or styles just make sure the shadow is set to match!
DateTimePicker Shadow = new DateTimePicker();
public DateTimePickerWithReadOnly()
{
InitializeComponent();
CaptureBitmap();
this.ValueChanged += new EventHandler(DateTimePickerWithReadOnly_ValueChanged);
}
private void CaptureBitmap()
{
Shadow.Value = Value;
Shadow.Size = Size;
ReadOnlyImage = new Bitmap(Width, Height);
Shadow.DrawToBitmap(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height));
}
void DateTimePickerWithReadOnly_ValueChanged(object sender, EventArgs e)
{
CaptureBitmap();
}
protected override void DefWndProc(ref Message m)
{
base.DefWndProc(ref m);
// WM_PAINT is 0x000F
if ((m.Msg == 0x000F) && !Enabled)
{
Graphics g = base.CreateGraphics();
g.DrawImage(ReadOnlyImage, new Rectangle(0, 0, Size.Width, Size.Height));
g.Dispose();
}
}
}
Vous auriez besoin également désactiver l'entrée du clavier qui modifie la valeur –