This post is also available in: English

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:
- Buat internal class turunan dari
ToolStripMenuItem
di dalamForm<nama_form>
yang menggunakan ToolStripMenuItem - Tambahkan event
Hint
yang akan dijalankan ketika menu item sedang dipilih - Buat event handler
Menu_Hint
di Form - Traverse/Enumerate ToolStripMenuItem, bila punya ToolTip Text assign event Hint dengan event handler Menu_Hint
- Ubah semua class
System.Windows.Forms.ToolStripMenuItem
diForm<nama_form>.designer.cs
menjadiToolStripmenuItem
(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); } } } }