# GÓC SÁNG TẠO > Khu vực lập trình > Visual Basic >  Hướng dẩn cách tạo(viết) ActiveX control (ocx)

## nongdanseo

Dành Cho VB6
-----------------------------------------------
Đây là hướng dẩn “đủ” để các bạn tạo 1 ActiveX Control (usercontrol or ocx) :

Cách 1 : Tạo 1 usercontrol dựa vào 1 control có sẳn
- Ví dụ thiết kế một Label mới dựa vào label chuẩn của VB6
+ Tạo một dự án mới, sau đó add vào một usercontrol (h1)

 h1.JPG (10.52 KB) Đã xem *307* lần. 

+ Và mở usercontrol đó lên.Add vào đó 1 label tên là label1
+Cách để bạn tạo các property nhanh nhất và gọn nhất là dùng “ActiveX Controls Interface Wizard …” (để mở nó bạn chọn Menu “Add-In” > “Add-In Manager” , hiện hộp thoại lên bấm vào “VB ActiveX Control Interface Wizard” check cả 2 “Loaded/Unloaded” và “Load on startup” và bấm OK)
,sau đó muốn sử dụng nó bạn chỉ việc vào menu “Add-in” sẻ thấy nó ngay.
+ Bấm vào “ActiveX Controls Interface Wizard …” và hiện ra hộp thoại 

 

bạn có thể check “Skip this screen in the future.” để mai mốt nó khỏi “làm phiền”
bấm next (Nếu trong project của bạn chỉ có 1 control thì nó sẽ qua hộp thoại này,nếu có nhiều control thì nó sẽ hiện hộp thoại khác để bạn chọn control)

 

Đây là bước quan trọng, bạn phải dò tìm những property , method, event của label và chuyễn qua hết vào bên phải (có thể chọn những thứ khác không phải của label), xong bấm next

 

Sau đó bấm vào những property,method.event của label và bên phải bấm vào combo và chọn label1 tương ứng (vì ta dùng lại những cái củ của label)
,chọn xong hết bấm next (cái này dành cho cách 2),bấm next thêm cái nửa và bấm finnish là xong, cuối cùng chỉ việc thêm vào vài dòng code sau để label khích với usercontrol :

Private Sub UserControl_Resize()
Label1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
--------------------------------------------------------
Kỳ sao mình sẽ hướng dẩn cách tạo usercontrol không theo control chuẩn của VB6 (Tức là tự chế )
Cách 2 : Tạo usercontrol dựa vào API (không phải là Createwindow hay CreatewindowEx)
- Ví dụ này cũng vẩn tạo 1 label mới nhưng hổ trợ unicode (Không theo chuẩn của VB6)
Bạn vẩn dùng "ActiveX control Interface wizard …" để tạo các property,method,event nhưng không theo cách củ :
-Bước 1 : Không cho gì vào usercontrol mới cả,Mở "ActiveX control Interface wizard …" ta chọn các property,method,event chủ yếu cho label mới là :BackColor,BackStyle,Click,DoubleClick,Enable,Font  ,ForeColor,KeyDown,KeyPress,KeyUp,MouseDown,MouseU  p,MoseMove,Refresh, bấm next.

 

-Bước 2 : bấm new và hiện hôp thoại

 h2.JPG (10.67 KB) Đã xem *264* lần. 

Gỏ vào đó từ "Caption" (Ta tạo property mới) ,trong frame "Type" chọn Property và bấm OK,sau đó bấm next.
Bước 3 : tất cả những Property,Method,Event bên phải đều chọn là Usercontrol hết ,trừ Property "Caption" mà ta mới tạo là để trống (tức là (None))

 

Bấm next.

 

Trong hộp thoại này,ta chỉ có 1 public name duy nhất là property "Caption" (Vì lúc nãy ta cho nó là (none).)
-Chổ "Data Type" chọn là "String" (Vì đây là caption nên có kiểu String, nếu là một property khác thì tùy vào cấu trúc ta muốn khởi tạo mà đặt, ví dụ ta có property "Picture" thì chổ này phải chọn là "StdPicture" hay "Picture")
-Chổ Default Value (Giá trị ban đầu của caption,tức là khi add vào form nó sẽ mang giá trị này)
- Run Time và Design Time đều chọn là "Read/Write" để người dùng có thể chỉnh sửa lúc đang thiết kế hay đang chạy.
Bấm next, bấm tiếp Finish.
-Xong phần chuẩn bị,bây giờ bắt tay vào làm 1 Label mới (giả)

Chuẩn bị các hàm API sau :

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Const DT_EDITCONTROL = &H2000
Const DT_LEFT = &H0
Const DT_WORDBREAK = &H10

Private Declare Function DrawTextW Lib "user32" (ByVal hdc As Long, ByVal lpStr As Long, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
'Hàm này dùng để vẽ chuỗi Unicode lên usercontrol

'Tạo 1 hàm mới có tên là "DrawLabel" như sau (Hàm này dùng để vẽ toàn bộ UniLabel) :

Private Sub DrawLabel()
Dim wRC as RECT , FL as Long
Usercontrol.Cls 'Làm sạch sẽ Usercontrol trước khi vẽ lên
With wRC 'Đặt vị trí để vẽ
.Left = 0 
.Top = 0 
.Right = ScaleWidth 
.Bottom = ScaleHeight 
End With
FL = DT_LEFT or DT_WORDBREAK or DT_EDITCONTROL 
'bạn có thể cho thêm các cờ vào nếu muốn
DrawTextW Usercontrol.hdc, StrPtr(m_Caption), -1, wRC, FL 'vẽ chuỗi
End Sub

'Thế là hoàn tất,bạn chỉ còn việc cuối là đưa nó vào 
'Sub Resize và Show của Usercontrol là xong

Private Sub UserControl_Resize()
DrawLabel 'Vẽ lại khi control thay đỗi kích thước
End Sub

Private Sub UserControl_Show()
DrawLabel 'Vẽ khi control xuất hiện
End Sub

Public Sub Refresh()
DrawLabel
UserControl.Refresh
End Sub

*Tài liệu tham khảo được [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]*

----------

