Tạo và quản lý các menu

Một phần của tài liệu Giáo trình Lập trình nâng cao (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề (Trang 106 - 113)

Trong C++ Builder cung cấp hai loại menu chủ lực: Menu Bar được cung cấp trong lớp TMainMenu; Menu ngữ cảnh được cung cấp trong TPopupMenu.

MainMenu tạo menu nằm dưới tiêu đề của Form như hình sau và được khoanh vùng đỏ như sau:

Hình 68- Minh hoạ về MainMenu

Poup Menu tạo menu ngữ cảnh, menu này sẽ xuất hiện khi người dùng nhấn chuột phải lên bề mặt đối tượng như hình sau và vùng được khoanh trịn là PopupMenu:

Hình 69- Minh hoạ về Popup Menu

Chúng ta có thể nhấn đơi chuột lên biểu tượng của TMainMenu hay TPopupMenu khi được thả ra trên Form để thực hiện soạn thảo Menu trong cửa sổ soạn thảo Menu:

Hình 70-Cửa sổ soạn thảo Menu

Mỗi một lệnh trong hệ thống menu sẽ có các thuộc tính đặc trưng sau:

Thuộc tính Ý nghĩa

AutoCheck Cho phép tự động đánh dấu hay khơng

Bitmap Tập tin Bitmap dùng làm hình ảnh góc trái của lệnh Caption Văn bản hiển thị trên lệnh

Checked Kiểm tra xem đối tượng có được đánh dấu hay khơng

Enabled Cho phép hay không cho phép mục chọn tương tác (hoạt động hay khơng)

GroupIndex Chỉ định gơm nhóm: Nếu các lệnh cùng một nhóm thì trong một thời điểm chỉ có một mục chọn được đánh dấu bằng Radio

Hint Văn bản nhắc nhở ngắn gọn

ImageIndex Chỉ số của hình ảnh được lưu trữ trong Image list gắn kết với menu thơng qua thuộc tính Images của MainMenu hay Popup Menu

RadioItem Cho phép hay không hiển thị lệnh ở dạng Radio ShortCut Phím tắt cho lệnh như Ctrl+ X, …

Tag Một số nguyên gắn kèm với lệnh Visible Có hiển thị ra hay khơng

Để viết mã lệnh cho một lệnh, chúng ta nhấn đơi vào nó hoặc gắn kết nó với một hành động thơng quan thuộc tính Action. Để gắn một Main Menu thành menu bar

của Form, chúng ta sử dụng thuộc tính Menu và để gắn một Popup Menu vào một đối tượng, chúng ta sử dụng thuộc tính PopupMenu của đối tượng.

Trước khi chuyển sang nghiên cứu các ví dụ, chúng ta phải nghiên cứu một khía cạnh chun sâu trong hệ thống Windows, đó là phím phím nóng và phím tắt.

Phím nóng là ký tự có ký tự “&” (khơng có nháy đơi) đứng trước cụm từ giá trị của thuộc tính Caption của đối tượng. Khi đó, để gọi sự kiện OnClick một cách nhanh chóng, người dùng chỉ cần nhấn tổ hợp phím Alt + Ký tự đã định nghĩa phím nóng. Chẳng hạn, chúng ta sử dụng giá trị “&Chấp nhận” (khơng có dấu nháy kép) cho thuộc tính Caption của một Button, khi đó người dùng chỉ cần nhấn tổ hợp phím Alt + C thì Button này sẽ gọi sự kiện OnClick.

Phím tắt là một tổ hợp phím được lưu giữ trong thuộc tính ShortCut của đối tượng. Nó giống như phím nóng nhưng khả năng của phím tắt lớn hơn khả năng của phím nóng chỉ thực hiện với tổ hợp Alt + Ký tự, phím tắt có khả năng lớn hơn, nó có khả năng tạo ra một tổ hợp phím phức tạp cho đối tượng.

Nhìn chung, phím tắt và phím nóng có sự phân biệt khơng rõ ràng trong cách lập trình với C++ Builder. Do đó, đơi khi chúng ta gọi lẫn hai cụm từ này cho nhau cũng có thể chấp nhận được.

Chúng ta đã từng thực hiện tạo và quản lý Menu với chương trình TextEditor ở trên, do đó, trong nội dung phần này, chúng ta sẽ nghiên cứu một vài ví dụ nâng cao về menu.

Ví dụ 1: Chương trình tạo Menu động trong lúc thực thi mã lệnh. Kết quả chương trình được minh hoạ trong hình sau:

Hình 71- Chương trình Runtime Menu Chúng ta thiết kế từng bước như sau:

Bước 1: Tạo Form, MainMenu và hai nút nhấn (btnAdd và btnRemove) như trong

Hình 72-Cửa sổ thiết kế chương trình Runtime Menu

Bước 2: Thêm phương thức ItemClick như mình và mã lệnh sau nhằm mục đích tạo

mã lệnh dùng chung cho các lệnh sẽ được tạo ra trong Menu mới:

Hình 73- Thêm phương thức ItemClick Mã lệnh được liệt kê như sau:

void __fastcall TForm1::ItemClick(TObject * Sender) {

//TODO: Add your source code here TMenuItem *s;

ShowMessage("Ban chon lenh : " + s->Caption); }

Bước 3: Viết mã lệnh cho sự kiện OnClick của nút btnadd nhằm thêm các lệnh vào

menu:

void __fastcall TForm1::btnaddClick(TObject *Sender) {

TMenuItem *Custom, *item; int position;

int i;

//kiểm tra xem menu cần thêm đã có chưa

Custom = this->MainMenu1->Items->Find("&Runtime Menu"); if (Custom!=NULL)

{

ShowMessage("Ban da them vao roi!"); //nếu tồn tại hiển thị thông báo và kết thúc return;

}

//tìm vị trí xuất hiện của menu File1

position = this->MainMenu1->Items->IndexOf(File1); Custom = new TMenuItem(this);

Custom->Caption ="&Runtime Menu"; Custom->AutoHotkeys = maManual; //chèn menu Custom sau vị trí menu File1.

this->MainMenu1->Items->Insert(position+1,Custom); //thêm 10 mục lệnh vào menu Custom

for (i=0;i<=10;i++) {

item = new TMenuItem(Custom);

item->Caption = "Muc chon " + IntToStr(i);

item->OnClick = this->ItemClick; //gắn với phương thức ItemClick Custom->Add(item);

} }

Bước 4: Viết mã lệnh cho sự kiện OnClick của nút btnremove như sau:

void __fastcall TForm1::btnremoveClick(TObject *Sender) {

Custom = this->MainMenu1->Items->Find("&Runtime Menu"); if (Custom==NULL)

{

ShowMessage("Khong ton tai menu can xoa"); return;

}

delete Custom; //giải phóng menu Custom khỏi bộ nhớ }

Bước 5: Viết mã lệnh cho lệnh File/Exit và Help/About như một số ví dụ ở trên. Bước 6: Nhấn phím F9 để chạy chương trình.

Trong chương trình ở ví dụ này, chúng ta đã biết được phương pháp tạo cũng như loại bỏ các lệnh trong menu một cách tự động bằng mã lệnh.

Tuy nhiên, trong ví dụ này, chúng ta mới xử lý với Menu do chúng ta tạo ra trong hệ thống quản lý của C++ Builder. Trong ví dụ tiếp theo chúng ta sẽ nghiên cứu phương pháp xử lý menu của hệ thống. Tức là menu hệ thống gắn sẵn cho chương trình, giờ chúng ta tiến hành thêm một vài lệnh trong menu này.

Ví dụ 2: Chương trình thao tác với menu hệ thống bằng cách thêm vào menu hệ

thống một lệnh About:

Hình 74-Chương trình SysMenu

Bước 1: Chúng định nghĩa một hằng số để nhận giá trị duy nhất do lệnh About sinh ra. Hằng số này tên CM_ABOUT được định nghĩa như sau trong tập tin .h:

#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Menus.hpp>

……

Bước 2: Tạo thêm phương thức để đáp ứng cho sự kiện nhấn chuột chọn lệnh trên menu hệ thống như sau:

Hình 75-Thêm phương thức xử lý sự kiện chọn Menu hệ thống Mã lệnh như sau:

void __fastcall TForm1::WMSYSCOMMANDS(TWMSysCommand & Msg) {

//TODO: Add your source code here if (Msg.CmdType == CM_ABOUT) ShowMessage("Chose About...."); else

this->DefaultHandler(&Msg); //gọi hàm xử lý sự kiện mặc định }

Bước 3: Viết mã lệnh cho sự kiện OnCreate của Form như sau: void __fastcall TForm1::FormCreate(TObject *Sender)

{

//thêm dòng phân cách

AppendMenu (GetSystemMenu (Handle, false), MF_SEPARATOR, 0,""); //thêm lệnh cho Menu

AppendMenu (GetSystemMenu (Handle, false), MF_STRING, CM_ABOUT,"&About...");

}

Một phần của tài liệu Giáo trình Lập trình nâng cao (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề (Trang 106 - 113)