关于ToolStripMenuItem重绘问题,救命问题

yunhaiC QQ654777694 2015-04-02 05:27:54



第一张图,用base.OnPaint(e);当鼠标放在其中一个MenuItem上的时候,就出现蓝色框子框住。
第二张图,我把base.OnPaint(e);注释掉,重绘文字,但是当鼠标放在上面的时候,没有出现蓝色框子。
因为篇幅问题,我就不叙述为什么我要用重绘文字的方式。

现在问题是:如果我用第二张图的方法重绘文字,那当鼠标放在MenuItem上的那种蓝色框子的效果,应该怎么实现呢?
...全文
313 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-04-02
  • 打赏
  • 举报
回复
引用 6 楼 yunhaiC 的回复:
[quote=引用 5 楼 wyd1520 的回复:] [quote=引用 4 楼 yunhaiC 的回复:] [quote=引用 3 楼 wyd1520 的回复:] 就在你的那个 //base.OnPaint(e); if(mouseHover) //判断鼠标是否在当前项 { 这里画框; } 这里画文字代码;
OnMouseHover里面不能使用Graphics,也就是说无法去画框。[/quote] OnMouseHover 这里面是 { ismouseHover=true } OnMouseLeave 这里面是 { ismouseHover=false } 然后Paint里面的if就调用这个ismouseHover 是否要不要画框,明白没? [/quote]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsFormsApplication1
{
    public class CustomMenuItem : ToolStripMenuItem
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);
            var rect = new Rectangle(0, 0, this.Size.Height, this.Size.Width);
            if (IsMouseHover == true)
            {
                using (var b = new SolidBrush(Color.FromArgb(49, 106, 197)))
                {
                    e.Graphics.FillRectangle(b, rect);
                }
            }
            else
            {
                using (var b = new SolidBrush(Color.FromArgb(255, 255, 255)))
                {
                    e.Graphics.FillRectangle(b, rect);
                }
            }


            SolidBrush drawBrush = new SolidBrush(Color.Black);
            System.Drawing.Size txtSize = TextRenderer.MeasureText(this.Text, this.Font);

            PointF drawPoint = new PointF(10, (this.Height - txtSize.Height) / 2);
            e.Graphics.DrawString(this.Text.ToString(), this.Font, drawBrush, drawPoint);
            
        }

        bool IsMouseHover = false;
        protected override void OnMouseHover(EventArgs e)
        {
            base.OnMouseHover(e);
            IsMouseHover = true;
        }


        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            IsMouseHover = false;
        }
    }
}
好像没有起到效果,麻烦试试看。 [/quote] 在两个 protected override void OnMouseHover(EventArgs e) { base.OnMouseHover(e); IsMouseHover = true; this.Invalidate(); //要加这句 } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); IsMouseHover = false; this.Invalidate();//要加这句 }
  • 打赏
  • 举报
回复
引用 5 楼 wyd1520 的回复:
[quote=引用 4 楼 yunhaiC 的回复:] [quote=引用 3 楼 wyd1520 的回复:] 就在你的那个 //base.OnPaint(e); if(mouseHover) //判断鼠标是否在当前项 { 这里画框; } 这里画文字代码;
OnMouseHover里面不能使用Graphics,也就是说无法去画框。[/quote] OnMouseHover 这里面是 { ismouseHover=true } OnMouseLeave 这里面是 { ismouseHover=false } 然后Paint里面的if就调用这个ismouseHover 是否要不要画框,明白没? [/quote]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsFormsApplication1
{
    public class CustomMenuItem : ToolStripMenuItem
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);
            var rect = new Rectangle(0, 0, this.Size.Height, this.Size.Width);
            if (IsMouseHover == true)
            {
                using (var b = new SolidBrush(Color.FromArgb(49, 106, 197)))
                {
                    e.Graphics.FillRectangle(b, rect);
                }
            }
            else
            {
                using (var b = new SolidBrush(Color.FromArgb(255, 255, 255)))
                {
                    e.Graphics.FillRectangle(b, rect);
                }
            }


            SolidBrush drawBrush = new SolidBrush(Color.Black);
            System.Drawing.Size txtSize = TextRenderer.MeasureText(this.Text, this.Font);

            PointF drawPoint = new PointF(10, (this.Height - txtSize.Height) / 2);
            e.Graphics.DrawString(this.Text.ToString(), this.Font, drawBrush, drawPoint);
            
        }

        bool IsMouseHover = false;
        protected override void OnMouseHover(EventArgs e)
        {
            base.OnMouseHover(e);
            IsMouseHover = true;
        }


        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            IsMouseHover = false;
        }
    }
}
好像没有起到效果,麻烦试试看。
本拉灯 2015-04-02
  • 打赏
  • 举报
回复
引用 4 楼 yunhaiC 的回复:
[quote=引用 3 楼 wyd1520 的回复:] 就在你的那个 //base.OnPaint(e); if(mouseHover) //判断鼠标是否在当前项 { 这里画框; } 这里画文字代码;
OnMouseHover里面不能使用Graphics,也就是说无法去画框。[/quote] OnMouseHover 这里面是 { ismouseHover=true } OnMouseLeave 这里面是 { ismouseHover=false } 然后Paint里面的if就调用这个ismouseHover 是否要不要画框,明白没?
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
就在你的那个 //base.OnPaint(e); if(mouseHover) //判断鼠标是否在当前项 { 这里画框; } 这里画文字代码;
OnMouseHover里面不能使用Graphics,也就是说无法去画框。
本拉灯 2015-04-02
  • 打赏
  • 举报
回复
就在你的那个 //base.OnPaint(e); if(mouseHover) //判断鼠标是否在当前项 { 这里画框; } 这里画文字代码;
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
你不能把Base.Pant给注释掉,画蓝框的代码在里面的。 除非你自己再实现画蓝框。
朋友,如何自己画呢,在什么方法里面重绘蓝框
本拉灯 2015-04-02
  • 打赏
  • 举报
回复
你不能把Base.Pant给注释掉,画蓝框的代码在里面的。 除非你自己再实现画蓝框。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace HistoryMenu { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void 打开ToolStripMenuItem_Click(object sender, EventArgs e) { openFileDialog1.Filter = "*.*(所有文件)|*.*";//设置打开文件格式 if (openFileDialog1.ShowDialog() == DialogResult.OK)//判断是否打开选择文件对话框 { StreamWriter s = new StreamWriter("Menu.ini", true);//实例化写入流对象 s.WriteLine(openFileDialog1.FileName);//向INI文件写入内容 s.Flush();//清除缓冲区 s.Close();//关闭写入流 System.Diagnostics.Process.Start(openFileDialog1.FileName);//打开选择的文件 } Form1_Load(sender, e);//重新加载菜单 } private void Form1_Load(object sender, EventArgs e) { 文件ToolStripMenuItem.DropDownItems.Clear();//清空菜单 ToolStripMenuItem menuitem1 = new ToolStripMenuItem("打开");//实例化打开菜单 文件ToolStripMenuItem.DropDownItems.Insert(0, menuitem1);//添加打开菜单 menuitem1.Click += new EventHandler(打开ToolStripMenuItem_Click);//为打开菜单指定单击事件 ToolStripMenuItem menuitem2 = new ToolStripMenuItem("退出");//实例化退出菜单 文件ToolStripMenuItem.DropDownItems.Insert(1, menuitem2);//添加退出菜单 StreamReader sr = new StreamReader("Menu.ini");//实例化读取流对象 int i = this.文件ToolStripMenuItem.DropDownItems.Count - 1;//定义历史记录位置 while (sr.Peek() >= 0)//从INI文件读取历史记录 { ToolStripMenuItem menuitem = new ToolStripMenuItem(sr.ReadLine());//实例化历史菜单 this.文件ToolStripMenuItem.DropDownItems.Insert(i, menuitem);//添加历史菜单 i++;//重新指定历史记录位置 menuitem.Click += new EventHandler(menuitem_Click);//为历史菜单指定单击事件 } sr.Close();//关闭读取流 } private void menuitem_Click(object sender, EventArgs e) { try { ToolStripMenuItem menu = (ToolStripMenuItem)sender;//获取菜单单击项 System.Diagnostics.Process.Start(menu.Text);//根据历史菜单打开指定文件 } catch { } } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; namespace 贪吃蛇 { public partial class Form1 : Form { public int speed = 350; //用于设置贪吃蛇的速度 public static bool ifStart = false; //用于游戏是否开始 public static bool pause = true; //用于游戏是否暂停,游戏暂停为true Snake snake = new Snake();//实例化Snake类 Food food = new Food(); public Form1() { InitializeComponent(); } //绘制游戏场景 public void ProtractTable(Graphics G) { //绘制单元格的纵向线 for (int i = 0; i <= panel1.Width / Snake.SnakeBone; i++) { G.DrawLine(new Pen(Color.LightGreen, 1), new Point(i * Snake.SnakeBone, 0), new Point(i * Snake.SnakeBone, panel1.Height)); } //绘制单元格的横向线 for (int i = 0; i <= panel1.Height / Snake.SnakeBone; i++) { G.DrawLine(new Pen(Color.LightGreen, 1), new Point(0, i * Snake.SnakeBone), new Point(panel1.Width, i * Snake.SnakeBone)); } } private void panel1_Paint(object sender, PaintEventArgs e) { Graphics G = panel1.CreateGraphics();//创建panel1控件的Graphics类 ProtractTable(G); //绘制游戏场景 if (!ifStart) //如果没有开始游戏 { Snake.timer = timer1; Snake.label = label1; //初始化场地及贪吃蛇信息; //Control c = (Control)panel1; Snake.GamePlaceSet(panel1, Snake.SnakeBone); } else { for (int i = 0; i < Snake.List.Count; i++)//绘制蛇体 { e.Graphics.FillRectangle(Snake.SolidSnake, ((Point)Snake.List[i]).X + 1, ((Point)Snake.List[i]).Y + 1, Snake.SnakeBone - 1, Snake.SnakeBone - 1); } //绘制食物 e.Graphics.FillRectangle(Food.SolidFood, Food.FoodPoint.X + 1, Food.FoodPoint.Y + 1, Snake.SnakeBone - 1, Snake.SnakeBone - 1); if (Snake.isGame)//如果游戏结束 { e.Graphics.DrawString("游戏结束!", new Font("宋体", 50, FontStyle.Bold), new SolidBrush(Color.Yellow), new PointF(100, 150)); } } } private void 初级ToolStripMenuItem_Click(object sender, EventArgs e) {//在游戏没有开始和游戏结束时才可以选择设置 if ((ifStart == false) || Snake.isGame) {初级ToolStripMenuItem.Checked = false;//设置初级项被选中 中级ToolStripMenuItem.Checked = false;//设置中级项被选中 高级ToolStripMenuItem.Checked = false;//设置高级项目被选中 ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 speed = 350; label.Focus();//获得焦点 } } private void 中级ToolStripMenuItem_Click(object sender, EventArgs e) { //在游戏没有开始和游戏结束时才可以选择设置 if ((ifStart == false) || Snake.isGame) { 初级ToolStripMenuItem.Checked = false;//设置初级项被选中 中级ToolStripMenuItem.Checked = false;//设置中级项被选中 高级ToolStripMenuItem.Checked = false;//设置高级项目被选中 ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 speed = 250;//中级 label.Focus();//获得焦点 } } private void 高级ToolStripMenuItem_Click(object sender, EventArgs e) {//在游戏没有开始和游戏结束时才可以选择设置 if ((ifStart == false) || (Snake.isGame)) { 初级ToolStripMenuItem.Checked = false;//设置初级项被选中 中级ToolStripMenuItem.Checked = false;//设置中级项被选中 高级ToolStripMenuItem.Checked = false;//设置高级项目被选中 ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 speed = 200;//高级 label.Focus();//获得焦点 } } private void 开始sapceToolStripMenuItem_Click(object sender, EventArgs e) { //控制游戏的开始、暂停、和退出 ifStart = false; Graphics G = panel1.CreateGraphics();//创建panel1控件的Graphics类 //刷新游戏场地 G.FillRectangle(Snake.SolidBack, 0, 0, panel1.Width, panel1.Height); ProtractTable(G);//绘制游戏场地 ifStart = true;//开始游戏 //初始化场地以及贪吃蛇信息 Snake.GamePlaceSet(panel1, Snake.SnakeBone); timer1.Interval = speed;//设置贪吃蛇的移动速度 timer1.Start();//启动计时器 pause = false;//游戏初始状态,暂停取消 label.Text = "0";//显示当前分数 Food.Buildfood(Snake.hasFood, Snake.co);//生成食物 label.Focus();//获得焦点,便于键盘操作 } private void 暂停ToolStripMenuItem_Click(object sender, EventArgs e) { Graphics G = panel1.CreateGraphics();//创建panel1控件的Graphics类 //如果游戏正在运行 if ((pause == false && ifStart == true) && (!Snake.isGame)) { G.DrawString("游戏暂停!", new Font("宋体", 50, FontStyle.Bold), new SolidBrush(Color.Yellow), new PointF(100, 150)); timer1.Stop();//停止当前计时器 pause = true;//当前游戏暂停 } //如果游戏正在运行 else if (pause == true && ifStart == true && (!Snake.isGame)) { G.FillRectangle(Snake.SolidBack, 0, 0, panel1.Width, panel1.Height); ProtractTable(G); timer1.Start();//启动计时器 pause = false;//开始游戏 } } private void 结束F4ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame))//如果游戏正在运行 { if (DialogResult.Yes == MessageBox.Show("是否退出游戏?", "提示", MessageBoxButtons.YesNo)) { timer1.Stop(); //停止计时器 Application.Exit(); //停止运行,退出游戏 } } else MessageBox.Show("游戏正在运行中,暂时不允许退出!", "提示"); } private void 游戏说明ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); } //控制游戏的开始、暂停、和退出 public void NoviceControl(int n) { Graphics G = panel1.CreateGraphics();//创建panel1控件的Graphics类 switch (n) { case 1://开始游戏 { ifStart = false; //刷新游戏场地 G.FillRectangle(Snake.SolidBack, 0, 0, panel1.Width, panel1.Height); ProtractTable(G);//绘制游戏场地 ifStart = true;//开始游戏 //初始化场地以及贪吃蛇信息 Snake.GamePlaceSet(panel1, Snake.SnakeBone); timer1.Interval = speed;//设置贪吃蛇的移动速度 timer1.Start();//启动计时器 pause = false;//暂停游戏 Food.Buildfood(Snake.hasFood, Snake.co);//生成食物 label.Text = "0";//显示当前分数 break; } case 2://暂停游戏 {//如果游戏正在运行 if ((pause == false && ifStart == true) && (!Snake.isGame)) { G.DrawString("游戏暂停!", new Font("宋体", 50, FontStyle.Bold), new SolidBrush(Color.Yellow), new PointF(100, 150)); timer1.Stop();//停止当前计时器 pause = true;//当前游戏暂停 } //如果游戏正在运行 else if (pause == true && ifStart == true && (!Snake.isGame)) { G.FillRectangle(Snake.SolidBack, 0, 0, panel1.Width, panel1.Height); ProtractTable(G); timer1.Start();//启动计时器 pause = false;//开始游戏 } break; } case 3://退出游戏 { if ((ifStart == false) || (Snake.isGame))//如果游戏正在运行 { timer1.Stop(); //停止计时器 Application.Exit(); //停止运行,退出游戏 } break; } // case 4://打开帮助信息 // ' { if ((ifStart == false) || (Snake.isGame))//如果游戏正在运行 { // help temp = new help();//初始 一个 help实例 // if (temp.ShowDialog(this) == DialogResult.OK) // temp.Dispose(); // } // break; // } // } } } } private void Form1_KeyDown(object sender, KeyEventArgs e) { int tem_p = -1;//记录控件键值 if (e.KeyCode == Keys.F2)//如果按F2 tem_p = 1;//开始游戏 if (e.KeyCode == Keys.Space)//如果按F3 tem_p = 2;//暂停游戏或者继续游戏 if (e.KeyCode == Keys.F4)//如果按F4 tem_p = 3;//关闭游戏 if (e.KeyCode==Keys.F3) tem_p = 4;//打开帮助信息 if (tem_p != -1)//如果当前是操作标识 NoviceControl(tem_p);     //控制游戏的暂停和关闭 if (ifStart == true && pause == false)//如果游戏启动,键盘方向键才起作用 { int tem_n = -1;//记录移动键值 if (e.KeyCode == Keys.Right || e.KeyCode == Keys.D)//按下右键向右移动 tem_n = 0; if (e.KeyCode == Keys.Left || e.KeyCode == Keys.A)//按下左键向左移动 tem_n = 1; if (e.KeyCode == Keys.Up || e.KeyCode == Keys.W)//按下上键向上移动 tem_n = 2; if (e.KeyCode == Keys.Down || e.KeyCode == Keys.S)//按下键向下移动 tem_n = 3; if (tem_n != -1 && tem_n != Snake.Direct) { if (Snake.isGame == false) {//如果移动的方向不是相反方向 if (!((tem_n == 0 && Snake.Direct == 1 || tem_n == 1 && Snake.Direct == 0) || (tem_n == 2 && Snake.Direct == 3 || tem_n == 3 && Snake.Direct == 2))) { Snake.Direct = tem_n;//记录移动的方向 snake.SnakeMove(tem_n, this);//移动贪吃蛇 } } } } } private void 绿色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 绿色ToolStripMenuItem.Checked = false; 红色ToolStripMenuItem.Checked = false; 蓝色ToolStripMenuItem.Checked = false; 黑色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SolidSnake = new SolidBrush(Color.Green); } } private void 红色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 绿色ToolStripMenuItem.Checked = false; 红色ToolStripMenuItem.Checked = false; 蓝色ToolStripMenuItem.Checked = false; 黑色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SolidSnake = new SolidBrush(Color.Red); } } private void 蓝色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 绿色ToolStripMenuItem.Checked = false; 红色ToolStripMenuItem.Checked = false; 蓝色ToolStripMenuItem.Checked = false; 黑色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SolidSnake = new SolidBrush(Color.Blue); } } private void 黑色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 绿色ToolStripMenuItem.Checked = false; 红色ToolStripMenuItem.Checked = false; 蓝色ToolStripMenuItem.Checked = false; 黑色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SolidSnake = new SolidBrush(Color.Black); } } private void 原始大小ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 原始大小ToolStripMenuItem.Checked = false; 放大两倍ToolStripMenuItem.Checked = false; 放大三倍ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SnakeBone = 10; } } private void 放大两倍ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 原始大小ToolStripMenuItem.Checked = false; 放大两倍ToolStripMenuItem.Checked = false; 放大三倍ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SnakeBone = 20; } } private void 放大三倍ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 原始大小ToolStripMenuItem.Checked = false; 放大两倍ToolStripMenuItem.Checked = false; 放大三倍ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Snake.SnakeBone = 30; } } private void 橙色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) {橙色ToolStripMenuItem.Checked = false; 黄色ToolStripMenuItem.Checked = false; 紫色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Food.SolidFood = new SolidBrush(Color.Orange); } } private void 黄色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 橙色ToolStripMenuItem.Checked = false; 黄色ToolStripMenuItem.Checked = false; 紫色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Food.SolidFood = new SolidBrush(Color.Yellow); } } private void 紫色ToolStripMenuItem_Click(object sender, EventArgs e) { if ((ifStart == false) || (Snake.isGame)) { 橙色ToolStripMenuItem.Checked = false; 黄色ToolStripMenuItem.Checked = false; 紫色ToolStripMenuItem.Checked = false; ((ToolStripMenuItem)sender).Checked = true;//设置当前项选中 Food.SolidFood = new SolidBrush(Color.Purple); } } private void timer1_Tick(object sender, EventArgs e) { snake.SnakeMove(Snake.Direct, this);//移动贪吃蛇 } private void textBox1_TextChanged(object sender, EventArgs e) { } private void label_Click(object sender, EventArgs e) { } } }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧