protected override void OnPaint(PaintEventArgs e)

     //判断是否需要绘制图形
 if(this.drawEllipse==true)
{
Graphics g=e.Graphics;
    //找到窗体当前的工作区
    Rectangle rect=this.ClientRectangle;
    //绘制背景矩形
    g.FillRectangle(new SolidBrush(Color.Red),rect);
    //绘制前景椭圆
g.DrawEllipse(new Pen(Color.Yellow,2.0f),rect.X+5,rect.Y+3,
rect.Width-10,rect.Height-6);
}
}
书上说:OnPaint方法是通过Control继承的一个保护方法,在这里重载了这个方法,就不必要再添加Paint事件处理程序了.
我想请问这个Control和Onpaint是什么东西?

解决方案 »

  1.   


    #region Windows Form Designer generated code
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.mainMenu1 = new System.Windows.Forms.MainMenu();
    this.menuItem1 = new System.Windows.Forms.MenuItem();
    this.menuItem2 = new System.Windows.Forms.MenuItem();
    // 
    // mainMenu1
    // 
    this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
      this.menuItem1});
    // 
    // menuItem1
    // 
    this.menuItem1.Index = 0;
    this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
      this.menuItem2});
    this.menuItem1.Text = "图形(&G)";
    // 
    // menuItem2
    // 
    this.menuItem2.Index = 0;
    this.menuItem2.OwnerDraw = true;
    this.menuItem2.Text = "椭圆形";
    this.menuItem2.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.menuItem2_DrawItem);
    this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
    this.menuItem2.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.menuItem2_MeasureItem);
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(292, 209);
    this.Menu = this.mainMenu1;
    this.Name = "Form1";
    this.Text = "圆形菜单"; }
    #endregion /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1());
    } private void menuItem2_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
    {
    //设置菜单项的宽度
    e.ItemWidth=150;
    //设置菜单项的高度
    e.ItemHeight=60;
    } private void menuItem2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
    {
    Graphics g=e.Graphics;
    //判断菜单项的状态
    if ((e.State & DrawItemState.Selected)==DrawItemState.Selected)
    {
    //绘制背景填充矩形
    g.FillRectangle(new SolidBrush(Color.Red),e.Bounds.Left,e.Bounds.Top,e.Bounds.Width,
    e.Bounds.Height);
    //绘制前景椭圆
    g.DrawEllipse(new Pen(Color.Yellow,2.0f),e.Bounds.Left+5,e.Bounds.Top+3,
    e.Bounds.Width-10,e.Bounds.Height-6);
    }
    else 
    {
       //变换颜色绘制前景和背景
    g.FillRectangle(new SolidBrush(Color.Yellow),e.Bounds.Left,e.Bounds.Top,e.Bounds.Width,
    e.Bounds.Height);
    g.DrawEllipse(new Pen( Color.Red,2.0f),e.Bounds.Left+5,e.Bounds.Top+3,
    e.Bounds.Width-10,e.Bounds.Height-6); }
    } private void menuItem2_Click(object sender, System.EventArgs e)
    {
    //通知OnPaint可以做图了
    this.drawEllipse=true;
        //将窗体的客户工作区从菜单上转移到窗体上
        this.Enabled=false;
            this.Enabled=true;
    } protected override void OnPaint(PaintEventArgs e)

         //判断是否需要绘制图形
     if(this.drawEllipse==true)
    {
    Graphics g=e.Graphics;
        //找到窗体当前的工作区
        Rectangle rect=this.ClientRectangle;
        //绘制背景矩形
        g.FillRectangle(new SolidBrush(Color.Red),rect);
        //绘制前景椭圆
    g.DrawEllipse(new Pen(Color.Yellow,2.0f),rect.X+5,rect.Y+3,
    rect.Width-10,rect.Height-6);
    }
    }
    }
    }
      

  2.   

    请问这里这四个事件的关系是什么,运行顺序是怎么样的?private void menuItem2_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e) 
    private void menuItem2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
    private void menuItem2_Click
    protected override void OnPaint(PaintEventArgs e) 
      

  3.   

    我想请问这个Control和Onpaint是什么东西?
    ----------------------------------------
    Control 控件基类
    Onpaint 绘图咯
    不要想的太复杂,等精了再去xiang  
    -----------------------
    private void menuItem2_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)  
       设置菜单,菜单加载的时候运行 算第二个运行吧private void menuItem2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)  
    下拉菜单时开始绘子菜单 算第三吧。private void menuItem2_Click 
    菜单单击事件 算第4吧
    protected override void OnPaint(PaintEventArgs e)  //跟上面什么关系都没有,当窗体LOAD或被覆盖或覆盖一部分后
    窗体自动会调用这个方法,以便窗体上的控件或图象不会被抹掉。算第一个执行吧