zoukankan      html  css  js  c++  java
  • [C#]简单XP菜单的实现(一)

    在WinForm的窗口(含菜单)上加入以下代码:

            /// <summary>
            
    /// 绘制菜单选项
            
    /// </summary>
            
    /// <param name="sender">菜单项</param>
            
    /// <param name="e">事件</param>

            private void MenuDrawItem( object sender , System.Windows.Forms.DrawItemEventArgs e )
            
    {
                
    //此项不被选择和鼠标不在此项时的背景色
                Brush MouseOutBackColor = new SolidBrush( SystemColors.Control );

                
    //鼠标经过和选择此项时的背景色
                Brush MouseOverBackColor = new SolidBrush( Color.LightSteelBlue );

                
    //字体和字体大小
                Font font = new Font( "Ariel"9 );
                
    //字体和边框颜色
                Brush MouseOverColor = new SolidBrush( System.Drawing.Color.Black );
                
    //此项不被选择和鼠标不在此项时的边框色
                Brush MouseOutColor = new SolidBrush( SystemColors.Control );

                
    //绘制图型
                Pen penMouseOver = new Pen( MouseOverColor );
                Pen penMouseOut 
    = new Pen( MouseOutColor ,1 );

                
    //绘制边框大小
                Rectangle rc = new Rectangle( e.Bounds.X+1 , e.Bounds.Y+1, e.Bounds.Width-2, e.Bounds.Height-2 );
                
                
    //填充和格式化文本
                e.Graphics.FillRectangle( MouseOutBackColor , rc );
                MenuItem mOrigin 
    = ( MenuItem )sender ;
                
    string mItemText = mOrigin.Text ;
                StringFormat sf 
    = new StringFormat();
                sf.Alignment 
    = StringAlignment.Center ;
                e.Graphics.DrawString( mItemText , font, MouseOverColor , rc , sf );

                
    //判断是否为选择和鼠标在此项上
                if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.Selected ) || e.State == ( DrawItemState.NoAccelerator | DrawItemState.HotLight ) )
                
    {
                    e.Graphics.FillRectangle( MouseOverBackColor, rc );
                    e.Graphics.DrawString( mItemText , font ,MouseOverColor, rc ,sf );
                    e.Graphics.DrawRectangle( penMouseOver, rc );
                }

                
    else
                
    {
                    e.Graphics.FillRectangle( MouseOutBackColor , rc );
                    e.Graphics.DrawString( mItemText , font ,MouseOverColor, rc ,sf );
                    e.Graphics.DrawRectangle( penMouseOut, rc );
                }

                e.DrawFocusRectangle();
            }



            
    /// <summary>
            
    /// 设置菜单选项的高宽
            
    /// </summary>
            
    /// <param name="sender">菜单项</param>
            
    /// <param name="e">事件</param>

            private void MenuMeasureItem( object sender, System.Windows.Forms.MeasureItemEventArgs e )
            
    {
                
    //高度
                e.ItemHeight = 20;
                
    //宽度
                e.ItemWidth = 100;
            }



    Menu菜单的OwnerDraw属性要设为true,然后在每个选项的:DrawItem和MeasureItem事件加入:
    this.menuItem1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.MenuDrawItem);
    this.menuItem1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.MenuMeasureItem);

    其中menuItem1为Menu的Name。

    效果如图:

  • 相关阅读:
    理解MVC MVVM MVP设计模式
    跨域问题详解
    JWT认证
    Django缓存
    API文档自动生成
    DRF分页器
    DRF请求和响应,以及Response对象重新封装
    drf认证、权限、频率、过滤、排序、异常处理
    drf之视图组件以及自动化路由
    【python面向对象实战练习】植物大战僵尸
  • 原文地址:https://www.cnblogs.com/HD/p/246515.html
Copyright © 2011-2022 走看看