Re[3]: Фон DateTime
От: Indifferent Украина  
Дата: 20.04.06 06:55
Оценка: 44 (2)
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Indifferent, Вы писали:


A>Мне новый DateTime не подходит. Мне надо у уже существующих. но если другого пути нет...

... в руках у нас ...

Почему не подходит?

Решения есть, см. в:
Как можно перехватить Windows сообщения (WM_X), посылаемые в оконную процедуру control'a?


ниже вариант реализации механизма Subclassing'a

механизм Subclassing'a, при котором подменяется оконная процедура и следовательно все сообщения сначала приходят в новую процедуру, а затем (по усмотрению) уже в оригинальную. В .NET такая функциональность обеспечивается при помощи наследования от класса System.Windows.Forms.NativeWindow


using System;
using System.Windows.Forms;
using System.Drawing;
class Demo
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }

    public class MainForm : Form
    {
        private DateTimePicker dtp1;

        public MainForm()
        {
            this.Name = "MainForm";
            this.Text = "Demo";
               this.Size = new Size(400, 350);


            dtp1 = new DateTimePicker();
            dtp1.Location = new Point(12,12);
            dtp1.BackColor = Color.Aqua;
            this.Controls.Add(this.dtp1);

            dtpNativeWindow myNativeWindow = new dtpNativeWindow(dtp1);

        }

    }


    class dtpNativeWindow : NativeWindow
    {
        private Control _control = null;
        public dtpNativeWindow(Control control)
        {
            _control = control;
            control.HandleCreated += new EventHandler(OnHandleCreated);
            control.HandleDestroyed += new EventHandler(OnHandleDestroyed);
        }
        void OnHandleCreated(object sender, EventArgs e)
        {
            AssignHandle(((Control)sender).Handle);
        }
        void OnHandleDestroyed(object sender, EventArgs e)
        {
            ReleaseHandle();
        }
        const int WM_ERASEBKGND = 0x14;
        protected override void WndProc(ref Message m)
        {
            if(m.Msg == WM_ERASEBKGND && _control.Enabled)
            {
                using(Graphics g = Graphics.FromHdc(m.WParam))
                {
                    g.FillRectangle(new SolidBrush(_control.BackColor), _control.ClientRectangle);
                }
                return;
            }
            base.WndProc(ref m);
        }
    }


}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.