Giáo trình Phát triển AutoCAD bằng ActiveX & VBA - Chương 6: Tùy biến thanh công cụ và trình đơn

Trong chương này 6

ƒ Tìm hiểu tập đối tượng

MenuBar và MenuGroups

ƒ Tải các nhóm trình đơn

ƒ Thay đổi thanh trình đơn

ƒ Tạo và hiệu chỉnh trình

đơn kéo xuống và trình

đơn tắt

ƒ Tạo và hiệu chỉnh thanh

công cụ

ƒ Tạo Macro

ƒ Tạo dòng trạng thái trợ

giúp cho các mục trong

trình đơn và nút trên

thanh công cụ

pdf 27 trang phuongnguyen 3400
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Phát triển AutoCAD bằng ActiveX & VBA - Chương 6: Tùy biến thanh công cụ và trình đơn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Phát triển AutoCAD bằng ActiveX & VBA - Chương 6: Tùy biến thanh công cụ và trình đơn

Giáo trình Phát triển AutoCAD bằng ActiveX & VBA - Chương 6: Tùy biến thanh công cụ và trình đơn
 Phát triển ứng dụng ActiveX và VBA | 175 
TÙY BIẾN THANH CÔNG CỤ 
VÀ TRÌNH ĐƠN 
6
Trong chương này
ƒ Tìm hiểu tập đối tượng 
MenuBar và MenuGroups 
ƒ Tải các nhóm trình đơn 
ƒ Thay đổi thanh trình đơn 
ƒ Tạo và hiệu chỉnh trình 
đơn kéo xuống và trình 
đơn tắt 
ƒ Tạo và hiệu chỉnh thanh 
công cụ 
ƒ Tạo Macro 
ƒ Tạo dòng trạng thái trợ 
giúp cho các mục trong 
trình đơn và nút trên 
thanh công cụ 
ƒ Thêm mục vào trình đơn 
tắt 
AutoCAD ActiveX Automation cung cấp quyền 
kiểm soát trong việc điều chỉnh các trình đơn và các 
thanh công cụ trong phiên làm việc hiện hành của 
AutoCAD. 
Sử dụng AutoCAD ActiveX/VBA, ta có thể hiệu 
chỉnh hoặc thêm các chi tiết hoặc thậm chí thay đổi 
hoàn toàn cấu trúc trình đơn hiện tại. Ta cũng có thể 
điều khiển các thanh công cụ và các trình đơn của 
nút chuột phải. 
Việc tùy biến các trình đơn giúp nâng cao hiệu quả 
công việc bằng cách hiện rõ các nhiệm vụ cụ thể của 
ứng dụng hoặc bằng cách rút gọn những thao tác với 
nhiều bước khác nhau vào trong một mục trình đơn. 
 176 | Chương 6: Tùy biến thanh công cụ và trình đơn 
1. Tìm hiểu tập đối tượng MenuBar và 
MenuGroups 
AutoCAD ActiveX cung cấp một số đối tượng dạng trình đơn. Trong đó, quan trọng 
nhất là tập đối tượng MenuBar (thanh trình đơn) và MenuGroups (các nhóm trình 
đơn). Tập đối tượng MenuBar bao gồm tất cả các trình đơn hiển thị trên thanh trình 
đơn của AutoCAD. 
MenuGroups bao gồm các nhóm trình đơn được tải trong phiên làm việc hiện hành 
của AutoCAD. Các nhóm trình đơn này bao hàm tất cả các trình đơn hiện có trong 
phiên làm việc của AutoCAD, và một vài trong số đó hoặc tất cả có thể được hiển 
thị ở thanh trình đơn của AutoCAD. Bên cạnh các trình đơn, các nhóm trình đơn 
cũng bao hàm tất cả các thanh công cụ có trong phiên làm việc hiện hành của 
AutoCAD. 
 Phát triển AutoCAD bằng ActiveX và VBA | 177 
1.1. Khám phá tập đối tượng MenuGroups 
Tập đối tượng MenuGroups bao gồm các nhóm trình đơn được tải lên trong phiên 
làm việc hiện hành của AutoCAD. Mỗi nhóm trình đơn bao gồm một tập đối tượng 
PopupMenus và một tập đối tượng Toolbars. Tập đối tượng PopupMenus gồm tất 
cả những trình đơn bên trong nhóm trình đơn đó. Tương tự, tập đối tượng Toolbars 
gồm tất cả các thanh công cụ bên trong nhóm trình đơn. 
Thực tế, mỗi PopupMenu là một tập đối tượng bao hàm một đối tượng cá biệt dành 
cho một mục trong trình đơn. Và cũng tương tự, mỗi thanh công cụ là một tập đối 
tượng chứa các đối tượng tương ứng với một mục trên thanh công cụ. 
2. Tải các nhóm trình đơn 
Các nhóm trình đơn được tải vào trong AutoCAD bằng phương thức Load. Khi sử 
dụng phương thức Load, gán tham số BaseMenu bằng True để tải một nhóm trình 
đơn mới vào thanh trình đơn. Thao tác này sẽ tải một nhóm trình đơn như là trình 
đơn cơ sở giống như khi sử dụng lệnh MENU trong AutoCAD. 
Để tải một nhóm trình đơn mới làm trình đơn cục bộ1, ta bỏ đi tham số BaseMenu. 
Thao tác này sẽ tải một nhóm trình đơn giống lệnh MENULOAD trong AutoCAD. 
Một khi đã được tải vào tập đối tượng MenuGroups, ta có thể chèn các trình đơn 
cục bộ vào thanh trình đơn bằng cách sử dụng phương thức InsertMenuInMenuBar 
hoặc InsertInMenuBar. 
1 Trình đơn cục bộ (Partial menu): là loại trình đơn được tải sau khi trình đơn chính của AutoCAD 
được nạp vào. Trình đơn cục bộ có thể được tải và gỡ bỏ bất cứ khi nào trong một phiên làm việc 
của AutoCAD. 
 178 | Chương 6: Tùy biến thanh công cụ và trình đơn 
Khi đã tải xong một nhóm trình đơn, tất cả các trình đơn và thanh công cụ được 
định nghĩa trong nhóm trình đơn đó đều có thể đem ra sử dụng. Ta có thế: 
ƒ Thêm trình đơn mới lên thanh trình đơn 
ƒ Gỡ bỏ những trình đơn đã có ra khỏi thanh trình đơn 
ƒ Xắp sếp lại các trình đơn trên thanh trình đơn 
ƒ Thêm mục mới vào một trình đơn hoặc thanh công cụ sẵn có 
ƒ Gỡ bỏ một mục đã có ra khỏi một trình đơn hoặc thanh công cụ 
ƒ Tạo mới trình đơn và thanh công cụ 
ƒ Tạo thanh công cụ dạng nổi hoặc dạng cố định1 
ƒ Kích hoạt hoặc vô hiệu hóa một mục trong trình đơn và thanh công cụ. 
ƒ Chọn hoặc bỏ chọn một mục trong trình đơn 
ƒ Thay đổi chuỗi chứa thẻ, nhãn và trợ giúp của mục trên trình đơn hoặc thanh 
công cụ 
ƒ Gán lại Macro ứng với một mục trong trình đơn hay thanh công cụ. 
Tải một nhóm trình đơn 
Sau đây là một ví dụ tải một tệp trình đơn có tên acad.mnc 
ThisDrawing.Application.MenuGroups.Load "acad.mnc" 
CHÚ Ý Không thể hiệu chỉnh hình ảnh của các mục trong trình đơn bằng ActiveX 
Automation. Tuy nhiên, ta vẫn có thể tải hoặc gỡ bỏ các trình đơn này bằng ActiveX 
Automation. Để biết thêm chi tiết về các dạng trình đơn, xem chương 4, “Tùy biến Menu” 
trong tài liệu “AutoCAD Customization Guide”. 
2.1. Tạo nhóm trình đơn mới 
Chương trình AutoCAD ActiveX không cho phép lập trình tạo một nhóm trình đơn 
mới. Tuy vậy, ta có thể tải một nhóm trình đơn có sẵn rồi lưu nó ra ngoài với một 
cái tên mới vào một tệp trình đơn mới. Sau đó, ta có thể hiệu chỉnh nhóm trình đơn 
để có thể bao hàm những chức năng mà mình mong muốn. Quá trình tạo những 
nhóm trình đơn mới dựa trên những trình đơn có sẵn có ưu điểm là tự động cung 
cấp những trình đơn cơ bản như File, Window và Help. 
Lưu một nhóm trình đơn vào một tệp mới 
Dưới đây là ví dụ minh họa việc lưu nhóm trình đơn đầu tiên trong tập đối tượng 
nhóm trình đơn vào một tệp có tên MyMenu.mnc 
ThisDrawing.Application.MenuGroups.Item(0). _ 
SaveAs "MyMenu.mnc", acMenuFileCompiled 
1 Khi di chuyển thanh công cụ đến mép của một cử sổ nào đó, thanh công cụ sẽ gắn theo đường mép 
và trở thành một phần của của sổ đó. 
 Phát triển AutoCAD bằng ActiveX và VBA | 179 
3. Thay đổi thanh trình đơn 
Như chúng ta đã thấy, thanh trình đơn có thể được thay đổi hoàn toàn bằng một 
nhóm trình đơn mới nếu nhóm trình đơn đó được tải dưới dạng một trình đơn cơ sở. 
Bên cạnh đó, ta cũng có thể thêm, bớt hoặc xắp sếp lại các trình đơn riêng lẻ trên 
thanh trình đơn. 
3.1. Chèn một mục vào thanh trình đơn 
Để chèn một trình đơn có sẵn vào thanh trình đơn, ta sử dụng phương thức 
InsertMenuInMenuBar hoặc InsertInMenuBar. Cả hai phương thức này đều có cùng 
một tác dụng là chèn một trình đơn có sẵn lên thanh trình đơn. 
Sự khác nhau giữa hai phương thức trên là ở đối tượng thực hiện gọi phương thức 
đó. Phương thức InsertMenuInMenuBar được gọi từ tập đối tượng PopupMenu. Sử 
dụng phương thức này, ta có thể chèn bất cứ trình đơn nào từ tập đối tượng vào một 
vị trí cụ thể trên thanh trình đơn. Phương thức này yêu cầu các thông số đầu vào là 
tên của trình đơn được chèn vào và vị trí trên thanh trình đơn để chèn vào. 
Phương thức InsertMenuBar thì được gọi trực tiếp từ đối tượng PopupMenu, là đối 
tượng sẽ được chèn vào thanh trình đơn. Phương thức này chỉ yêu cầu một tham số 
đầu vào là vị trí trên thanh trình đơn. Ta không cần phải nhập tên của trình đơn vì ta 
đang gọi phương thức một cách trực tiếp từ trình đơn sẽ được chèn. 
Ta nên sử dụng phương thức nào thuận tiện hơn trong ứng dụng của mình. 
Chèn một trình đơn lên thanh trình đơn 
Ví dụ sau tạo một trình đơn mới có tên là TestMenu và chèn một mục vào nó. Mục 
này sẽ được gán lệnh OPEN. Sau khi hoàn thành, trình đơn sẽ hiện lên trên thanh 
trình đơn. 
Sub Ch6_InsertMenu() 
‘ Định nghĩa biến cho nhóm trình đơn hiện tại 
Dim currMenuGroup As AcadMenuGroup 
Set currMenuGroup = ThisDrawing.Application. _ 
MenuGroups.Item(0) 
‘ Tạo một trình đơn mới 
Dim newMenu As AcadPopupMenu 
Set newMenu = currMenuGroup.Menus.Add("TestMenu") 
‘ Khai báo biến cho mục trình đơn 
Dim newMenuItem As AcadPopupMenuItem 
Dim openMacro As String 
‘ Gán lệnh "ESC ESC _open " và tạo mục trình đơn 
openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) 
Set newMenuItem = newMenu.AddMenuItem(newMenu.Count + 1, _ 
"Open", openMacro) 
‘ Hiển thị trình đơn trên thanh trình đơn 
currMenuGroup.Menus.InsertMenuInMenuBar "TestMenu", "" 
End Sub 
 180 | Chương 6: Tùy biến thanh công cụ và trình đơn 
3.2. Gỡ bỏ một mục ra khỏi thanh trình đơn 
Để gỡ bỏ một trình đơn ra khỏi thanh trình đơn, ta sử dụng phương thức 
RemoveMenuFromMenuBar hoặc RemoveFromMenuBar. Cả hai phương thức trên 
đều có cùng một mục đích là gỡ đi một mục từ thanh trình đơn. 
Hai phương thức trên khác nhau ở đối tượng mà phương thức đó được gọi. Phương 
thức RemoveMenuFromMenuBar được gọi từ tập đối tượng PopupMenu. Phương 
thức này yêu cầu tham số đầu vào là tên của mục trình đơn và vị trí tương ứng trên 
thanh trình đơn. 
Phương thức RemoveFromMenuBar được gọi trực tiếp từ đối tượng PopupMenu 
mà ta cần gỡ bỏ. Sử dụng phương thức này ta không cần nhập bất cứ thông tin nào. 
Tên của trình đơn là không cần thiết vì ta đang gọi phương thức trực tiếp từ đối 
tượng mà ta cần gỡ bỏ. 
Ta nên sử dụng phương thức nào thuận tiện hơn cho ứng dụng của mình. 
Gỡ bỏ một mục ra khỏi thanh trình đơn 
Sau đây là ví dụ gỡ bỏ mục trình đơn đã chèn trong ví dụ trước. 
‘ Gỡ bỏ trình đơn từ thanh trình đơn 
currMenuGroup.Menus.RemoveMenuFromMenuBar ("TestMenu") 
CHÚ Ý Mục trình đơn đã gỡ bỏ khỏi thanh trình đơn vẫn còn có hiệu lực trong nhóm trình 
đơn. Việc gỡ bỏ chỉ đơn giản là làm cho người sử dụng không thể nhìn thấy được mục trình 
đơn đó. 
3.3. Sắp xếp lại các mục đơn trên thanh trình đơn 
Để sắp xếp lại các mục trình đơn, ta tiến hành chèn và gỡ bỏ các mục trình đơn cho 
đến khi có được trật tự mà mình mong muốn. 
Chuyển trình đơn đầu xuống cuối thanh trình đơn 
Ví dụ sau sẽ xóa mục đầu tiên trong thanh trình đơn, sau đó chèn nó vào vị trí cuối 
cùng trên thanh trình đơn. 
Sub Ch6_MoveMenu() 
‘ Định nghĩa biến để lưu mục trình đơn cần di chuyển 
Dim moveMenu As AcadPopupMenu 
Dim MyMenuBar As AcadMenuBar 
Set MyMenuBar = ThisDrawing.Application.menuBar 
‘ Đặt biến moveMenu bằng mục trình đơn đầu tiên được hiển thị 
trong trình đơn trên thanh trình đơn 
Set moveMenu = MyMenuBar.Item(0) 
‘ Dỡ bỏ mục đầu tiên trong thanh trình đơn 
MyMenuBar.Item(0).RemoveFromMenuBar 
‘ Thêm trình đơn trở lại thanh trình đơn vào vị trí lúc trước 
moveMenu.InsertInMenuBar (MyMenuBar.count) 
End Sub 
 Phát triển AutoCAD bằng ActiveX và VBA | 181 
4. Tạo và hiệu chỉnh trình đơn kéo xuống và trình 
đơn tắt 
AutoCAD ActiveX/VBA có khả năng hiệu chỉnh hai loại trình đơn AutoCAD: trình 
đơn kéo xuống1 và trình đơn tắt (shortcut menu). Cả hai loại trình đơn này đều được 
hiển thị dưới dạng xếp lớp. Trình đơn tắt cho phép truy cập nhanh chóng đến các 
mục trình đơn được sử dụng nhiều nhất, chẳng hạn như chế độ bắt đối tượng. 
Một trình đơn kéo xuống có thể chứa đến 999 mục, còn trình đơn tắt có thể chứa tối 
đa 499 mục. Các giới hạn trên đều tính bao gồm cả các trình đơn có trong cấu trúc 
nhiều tầng. Nếu số mục trong một trình đơn vượt quá các giới hạn này, AutoCAD 
sẽ bỏ qua các mục đã vượt quá. Nếu một trình đơn kéo xuống hay trình đơn tắt có 
chiều cao lớn hơn khoảng không cho phép trên màn hình thì nó sẽ được rút gọn cho 
vừa vặn. 
Các trình đơn kéo xuống luôn được kéo xuống từ thanh trình đơn, còn các trình đơn 
tắt thì luôn hiện tại ví trí hoặc gần vị trí con trỏ chuột trên màn hình đồ họa. Cách sử 
dụng hai loại trình đơn này giống nhau ngoại trừ một điểm là tên của trình đơn tắt 
không nằm trên thanh trình đơn và thực tế là tên của nó chẳng được hiển thị ở đâu 
cả. Muốn truy cập vào trình đơn tắt, ta phải thông qua một trình đơn trong nhóm 
trình đơn cơ sở. Ta xác lập trình đơn tắt bằng cách sử dụng thuộc tính 
ShortcutMenu. Nếu thuộc tính ShortcutMenu trả về giá trị TRUE, thì trình đơn đó 
sẽ trở thành trình đơn tắt. 
4.1. Tạo trình đơn mới 
Để tạo một trình đơn mới, sử dụng phương thức Add để thêm một đối tượng 
PopupMenu mới vào tập đối tượng PopupMenu. 
Để tạo một trình đơn tắt mới, ta phải xoá trình đơn tắt hiện có. Chỉ có thể có một 
trình đơn tắt duy nhất cho mỗi nhóm trình đơn. Nếu không có trình đơn tắt nào khác 
trong một nhóm trình đơn, ta có thể thêm một trình đơn với tên “POP0”. Thao tác 
này sẽ thông báo cho AutoCAD biết là mình muốn tạo một trình đơn tắt. 
Khi dùng phương thức Add, ta cần phải nhập tên (nhãn) của trình đơn cần thêm. 
Tên này sẽ trở thành tiêu đề cho trình đơn khi được tải lên thanh trình đơn. Tên 
trình đơn cũng là phương tiện để xác định trình đơn trong nhóm một cách dễ dàng 
nhất. 
Tên trình đơn có thể là một chuỗi ký tự đơn hoặc có thể chứa những mã đặc biệt. 
Để biết danh sách đầy đủ của các mã đặc biệt, xem “Tóm tắt về cú pháp tên trình 
đơn kéo xuống và trình đơn tắt” ở trang 99 trong tài liệu “AutoCAD Customization 
Guide”. 
1 Trình đơn kéo xuống (Pull-down menu): là loại trình đơn được kéo xuống từ thanh trình đơn và 
sẽ được giữ nguyên chừng nào người dùng còn giữ chuột trên trình đơn đó. Trình đơn này khác với 
loại trình đơn thả xuống (drop-down menu) là loại trình đơn được thả xuống từ thanh trình đơn khi 
có yêu cầu và sẽ giữ nguyên cho đến khi người dùng đóng trình đơn hoặc lựa chọn mục trình đơn 
khác. 
 182 | Chương 6: Tùy biến thanh công cụ và trình đơn 
Ta có thể thay đổi tên của trình đơn khi đã được tạo ra. Để thay đổi tên của một 
trình đơn đã tồn tại, ta sử dụng thuộc tính Name của trình đơn đó. 
Tạo PopupMenu 
Ví dụ sau tạo một popup menu mới có tên là “TestMenu” trong nhóm trình đơn đầu 
tiên của tập đối tượng nhóm trình đơn. 
Sub Ch6_CreateMenu() 
Dim currMenuGroup As AcadMenuGroup 
Set currMenuGroup = 
ThisDrawing.Application.MenuGroups.Item(0) 
‘ Tạo trình đơn mới 
Dim newMenu As AcadPopupMenu 
Set newMenu = currMenuGroup.Menus.Add("TestMenu") 
End Sub 
4.2. Thêm mục mới vào một trình đơn 
Để thêm một mục mới vào một trình đơn, ta sử dụng phương thức AddMenuItem. 
Phương thức này tạo một mục PopupMenu và thêm nó vào trình đơn đã chỉ định. 
Phương thức AddMenuItem cần nhập bốn tham số sau: Index(), Label(), Tag() 
và Macro() 
4.2.1. Chỉ số (Index) 
Tham số Index là một số nguyên xác định vị trí của mục mới bên trong một trình 
đơn. Chỉ số này bắt đầu với vị trí không (0), là vị trí đầu tiên trên trình đơn sau tiêu 
đề. Để thêm một mục vào cuối trình đơn, ta gán tham số Index bằng giá trị của 
thuộc tính Count của trình đơn đó. (Thuộc tính Count của trình đơn chỉ tổng số 
mục có trên trình đơn đó.) 
tên trình đơn
Trên hình này, ta có thể thấy chỉ số của vị trí đầu tiên là 0, và các vạch ngăn cách 
cũng được tính như một mục của trình đơn với chỉ số của riêng mình (index 4). Đặc 
tính Count của trình đơn trên là 6. Để thêm một mục vào giữa hai mục Tile 
Horizonally và Tile Vertically, ta đặt Tham biến Index là 2, nghĩa là chỉ số 
của mục Tile Vertically. Thao tác này sẽ chèn mục mới vào vị trí chỉ số 2 và 
đẩy toàn bộ các mục còn lại xuống một chỉ số. 
Khi đã tạo xong một mục mới, ta không thể thay đổi chỉ số của mục đó bằng thuộc 
tính Index. Để làm việc này, ta phải xóa đi rồi thêm trở lại mục trình đơn theo vị trí 
mong muốn hoặc xoá các trình đơn xung quanh cho đến khi mục trình đơn đó có vị 
trí như mong muốn. 
 Phát triển AutoCAD bằng ActiveX và VBA | 183 
4.2.2. Nhãn (Label) 
Nhãn là một chuỗi ký tự xác định nội dung và định dạng của các mục trình đơn. 
Nhãn của mục trình đơn có thể ... chuỗi các lệnh nhằm thực hiện một tác vụ cụ thể nào đó khi ta chọn 
một nút. Macro có thể đơn giản chỉ là một số thao tác bàn phím được lưu lại để thực 
hiện một nhiệm vụ hoặc cũng có thể là một sự kết hợp phức tạp các lệnh, 
 Phát triển AutoCAD bằng ActiveX và VBA | 195 
AutoLISP, DIESEL hoặc mã chương trình ActiveX. Để biết thêm chi tiết về Macro, 
xem “Macro trình đơn” trong “AutoCAD Customization Guide” . 
Ta có thể đọc hoặc gán giá trị của Macro thông qua thuộc tính Macro. 
5.8.4. HelpString 
HelpString (chuỗi trợ giúp) là một dòng chữ hiện lên trên thanh trạng thái của 
AutoCAD khi người dùng chỉ vào một nút. 
Ta có thể đọc hoặc gán giá trị của chuỗi trợ giúp bằng cách sử dụng thuộc tính 
HelpString. 
5.8.5. Index 
Index (chỉ số) của một nút xác định vị trí của nút đó trên thanh công cụ. Chỉ số vị trí 
của thanh công cụ luôn bắt đầu với vị trí 0. Chẳng hạn, nếu mục công cụ là mục đầu 
tiên trên công cụ, nó có chỉ số vị trí là 0, nếu là mục thứ hai thì chỉ số vị trí là 1, 
v.v.. 
Ta có thể đọc chỉ số vị trí của một mục công cụ thông qua thuộc tính Index. 
5.8.6. Type 
Một nút có thể nằm trong những loại sau: nút thông thường, vạch ngăn, nút flyout 
hoặc nút điều khiển đặc biệt. Nếu là một nút thông thường, thuộc tính này có giá trị 
là acButton. Nếu là một vạch ngăn, thuộc tính có giá trị là 
acToolButtonSeparator. Nếu là một nút Flyout, thuộc tính có giá trị là 
acFlyout. Còn nếu là một nút điều khiển đặc biệt, thuộc tính có giá trị là 
acControl. 
Ta có thể biết được loại của một nút công cụ thông qua thuộc tính Type. 
5.8.7. Flyout 
Nếu nút thuộc kiểu acFlyout, thuộc tính Flyout sẽ trả về thanh công cụ được sử 
dụng làm thanh công cụ Flyout. Thanh cộng cụ Flyout là đối tượng Toolbar. 
Nếu nút không có kiểu acFlyout, thuộc tính Flyout sẽ trả về giá trị NULL. 
Ta có thể lấy giá trị thanh công cụ Flyout thông qua thuộc tính Flyout. 
5.8.8. Parent 
Thuộc tính này trả về thanh công cụ chứa nút đang xét. Thanh công cụ gốc cũng là 
một đối tượng Toolbar. 
Ta có thể lấy đối tượng thanh công cụ chứa một nút bằng cách sử dụng thuộc tính 
Parent của nút công cụ đó. 
5.8.9. Các thuộc tính khác 
Còn có các thuộc tính khác áp dụng đối với tất cả các thanh công cụ như: xem thanh 
công cụ đó đang ở dạng nổi hay neo, hiện hay ẩn và sử dụng nút cỡ to hay hay cỡ 
nhỏ. 
 196 | Chương 6: Tùy biến thanh công cụ và trình đơn 
6. Tạo Macro 
Macro là một chuỗi các lệnh nhằm thực hiện một tác vụ cụ thể nào đó khi ta chọn 
một nút. Macro có thể đơn giản là một số thao tác bàn phím được lưu lại để thực 
hiện một nhiệm vụ hoặc có thể là một sự kết hợp phức tạp các lệnh, AutoLISP, 
DIESEL hoặc mã chương trình ActiveX. 
Nếu muốn gộp các tham số của một lệnh vào Macro của trình đơn, ta cần phải biết 
thứ tự các tham số của lệnh đó. Mỗi ký tự trong Macro của trình đơn đều có ý 
nghĩa, thậm chí cả dấu cách. Khi AutoCAD được chỉnh sửa và phát triển, trình tự 
một số lệnh (đôi khi cả tên lệnh) có thể bị thay đổi. Do đó, trình đơn tùy biến có thể 
cần phải có một vài thay đổi nhỏ khi nâng cấp lên phiên bản AutoCAD mới. 
Khi đầu vào của lệnh là từ một mục trình đơn, thì ta thiết lập các biến hệ thống 
PICKADD và PICKAUTO có giá trị lần lượt là 1 và 0. Điều này đảm bảo khả năng 
tương thích với các phiên bản AutoCAD trước và việc tùy biến cũng sẽ dễ dàng hơn 
bởi vì ta không cần phải kiểm tra cài đặt của các biến số này. 
6.1. Ký tự Macro và ký tự ASCII tương đương 
Dưới đây là bảng tóm tắt một số các ký tự đặc biệt được sử dụng trong Macro trình 
đơn và các ký tự ASCII tương đương khi sử dụng trong VB và VBA. Việc sử dụng 
các ký tự ASCII tương đương với các ký tự này là rất quan trọng khi ta tạo một 
chuỗi cho thuộc tính Macro. 
Các ký tự đặc biệt sử dụng trong macro trình đơn và macro công cụ 
Ký tự ASCII tương đương Miêu tả 
; chr(59) phím ENTER 
^M chr(94) + chr(77) phím ENTER 
^| chr(94) + chr(124) phím TAB 
SPACEBAR chr(32) 
nhập vào một dấu cách; khoảng trắng 
giữa các lệnh trong một mục trình đơn 
tương đương với nhấn phím SPACEBAR 
\ chr(92) dừng để người dùng nhập liệu 
_ chr(95) Thông dịch lệnh AutoCAD và các từ khoá tiếp theo 
+ chr(43) nối macro trình đơn với dòng tiếp theo (nếu là ký tự cuối) 
=* chr(61) + chr(42) Hiển thị hình ảnh, trình đơn kéo xuống hoặc trình đơn tắt trên cùng hiện hành 
 Phát triển AutoCAD bằng ActiveX và VBA | 197 
*^C^C 
chr(42) + 
chr(94) + chr(67) 
chr(94) + chr(67) 
Tiền tố cho một mục được lặp đi lặp lại 
$ chr(36) Tải một phần trình đơn hoặc bắt đầu một chuỗi DIESEL macro có điều kiện 
^B chr(94) + chr(66) Bật hoặc tắt Snap (Ctrl+B) 
^C chr(94) + chr(67) Hủy lệnh (Ctrl+C) 
ESC chr(3) Hủy lệnh (ESC) 
^D chr(94) + chr(68) Bật hoặc tắt Coords (Ctrl+D) 
^E chr(94) + chr(69) Tạo một mặt phẳng đồng dạng tiếp theo (Ctrl+E) 
^G chr(94) + chr(71) Bật hoặc tắt Grid (Ctrl+G) 
^H chr(94) + chr(72) phím backspace 
^O chr(94) + chr(79) Bật hoặc tắt Ortho (Ctrl+O) 
^P chr(94) + chr(80) Bật hoặc tắt MENUECHO 
^Q chr(94) + chr(81) Hồi lại tất cả các dòng nhắc, danh sách trạng thái và đầu vào máy in (Ctrl+Q) 
^T chr(94) + chr(84) Bật hoặc tắt Tablet (Ctrl+T) 
^V chr(94) + chr(86) Thay đổi khung nhìn hiện tại (Ctrl+V) 
^Z chr(94) + chr(90) 
Ký tự trắng nhằm ngăn chặn việc thêm 
SPACEBAR một cách tự động ở cuối một 
mục trình đơn 
6.2. Kết thúc Macro 
Khi thực hiện một Macro, AutoCAD thêm một dấu cách ở cuối Macro trước khi 
thực hiện các dòng lệnh. AutoCAD xử lý đoạn Macro trình đơn sau giống như là ta 
đã nhập vào lệnh line và dấu cách. 
Đôi khi, điều này không được mong muốn. Chẳng hạn, lệnh TEXT hoặc DIM phải 
được kết thúc bằng ENTER chứ không phải là một dấu cách. Hơn nữa, đôi khi phải 
sử dụng nhiều hơn một dấu cách (hoặc ENTER) thì mới hoàn tất một lệnh, nhưng 
một số các bộ soạn thảo không cho phép bạn nhập một hàng dài những khoảng 
trắng. 
Có hai cách đặc biệt để giải quyết những vấn đề này: 
 198 | Chương 6: Tùy biến thanh công cụ và trình đơn 
ƒ Khi trong Macro có dấu chấm phẩy (;), AutoCAD sẽ thay bằng ký tự 
ENTER 
ƒ Nếu một dòng kết thúc với một ký tự điều khiển, dấu gạch ngược (\), dấu 
cộng (+), hoặc dấu chấm phẩy (;), AutoCAD sẽ không thêm một khoảng 
trắng phía sau các ký tự này. 
Xem Macro sau: 
erase \; 
Nếu Macro này chỉ kết thúc đơn giản bằng dấu gạch ngược (tức là yêu cầu người 
dùng nhập liệu), thì sẽ không thực hiện được lệnh ERASE, vì AutoCAD không 
thêm khoảng trắng sau dấu gạch ngược (\). Do đó, Macro này phải sử dụng thêm 
dấu chấm phẩy (;) để buộc AutoCAD thêm ENTER sau khi người dùng nhập liệu. 
Sau đây là một số ví dụ nữa: 
ucs 
ucs ; 
text \.4 0 DRAFT Inc;;;Main St.;;;City, State; 
Chọn Macro đầu tiên: nhập ucr và một dấu cách trên dòng lệnh, và dòng nhắc sau 
sẽ xuất hiện: 
Enter an option 
[New/Move/orthoGraphic/Prev/Restore/Save/Del/Apply/?/World] 
: 
Chọn Macro thứ hai: nhập vào ucs, dấu cách và một dấu chấm hỏi trên dòng lệnh, 
sẽ chấp nhận giá trị mặc định, World. Rõ ràng không có sự khác nhau giữa macro 
thứ nhất và thứ hai được hiển thị trên màn hình. 
Chọn Macro thứ ba: hiển thị một dòng nhắc về điểm bắt đầu và sau đó là địa chỉ 
trên 3 hàng. Trong bộ ba dấu chấm phảy (;;;), dấu đầu tiên kết thúc chuỗi văn bản, 
dấu thứ hai nhằm lặp lại lệnh TEXT và dấu thứ ba gọi lại vị trí mặc định là phía sau 
dòng trước. 
CHÚ Ý Tất cả các ký tự đặc biệt phải nhập bằng mã ASCII tương đương. Để biết danh 
sách mã ASCII tương đương, xem phần “Ký tự Macro và mã ASCII tương đương.” 
6.3. Dừng để người dùng nhập liệu 
Đôi khi sẽ rất hữu ích nếu chấp nhận nhập liệu từ bàn phím hoặc các thiết bị trỏ 
trong một Macro bằng cách đặt một dấu gạch ngược (\) tại nơi muốn nhập liệu. 
circle \1 
layer off \; 
Macro đầu tiên dừng để yêu cầu người dùng xác định điểm tâm rồi lấy giá trị bán 
kính bằng 1 từ Macro. Chú ý rằng không có dấu cách sau dấu gạch ngược. Macro 
tiếp theo dừng để yêu cầu người dùng nhập vào tên một lớp, rồi tắt lớp đó đi và 
thoát khỏi lệnh LAYER. Lệnh LAYER thường dùng với các thao tác khác và chỉ thoát 
ra khi nào bạn nhấn phím cách (dấu trắng) hoặc ENTER (;). 
Thông thường, Macro tiếp tục thực hiện sau khi nhập một nội dung nào đó. Do đó, 
không thể thiết lập một macro có vài lần dừng để nhập liệu (như trong quá trình 
chọn đối tượng) và sau đó tiếp tục. Tuy nhiên, có một ngoại lệ đó là khi sử dụng 
 Phát triển AutoCAD bằng ActiveX và VBA | 199 
lệnh SELECT; một dấu gạch ngược sẽ “treo” Macro đó cho đến khi đối tượng được 
chọn xong. Ví dụ như Macro sau đây: 
select \change previous ;properties color red ; 
Macro này sử dụng lệnh SELECT để thực hiện việc chọn một hay nhiều đối tượng. 
Sau đó, nó thực hiện lệnh CHANGE, đặt theo các tuỳ chọn trước và thay màu của tất 
cả các đối tượng đã chọn thành màu đỏ. 
Do dấu gạch ngược (\) làm Macro dừng lại để người dùng nhập liệu, nên ta không 
thể sử dụng dấu này cho bất cứ mục đích nào khác trong Macro. Khi xác định 
đường dẫn tệp, sử dụng một dấu gạch xuôi (/) làm giới hạn đường dẫn, ví dụ, 
/direct/file. 
Các trường hợp sau đây khiến Macro không tiếp tục thực hiện: 
ƒ Nếu cần nhập vào một điểm, chế độ bắt đối tượng Object Snap có thể thực 
hiện trước khi có được một điểm thực cần. 
ƒ Nếu sử dụng bộ lọc điểm X/Y/Z, Macro sẽ vẫn treo cho đến khi ta nhập đủ 
tọa độ điểm. 
ƒ Riêng đối với lệnh SELECT, Macro sẽ không tiếp tục thực hiện cho đến khi 
chọn đối tượng xong. 
ƒ Nếu người dùng nhập liệu với các lệnh gián tiếp khác thì Macro sẽ vẫn tiếp 
tục dừng cho đến khi người dùng thực hiện xong các lệnh gián tiếp và dữ 
liệu cần nhập đã được thực hiện đủ. 
ƒ Nếu người dùng chọn một Macro khác (để thay đổi các lựa chọn hoặc để 
thực thi các lệnh gián tiếp), Macro nguồn sẽ vẫn bị treo và Macro vừa được 
chọn sẽ được thực hiện đến hết trước khi thực hiện tiếp Macro nguồn. 
6.4. Hủy lệnh 
Để chắc chắn rằng không còn một lệnh còn chưa thực hiện, ta sử dụng ^C^C trong 
Macro. Đây là cách tương tự như nhấn phím ESC hai lần. Mặc dù chỉ cần một ^C 
thôi cũng đã hủy lệnh trong hầu hết các trường hợp, nhưng ^C^C là cần thiết để trở 
về dấu nhắc từ lệnh DIM. Do đó, ta dùng ^C^C để đảm bảo rằng AutoCAD sẽ trở về 
dấu nhắc lệnh trong đa số trường hợp. 
6.5. Lặp lại Macro 
Khi đã chọn một lệnh, có thể ta sẽ sử dụng nó vài lần trước khi dùng lệnh khác. Đây 
là cách mà hầu hết mọi người đều làm với công cụ: chọn một công cụ, làm việc với 
nó vài lần rồi sau đó chọn công cụ khác và cứ thế Để tránh việc chọn công cụ mỗi 
khi sử dụng, AutoCAD cung cấp khả năng lặp lại các lệnh. Tuy nhiên, ta không thể 
sử dụng tính năng này trong một vài lựa chọn của một số lệnh. 
Tính năng này giúp lặp lại thường xuyên các lệnh đã dùng cho đến khi chọn lệnh 
khác. Nếu một Macro bắt đầu với *^C^C và theo sau là nhãn nào đó, Macro sẽ được 
lưu vào bộ nhớ. Các dòng nhắc lệnh tiếp theo sẽ được Macro đó tự động trả lời cho 
đến khi ta kết thúc Macro đó bằng cách thực thi một Macro khác hoặc ấn phím 
ESC. 
 200 | Chương 6: Tùy biến thanh công cụ và trình đơn 
Không sử dụng ^C (hủy) trong một Macro bắt đầu bằng chuỗi *^C^C, điều này sẽ 
làm hủy quá trình lặp lại của Macro đó. 
Sau đây là một ví dụ của việc lặp lại Macro: 
*^C^CMOVE Single 
*^C^CCOPY Single 
*^C^CERASE Single 
*^C^CSTRETCH Single Crossing 
*^C^CROTATE Single 
*^C^CSCALE Single 
6.6. Sử dụng chế độ chọn đối tượng đơn 
Việc chọn đối tượng đơn sẽ chuyển chế độ chọn đối tượng sang chế độ chọn đối 
tượng đơn, điều này sẽ vô hiệu hóa các trình tự thông thường khi ta tiến hành lựa 
chọn đối tượng và sẽ trả về đối tượng đầu tiên trong các đối tượng đã được lựa chọn 
đó. Điều này cũng khá hữu ích khi sử dụng trong Macro. Lấy ví dụ đoạn Macro sau: 
*^C^CERASE single 
Đoạn Macro này sẽ kết thúc lệnh đang thực hiện và kích hoạt lệnh ERASE với chế 
độ chọn đối tượng đơn. Các đối tượng được lựa chọn sẽ bị xóa đi, và Macro này sẽ 
được lặp lại (do có dấu sao ở đầu đoạn Macro) để ta có thể tiếp tục xóa các đối 
tượng khác. Chế độ lựa chọn đối tượng đơn sẽ tạo thêm nhiều tương tác động với 
môi trường AutoCAD. 
7. Tạo dòng trạng thái trợ giúp cho các mục trong 
trình đơn và nút trên thanh công cụ 
Các thông điệp trợ giúp trên thanh trạng thái là một phần quan trọng của chức năng 
hỗ trợ sẵn có. Chúng là những thông điệp đơn giản và có ý nghĩa, xuất hiện trên 
thanh trạng thái khi ta di chuột đến một trình đơn hoặc thanh công cụ. Dòng trạng 
thái trợ giúp của các mục của trình đơn và nút trên thanh công cụ đều được gán 
thông qua thuộc tính HelpString. 
Thuộc tính HelpString được để trống khi một mục trên trình đơn hoặc trên thanh 
công cụ vừa được tạo lần đầu. 
Thêm dòng trạng thái trợ giúp cho mục trình đơn 
Dưới đây là ví dụ tạo một trình đơn mới tên “TestMenu” rồi tạo một mục “Open”. 
Mục này sau đó được gán chuỗi trợ giúp thông qua thuộc tính HelpString. 
Sub Ch6_AddHelp() 
Dim currMenuGroup As AcadMenuGroup 
Set currMenuGroup = 
ThisDrawing.Application.MenuGroups.Item(0) 
’ Tạo trình đơn mới 
Dim newMenu As AcadPopupMenu 
Set newMenu = currMenuGroup.Menus.Add _ 
("Te" + Chr(Asc("&")) + "stMenu") 
’ Thêm một mục vào trình đơn mới 
Dim newMenuItem As AcadPopupMenuItem 
Dim openMacro As String 
’ Gán lệnh "ESC ESC _open " 
 Phát triển AutoCAD bằng ActiveX và VBA | 201 
openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) 
’ Tạo mục “Open” trên trình đơn 
Set newMenuItem = newMenu.AddMenuItem _ 
(newMenu.count + 1, Chr(Asc("&")) _ 
+ "Open", openMacro) 
’ Thêm chuỗi trợ giúp cho mục “Open” trong trình đơn 
newMenuItem.HelpString = "Opens an AutoCAD drawing file." 
’ Hiển thị trình đơn mới 
newMenu.InsertInMenuBar _ 
(ThisDrawing.Application.menuBar.count + 1) 
End Sub 
8. Thêm mục vào trình đơn tắt 
Trình đơn tắt, là một trình đơn đặc biệt có trong nhóm trình đơn cơ bản của 
AutoCAD. Trình đơn này xuất hiện khi người dùng giữ phím SHIFT và nhấn chuột 
phải. 
AutoCAD nhận biết trình đơn này bằng cách tìm trong nhóm trình đơn cơ bản một 
trình đơn có thuộc tính ShortcutMenu là TRUE. Ta có thể thêm một mục mới vào 
trình đơn tắt theo các bước được liệt kê trong phần “Thêm mục mới vào một trình 
đơn” trang 182. 
Các nhóm trình đơn mới có thể chứa hoặc không chứa trình đơn tắt. Để tạo một 
trình đơn tắt cho một nhóm trình đơn, theo các bước ở phần “Tạo trình đơn mới” 
trang 181 và sử dụng POP0 làm nhãn của trình đơn mới. 
Thêm một mục mới vào cuối trình đơn tắt 
Dưới đây là ví dụ thêm mục có tên “OpenDWG” vào cuối trình đơn tắt. 
Sub Ch6_AddMenuItemToshortcutMenu() 
Dim currMenuGroup As AcadMenuGroup 
Set currMenuGroup =ThisDrawing.Application.MenuGroups.Item(0) 
’ Tìm trình đơn tắt và gán nó cho biến shortcutMenu 
Dim scMenu As AcadPopupMenu 
Dim entry As AcadPopupMenu 
For Each entry In currMenuGroup.Menus 
If entry.shortcutMenu = True Then 
Set scMenu = entry 
End If 
Next entry 
’ Thêm một mục mới và trình đơn tắt 
Dim newMenuItem As AcadPopupMenuItem 
Dim openMacro As String 
’ Gán lệnh "ESC ESC _open " 
openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32) 
Set newMenuItem = scMenu.AddMenuItem _ 
("", Chr(Asc("&")) _ 
+ "OpenDWG", openMacro) 
End Sub 

File đính kèm:

  • pdfgiao_trinh_phat_trien_autocad_bang_activex_vba_chuong_6_tuy.pdf