Yazılım

Windows Formlara Sistem Menüsü Eklemek

Merhabalar;
Windows form uygulamalarında formun sol üst köşedeki iconuna tıkladığımız da veya üst barda sağ tuşla tıkladığımız da açılan sistem menüsüne nasıl yeni menü ekleyebiliriz bu yazımda bunu açıklamaya çalışacağım.

Burada anlattığımı projeyi Github adresinden indirerek üzerinde çalışmanızı öneririm.

Öncelikle Windows Form projesi başlatarak devam ediyoruz, oluşturduğumu projede SystemMenu isminde bir class oluşturuyoruz ve kodlarımız aşağıdaki gibi.

  internal sealed class SystemMenu : IMessageFilter
  {
    #region Externals

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool AppendMenu(IntPtr hMenu, int uFlags, int uIDNewItem, string lpNewItem);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    #endregion

    #region Constants

    private const int MF_SEPARATOR = 0x800;

    private const int MF_STRING = 0x0;

    private const int WM_SYSCOMMAND = 0x112;

    #endregion

    #region Fields

    private List<Action> _actions = new List<Action>();

    private int _lastId = 0;

    private Form _owner;

    #endregion

    #region Constructors

    /// <summary>
    /// Initialises a new instance of the <see cref="SystemMenu"/> class for the specified
    /// <see cref="Form"/>.
    /// </summary>
    /// <param name="owner">The window for which the system menu is expanded.</param>
    public SystemMenu(Form owner)
    {
      if (owner == null)
      {
        throw new ArgumentNullException(nameof(owner));
      }

      _owner = owner;

      owner.FormClosed += this.FormClosedHandler;

      Application.AddMessageFilter(this);
    }

    #endregion

    #region Methods

    /// <summary>
    /// Adds a command to the system menu.
    /// </summary>
    /// <param name="text">The displayed command text.</param>
    /// <param name="action">The action that is executed when the user clicks on the command.</param>
    /// <param name="separatorBeforeCommand">Indicates whether a separator is inserted before the command.</param>
    public void AddCommand(string text, Action action, bool separatorBeforeCommand)
    {
      IntPtr systemMenuHandle;
      int id;

      systemMenuHandle = GetSystemMenu(_owner.Handle, false);

      id = ++_lastId;

      if (separatorBeforeCommand)
      {
        AppendMenu(systemMenuHandle, MF_SEPARATOR, 0, string.Empty);
      }

      AppendMenu(systemMenuHandle, MF_STRING, id, text);

      _actions.Add(action);
    }

    private void FormClosedHandler(object sender, FormClosedEventArgs e)
    {
      Application.RemoveMessageFilter(this);

      _actions = null;

      _owner.FormClosed -= this.FormClosedHandler;
      _owner = null;
    }

    private bool OnSysCommandMessage(ref Message msg)
    {
      bool result;
      int commandId;

      commandId = msg.WParam.ToInt32();
      result = commandId > 0 && commandId <= _lastId;

      Debug.WriteLine("System menu command: " + commandId);

      if (result)
      {
        _actions[commandId - 1].Invoke();
      }

      return result;
    }

    #endregion

    #region IMessageFilter Interface

    bool IMessageFilter.PreFilterMessage(ref Message m)
    {
      bool result;

      //Debug.WriteLine(m);

      if (m.Msg == WM_SYSCOMMAND && m.HWnd == _owner.Handle)
      {
        result = this.OnSysCommandMessage(ref m);
      }
      else
      {
        result = false; // allow the message to continue being processed
      }

      return result;
    }

    #endregion
  }

Defaults…, Properties… ve About… olarak 3 menü ekledik, About menüsün atandığı yeni bir form daha ekliyoruz projemize.
AboutDialog.cs

private void InitializeComponent()
    {
            this.nameLabel = new System.Windows.Forms.Label();
            this.copyrightLabel = new System.Windows.Forms.Label();
            this.webLinkLabel = new System.Windows.Forms.LinkLabel();
            this.closeButton = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // nameLabel
            // 
            this.nameLabel.AutoSize = true;
            this.nameLabel.Location = new System.Drawing.Point(12, 9);
            this.nameLabel.Name = "nameLabel";
            this.nameLabel.Size = new System.Drawing.Size(47, 13);
            this.nameLabel.TabIndex = 0;
            this.nameLabel.Text = "TestApp";
            // 
            // copyrightLabel
            // 
            this.copyrightLabel.AutoSize = true;
            this.copyrightLabel.Location = new System.Drawing.Point(12, 22);
            this.copyrightLabel.Name = "copyrightLabel";
            this.copyrightLabel.Size = new System.Drawing.Size(72, 13);
            this.copyrightLabel.TabIndex = 1;
            this.copyrightLabel.Text = "Copyright@ali";
            // 
            // webLinkLabel
            // 
            this.webLinkLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
            this.webLinkLabel.AutoSize = true;
            this.webLinkLabel.Location = new System.Drawing.Point(12, 86);
            this.webLinkLabel.Name = "webLinkLabel";
            this.webLinkLabel.Size = new System.Drawing.Size(150, 13);
            this.webLinkLabel.TabIndex = 2;
            this.webLinkLabel.TabStop = true;
            this.webLinkLabel.Text = "http://www.yazilimliderleri.com";
            this.webLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.webLinkLabel_LinkClicked);
            // 
            // closeButton
            // 
            this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.closeButton.Location = new System.Drawing.Point(420, 81);
            this.closeButton.Name = "closeButton";
            this.closeButton.Size = new System.Drawing.Size(75, 23);
            this.closeButton.TabIndex = 3;
            this.closeButton.Text = "Close";
            this.closeButton.UseVisualStyleBackColor = true;
            this.closeButton.Click += new System.EventHandler(this.closeButton_Click);
            // 
            // AboutDialog
            // 
            this.AcceptButton = this.closeButton;
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CancelButton = this.closeButton;
            this.ClientSize = new System.Drawing.Size(507, 116);
            this.Controls.Add(this.closeButton);
            this.Controls.Add(this.webLinkLabel);
            this.Controls.Add(this.copyrightLabel);
            this.Controls.Add(this.nameLabel);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "AboutDialog";
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
            this.Text = "About";
            this.ResumeLayout(false);
            this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.Label nameLabel;
    private System.Windows.Forms.Label copyrightLabel;
    private System.Windows.Forms.LinkLabel webLinkLabel;
    private System.Windows.Forms.Button closeButton;
  }

MainForm içeriğimiz;

private void InitializeComponent()
    {
      this.label1 = new System.Windows.Forms.Label();
      this.SuspendLayout();
      // 
      // label1
      // 
      this.label1.AutoSize = true;
      this.label1.Location = new System.Drawing.Point(12, 9);
      this.label1.Name = "label1";
      this.label1.Size = new System.Drawing.Size(115, 13);
      this.label1.TabIndex = 0;
      this.label1.Text = "Open the system menu";
      // 
      // MainForm
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.ClientSize = new System.Drawing.Size(480, 124);
      this.Controls.Add(this.label1);
      this.Name = "MainForm";
      this.Text = "Form1";
      this.ResumeLayout(false);
      this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.Label label1;
  }

ve programımızı çalıştırdığımızda menülerimizin eklendiğini gördük.

About’a tıkladığımız da oluşturduğumuz formumuz da açıldı.

Projenin kaynak kodlarına Github adresimden ulaşabilirsiniz.

Ali UYSAL

IT alanında 16 sene önce donanım ile başlayan tecrübem, network ve sonrasında iş analizi, yazılım geliştirme ve proje yöneticiliği alanlarında devam etmiştir. Endüstriyel yazılımlar, sahadan veri toplama ve analizleri, otomatik etiketleme ve barkod sistemleri, otomatik tartım ve robotik konularında tecrübe sahibiyim. Sanayi 4.0 kapsamında imalat sanayinin dijital dönüşümünde çok fazla projenin hayata geçmesini sağladım.Open Source projelerle uzun süre ilgilendim, analiz ve implementasyonu konularında tecrübe edindim. Bunlar dışında hobi amacıyla başlasam da sonradan ürüne dönüşen, geliştirme kartları ile farklı çalışmalarım olmuştur.Raspberry Pi üzerinde yaptığım donanımsal ve yazılımsal işler ile çok farklı ürünler ortaya çıkartarak tecrübe edindim.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu