Menampilkan Tooltip/Hint Text dari Menu Item di Status Bar

Posted in: Pemrograman |

This post is also available in: English

tooltip-in-statusbar

This post is also available in: English

Bila kita menggunakan Windows Explorer atau program lainnya, biasanya kita akan melihat teks petunjuk (hint) di status bar ketika kita pointer mouse menyorot di suatu item menu. Hal ini akan membantu usability dari suatu aplikasi dengan memberikan dukungan pengguna berupa petunjuk (hint).

Di C# untuk menampilkan teks tooltip/hint yang sudah kita set di tiap Menu Item tidak serta merta akan langsung tampil di Status Bar (di .NET kita kenal dengan Status Strip). Di Delphi dengan mudah menampilkan teks hint di status bar dengan memanfaatkan event Application.OnHint seperti berikut:

procedure TForm1.ShowHint(Sender: TObject);
begin
  StatusBar1.SimpleText:=Application.Hint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnHint:=ShowHint;
end;

Berhubung saya sendiri juga masih terbilang baru di C# WinForms dan belum mengetahui cara yang efisien dan lebih mudah supaya teks hint dapat ditampilkan di Status Strip, langkah-langkah yang saya gunakan adalah traverse/enumerate tiap item menu dan menugaskan event handler pada event MouseEnter dan MouseLeave apabila mempunyai tooltip text.

//constructor Form1
public Form1()
{
    InitializeComponent();
    InitializeMenuHint();
}

private void InitializeMenuHint()
{
    foreach (ToolStripMenuItem item in menuStrip1.Items)
    {
        TraverseMenuItemHint(item);
    }
}
private void MenuHint_Enter(object sender, EventArgs e)
{
    statusStrip1.Text = (sender as ToolStripMenuItem).ToolTipText;
    //bila membuat Status Label di Status Strip gunakan di bawah ini
    //toolStripStatusLabel1.Text = (sender as ToolStripMenuItem).ToolTipText;
}

private void MenuHint_Leave(object sender, EventArgs e)
{
    statusStrip1.Text = "";
    //bila membuat Status Label di Status Strip gunakan di bawah ini
    //toolStripStatusLabel1.Text = "";
}

private void TraverseMenuItemHint(ToolStripMenuItem element)
{
    for (int i = 0; i < element.DropDownItems.Count; i++)
    {
        if (!(element.DropDownItems[i] is ToolStripSeparator))
        {
            ToolStripMenuItem item = element.DropDownItems[i] as ToolStripMenuItem;
            if (item.ToolTipText != "")
            {
                item.MouseEnter += MenuHint_Enter;
                item.MouseLeave += MenuHint_Leave;
            }
            TraverseMenuItemHint(item);

        }
    }
}

UPDATE:
Cara di atas hanya berfungsi untuk menampilkan tooltip ketika mouse sedang menyorot menu item, ketika menggunakan keyboard tentunya tidak berfungsi. Oleh karena itu saya membuat cara lain yang lebih sederhana supaya dapat menampilkan tooltip text di status bar.

Langkah-langkah yang saya lakukan:

  1. Buat internal class turunan dari ToolStripMenuItem di dalam Form<nama_form> yang menggunakan ToolStripMenuItem
  2. Tambahkan event Hint yang akan dijalankan ketika menu item sedang dipilih
  3. Buat event handler Menu_Hint di Form
  4. Traverse/Enumerate ToolStripMenuItem, bila punya ToolTip Text assign event Hint dengan event handler Menu_Hint
  5. Ubah semua class System.Windows.Forms.ToolStripMenuItem di Form<nama_form>.designer.cs menjadi ToolStripmenuItem (dari internal class yang dibuat tadi).

Source code lengkapnya seperti berikut ini

public partial class FormMain : System.Windows.Forms.Form
{
    internal class ToolStripMenuItem : System.Windows.Forms.ToolStripMenuItem
    {
        public event EventHandler Hint;
        protected virtual void OnHint(EventArgs e)
        {
            if (Hint != null)
                Hint(this, e);
        }
        public override bool Selected
        {
            get
            {
                if (base.Selected == true)
                {
                    OnHint(new EventArgs());
                }
                return base.Selected;
            }
        }
    }
    public FormMain()
    {
        InitializeComponent();
        InitializeMenuHint();
    }
    private void InitializeMenuHint()
    {

        foreach (ToolStripMenuItem item in MainMenu.Items)
        {
            TraverseMenuItemHint(item);
        }
    }

    private void MenuHint_Hint(object sender, EventArgs e)
    {
        statusStrip1.Text = (sender as ToolStripMenuItem).ToolTipText;
        //bila membuat Status Label di Status Strip gunakan di bawah ini
        //toolStripStatusLabel1.Text = (sender as ToolStripMenuItem).ToolTipText;
    }

    private void TraverseMenuItemHint(ToolStripMenuItem element)
    {
        for (int i = 0; i < element.DropDownItems.Count; i++)
        {
            if (!(element.DropDownItems[i] is ToolStripSeparator))
            {
                ToolStripMenuItem item = element.DropDownItems[i] as ToolStripMenuItem;
                if (item.ToolTipText != "")
                {
                    item.Hint += MenuHint_Hint;
                }
                TraverseMenuItemHint(item);

            }
        }
    }
}



Speak Up!

Leave your own comment

Notify me of follow-up comments via e-mail (or subscribe here).




 

Share

Subscribe Feed

Email

Facebook

Twitter

Delicious

Digg

StumbleUpon

Google Buzz

Deviantart