Khai báo AP

Một phần của tài liệu Tài liệu hướng dẫn thực tập tốt nghiệp Tin học xây dựng - Chương 1 pptx (Trang 62 - 66)

, vbCtrlMask vbKeyV End With

I.6.1. Khai báo AP

Các hàm API trong Windows được đặt trong các thư viện liên kết động DLL, để khai báo sử dụng một API cần chỉ rõ tên file DLL, các tham số và kiểu tham số, giá trị trả về của hàm. Sau đâu là cú pháp khai báo API

<Public | Private> Declare Sub <Tên sub> Lib "<tên thư viện>" (<danh sách tham số>)

<Public | Private> Declare Function <Tên hàm> Lib "<tên thư viện>" (<danh sách tham số>) As <Kiểu trả về>

Sau đây là một ví dụ

Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

Tên hàm khai báo trong VB th ường giống với tên hàm trong th ư viện liên kết động, tuy nhiên bạn có thể khai báo với tên khác, ví dụ

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal

hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Nếu bạn thắc mắc, khai báo dài như mấy ví dụ trên thì làm sao nhớ nổi? Hãy yên tâm, VB cung cấp cho bạn một công cụ để đưa nhanh các hàm API vào project của bạn mà chẳng cần phải nhớ gì ngoài tên của API.

Để sử dụng công cụ này, bạn vào menu Start / Programs / Microsoft Visual Studio 6.0 / Microsoft Visual Studio 6.0 Tools / API Text Viewer . Trên ứng dụng API Viewer, chọn menu File | Load Text File. Trên hộp thoại Select a Text API file, chọn file WIN32API.txt tại thư mục C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi. Thao tác này chỉ cần làm lần đầu tiên, các lần sau bạn chỉ cần chọn file Win32API trên menu File.

Sau đó, bạn chỉ cần nhập vào vài ký t ự đầu của tên hàm t ại mục "Type the first few letters...", khi chọn được hàm cần thiết, click đúp vào tên hàm hoặc click vào nút Add để thêm hàm vào danh sách Selected Items. Click Copy để sao chép các thông tin này, sau đó bạn có thể paste đoạn code khai báo API vào project của mình.

I.6.2. Các hàm API trên DC (Device Context)

Form và PictureBox h ỗ trợ các l ệnh vẽ bằng VB, tuy nhiên các l ệnh này quá đơn giản, không thể sử dụng để vẽ các hình phức tạp, do đó chúng ta phải sử dụng các hàm vẽ API. Để vẽ trên Windows, các bạn phải làm quen với khái niệm Device Context (DC). Mỗi DC là một màn hình ảo cho phép bạn vẽ trên nó. DC có th ể là một màn hình ảo trên bộ nhớ, cũng có thể là một phần của màn hình mà bạn có thể nhìn thấy được.

Để vẽ trên DC, Windows cung cấp các dụng cụ vẽ: pen (bút vẽ), brush (chổi vẽ)... Các lệnh vẽ cơ bản gồm có MoveToEx, LineTo. Ngoài ra còn có các hàm v ẽ khác như Polyline (vẽ đường gấp khúc), Polygon (vẽ và tô màu đa giác), PolyBezier (vẽ đường cong)...

Trong VB, các control Form và PictureBox có thuộc tính [hdc]. Do đó, các control này thích hợp nhất để thực hiện các hàm vẽ bằng API.

Chú ý: Các khai báo hàm trong ví dụ dưới đây tương đối dài, các bạn không nên chép lại mà nên sử dụng công cụ API Viewer để lấy nhanh khai báo hàm.

' Kiểu POINTAPI lưu thông tin về điểm gồm 2 tọa độ x, y

Public Type POINTAPI x As Long y As Long

End Type

' Tạo ra chổi vẽ với màu là [crColor]

' Để nhập màu, dùng hàm RGB(red, green, blue) của VB

Public Declare Function CreateSolidBrush Lib "gdi32" Alias "CreateSolidBrush" (ByVal crColor As Long) As Long

' Chọn đối tượng [hObject] cho màn hình ảo [hdc]

' Nếu [hObject] là chổi vẽ thì tức là sử dụng chổi vẽ [hObject] cho [hdc] ' [hObject] còn có thể là nhiều loại tài nguyên khác: pen, font...

Public Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc

As Long, ByVal hObject As Long) As Long

' Chuyển vị trí bút vẽ của màn hình ảo [hdc] đến điểm [x], [y] ' [lpPoint] là tọa độ của bút vẽ trước khi chuyển

Public Declare Function MoveToEx Lib "gdi32" Alias "MoveToEx" (ByVal hdc As

Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long

' Trên màn hình ảo [hdc], vẽ đoạn thẳng từ vị trí hiện tại của bút vẽ

' đến điềm [x], [y]. Sau đó chuyển bút vẽ đến điểm này

Public Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long,

' Vẽ đường cong bezier qua các điểm [lppt] ' Số lượng điểm phải nhiều hơn 3

' [lppt] là điểm đầu trong mảng có [cPoints] phần tử, các phần tử của mảng ' có kiểu là POINTAPI (xem phần ví dụ vẽ đường cong để biết chi tiết)

Public Declare Function PolyBezier Lib "gdi32" Alias "PolyBezier" (ByVal hdc As

Long, lppt As POINTAPI, ByVal cPoints As Long) As Long

' Vẽ đường gấp khúc qua các điểm [lpPoint]

' [lpPoint] là điểm đầu trong mảng các điểm của đường gấp khúc ' [nCount] là số điểm

Public Declare Function Polyline Lib "gdi32" Alias "Polyline" (ByVal hdc As

Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long

' Vẽ và tô màu đa giác qua các điểm [lpPoint] ' Màu tô của đa giác là màu của chổi vẽ của [hdc]

Public Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As

POINTAPI, ByVal nCount As Long) As Long

' Xóa đối tượng [hObject]

' Các chổi vẽ tạo bởi lệnh CreateSolidBrush, font tạo bởi lệnh CreateFont... ' Đều phải xóa ngay bằng lệnh DeleteObject, nếu không chúng sẽ chiếm nhiều ' tài nguyên của hệ thống

Public Declare Function DeleteObject Lib "gdi32" Alias "DeleteObject" (ByVal

hObject As Long) As Long

Chương trình ví dụ sử dụng các hàm API để vẽ một đường cong trên form.

Option Explicit

Private Type POINTAPI x As Long y As Long

End Type

' Khai báo các hàm vẽ trên Device Context

Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As

Long

Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As

POINTAPI, ByVal cPoints As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As

Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal

hObject As Long) As Long

Private Sub Form_Paint()

' Đường cong sẽ đi qua 4 đỉnh, đỉnh đầu và đỉnh cuối giống nhau -> ' đây là đường cong kép kín

Dim p(4) As POINTAPI

p(0).x = 0: p(0).y = 0 p(1).x = 100: p(1).y = 0 p(2).x = 100: p(2).y = 100

Dim brush As Long ' [brush], chổi vẽ có màu đen

brush = CreateSolidBrush(RGB(0, 0, 0))

Dim oldbrush As Long ' [oldbrush], chổi vẽ trước ' của màn hình ảo [hdc]

oldbrush = SelectObject(Me.hdc, brush) ' chọn chổi vẽ mới, lưu lại chổi cũ

PolyBezier Me.hdc, p(0), 4 ' Vẽ đường cong kép kín qua 4 điểm

SelectObject Me.hdc, oldbrush ' Chọn lại chổi vẽ cũ

DeleteObject brush ' Rồi mới xóa được chổi vẽ đã tạo ra

End Sub

Ví dụ trên minh h ọa việc sử dụng các hàm API để vẽ một đường cong (s ử dụng hàm PolyBezier). Một điều cần chú ý v ới tất cả các hàm v ẽ trên DC là vi ệc tạo chổi vẽ, chọn chổi vẽ cho DC, xóa ch ổi vẽ... phải tuân theo đúng quy trình như trong ví dụ. Nếu không thực hiện theo thứ tự đó, chương trình vẫn chạy nhưng sẽ không giải phóng hoàn toàn b ộ nhớ. Nếu chương trình vẽ nhiều lần, bộ nhớ sẽ nhanh chóng bị đầy.

Một phần của tài liệu Tài liệu hướng dẫn thực tập tốt nghiệp Tin học xây dựng - Chương 1 pptx (Trang 62 - 66)

Tải bản đầy đủ (PDF)

(66 trang)