Lập trình UD Desktop_09_ContextMenu NotifyIcon

Bài trước: Lập trình UD Desktop_08_ToolTip StatusBar
-----

2.18       ContextMenu


Tham khảo clip về ContextMenu


Context menu (trình đơn theo ngữ cảnh) là trình đơn hiện ra khi người dùng bấm chuột phải vào một đối tượng trên màn hình giao diện.

Trong cửa sổ thiết kết của Visual Studio, để tạo ra một context menu sử dụng control có tên là ContextMenuStrip.

Để hiển thị context menu, cần sử dụng phương thức show(), hoặc gắn vào một control, khi người dùng bấm chuột phải vào control, menu sẽ được hiển thị.

Ví dụ 1, để gắn context menu có tên là contextMenuStrip1 vào một textbox, trong cửa sổ Properties của textbox, chọn thuộc tính ContextMenuStrip, thiết lập giá trị là contextMenuStrip1.

Ví dụ 2, để tạo và hiển thị context menu khi người dùng bấm chuột phải vào textbox, mà không sử dụng cách gắn thuộc tính như ở Ví dụ 1, thì làm như sau,

public partial class Form1 : Form
    {
        ContextMenuStrip contextMenu2;
        public Form1()
        {
            InitializeComponent();
            contextMenu2 = new ContextMenuStrip();
            contextMenu2.Items.Add("Copy");
            contextMenu2.Items.Add("Paste");
        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(this.textBox2, new Point(0,0), ToolStripDropDownDirection.AboveRight);
            }
        }
    }

Để không hiển thị một cái context menu mặc định gồm rất nhiều các mục chọn khác, cần thiết lập thuộc tính ShortcutsEnabled của textBox2 là False.

Tuy nhiên, cách khai báo các mục trong context menu theo kiểu,

contextMenu2.Items.Add("Copy");
contextMenu2.Items.Add("Paste");

sẽ không viết hàm xử lý cho sự kiện “người dùng bấm chuột vào mục Copy hoặc Paste” được. Mà phải viết như sau:

contextMenu2 = new ContextMenuStrip();
            var itemCopy = new ToolStripButton() { Text = "Copy" };
            var itemPaste = new ToolStripButton() { Text = "Paste" };
            itemCopy.Click += itemCopy_Click;
            itemPaste.Click += itemPaste_Click;
            contextMenu2.Items.Add(itemCopy);
            contextMenu2.Items.Add(itemPaste);

void itemCopy_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Copying");
        }
        void itemPaste_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Pasting");
        }

Lab 15. Tạo context menu cho chương trình File Explorer

Quan sát các chức năng View, Copy và Paste của chương trình File Explorer. Làm ba chức năng này cho chương trình giả lập File Explorer (tối thiểu phải làm được hết các chức năng cho View). Gồm các công việc sau:

– Phân tích và mô tả yêu cầu (viết vào tập tin ghi chép môn học)

– Viết tài liệu quá trình thực hiện (viết vào tập tin ghi chép môn học)

– Lập trình, chạy thử

– Viết tài liệu hướng dẫn sử dụng (viết vào tập tin ghi chép môn học)

[Gợi ý, xem đoạn mã này rồi tìm cách nhúng vào trong dự án File Explorer]

public partial class Form1 : Form
    {
        ContextMenuStrip contextMenu2;
        public Form1()
        {
            InitializeComponent();
            contextMenu2 = new ContextMenuStrip();
            ToolStripMenuItem itemView = new ToolStripMenuItem() { Text = "View" };
            ToolStripMenuItem itemLargeIcons = new ToolStripMenuItem() { Text = "LargeIcons" };
            itemView.DropDownItems.Add(itemLargeIcons);
            itemLargeIcons.Click += itemLargeIcons_Click;
            contextMenu2.Items.Add(itemView);
        }
        void itemLargeIcons_Click(object sender, EventArgs e)
        {
            MessageBox.Show("LargeIcon");

        }
        private void textBox2_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(this.textBox2, new Point(0, 0), ToolStripDropDownDirection.AboveRight);
            }
        }
    }

Có thể thiết lập vị trí hiển thị context menu ngay tại vị trí của con trỏ chuột:

private void lvExplorer_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(MousePosition);
            }
        }

[Màn hình kết quả]


<///// hết buổi 11

2.19       NotifyIcon




NotifyIcon được sử dụng để ẩn chương trình đang chạy xuống dưới khay hệ thống (system tray), dưới dạng một biểu tượng, người dùng có thể tương tác với chương trình thông qua biểu tượng này.

Hai yêu cầu cần nắm được:

– Gửi được dữ liệu từ form xuống icon (trong system tray)

– Gửi ngược dữ liệu từ icon (trong system tray) lên form

Lab 16. Xử lý NotifyIcon cho chương trình File Explorer

[Mô tả yêu cầu]

– Thêm mục “Ẩn chương trình” trên thanh menu (mục này nằm bên phải mục View)

– Khi người dùng bấm vào mục “Ẩn chương trình” thì ẩn cửa sổ chương trình File Explorer trên màn hình máy tính, đồng thời hiển thị một icon ở System tray và hiển thị một câu thông báo với nội dung “Chương trình File Explorer đang chạy ngầm”

– Khi người dùng bấm chuột trái vào icon của File Explorer ở System tray thì hiển thị cửa sổ chương trình File Explorer trên màn hình máy tính

– Khi người dùng bấm chuột phải vào icon của File Explorer ở System tray thì hiển thị context menu, trong context menu gồm các chế độ view khác nhau (LargeIcon, SmallIcon, Details, Tile, List). Nếu người dùng chọn một chế độ xem bất kì thì thay đổi chế độ xem của File Explorer.

[Đoạn mã tham khảo]

private void anChuongTrinhToolStripMenuItem_Click(object sender, EventArgs e)
        {
            notifyIcon1.Visible = true;
            this.Hide();
            notifyIcon1.ShowBalloonTip(5000, "Thông báo", "Chương trình File Explorer đang chạy ngầm", ToolTipIcon.Info);
        }

        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left)
            {
                notifyIcon1.Visible = false;
                WindowState = FormWindowState.Normal;
                this.Show();
            }
            if (e.Button == MouseButtons.Right)
            {
                contextMenu2.Show(MousePosition);
            }

        }

[xem hình minh họa]


-----