none
DateTimePicker背景色的问题 RRS feed

  • 问题

  • DateTimePicker设置背景色(CalendarMonthBackground属性)在XP系统能看到效果,但是在WIN7下总是白色,该怎么解决。

    通过用户控件重写WndProc(ref Message m)方法,也是只能在XP系统下才能看到效果。

        protected override void WndProc(ref Message m)
        {
          base.WndProc(ref m); 
          if (m.Msg == (int)0x0014  /* WM_ERASEBKGND */)
          {
            Graphics g = Graphics.FromHdc(m.WParam);
            g.FillRectangle(new SolidBrush(Color.Black), ClientRectangle);
            g.Dispose();
            return;
          }
        }
    
    2010年10月14日 7:46

答案

  • 勉强搞定。

    首先用户控件的构造函数要重写SetStyle();

        public MyDateTimePicker()
          : base()
        {
          this.SetStyle(ControlStyles.UserPaint, true);
          InitializeComponent();
        }
    

    然后重写OnPaint(),画矩形、文字和下拉按钮。使用此方法可以不需要WndProc()了。

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
          Graphics g = this.CreateGraphics();
          Rectangle dropDownRectangle = new Rectangle(ClientRectangle.Width - 20, 1, 19, 19);
          g.FillRectangle(new SolidBrush(Color.Black), 0, 0, ClientRectangle.Width, ClientRectangle.Height);
          g.DrawString(this.Text, this.Font, Brushes.White, 1, 4);
          ComboBoxRenderer.DrawDropDownButton(g, dropDownRectangle, System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
          g.Dispose();
        }
    

    即便如此,还是不够满足要求,问题如下:

    1.弹出日历的界面背景色在WIN7下总是白色,和XP下显示有差异(XP下以控件的CalendarMonthBackground属性值为准)。

    2.在WIN7、WINXP默认主题下,两个系统描绘这个控件的大小不一致,导致绘制的下拉按钮不能适合两个系统,且文字相对文本框的位置在两个系统下也有偏差。

    3.WINXP下,会绘制该控件的边框(系统默认为浅蓝色),暂时想不出处理办法。

     

    请问各位前辈有没有其他办法了?抛块砖也成啊,难道真的只有自己完完全全写一个日历控件?

    2010年10月16日 6:25

全部回复

  • 你好:

    你的代码中就是显示白色,请说明你在xp中的是什么效果。另外你可以尝试设置透明度来测试效果。

    希望对你有所帮助。


    I am here!
    2010年10月15日 3:29
    版主
  • 勉强搞定。

    首先用户控件的构造函数要重写SetStyle();

        public MyDateTimePicker()
          : base()
        {
          this.SetStyle(ControlStyles.UserPaint, true);
          InitializeComponent();
        }
    

    然后重写OnPaint(),画矩形、文字和下拉按钮。使用此方法可以不需要WndProc()了。

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
          Graphics g = this.CreateGraphics();
          Rectangle dropDownRectangle = new Rectangle(ClientRectangle.Width - 20, 1, 19, 19);
          g.FillRectangle(new SolidBrush(Color.Black), 0, 0, ClientRectangle.Width, ClientRectangle.Height);
          g.DrawString(this.Text, this.Font, Brushes.White, 1, 4);
          ComboBoxRenderer.DrawDropDownButton(g, dropDownRectangle, System.Windows.Forms.VisualStyles.ComboBoxState.Normal);
          g.Dispose();
        }
    

    即便如此,还是不够满足要求,问题如下:

    1.弹出日历的界面背景色在WIN7下总是白色,和XP下显示有差异(XP下以控件的CalendarMonthBackground属性值为准)。

    2.在WIN7、WINXP默认主题下,两个系统描绘这个控件的大小不一致,导致绘制的下拉按钮不能适合两个系统,且文字相对文本框的位置在两个系统下也有偏差。

    3.WINXP下,会绘制该控件的边框(系统默认为浅蓝色),暂时想不出处理办法。

     

    请问各位前辈有没有其他办法了?抛块砖也成啊,难道真的只有自己完完全全写一个日历控件?

    2010年10月16日 6:25
  • 请确认你的.net版本。尽量在Win7里用4版本吧。
    http://www.cnblogs.com/2gua
    2010年10月16日 9:53
  • 客户主要是XP,现在XP上2还没普及呢,如何谈4啊。

    2010年10月16日 11:43