Friday, October 30, 2009

Thủ thuật nhỏ trong VB p10

Ðóng mở khay đĩa CD-Rom

Bạn có muốn viết một tiện ích để đóng mở khay ổ đĩa CD-Rom cho riêng mình không ? Nến bạn có ý đó thì vài dòng code sau đây sẽ giúp bạn toại nguyện.

Lưu ý: Chương trình này chỉ tác dụng tới ổ CD đầu tiên trên hệ thống của bạn (ổ có tên gần với tên Partition cuối cùng của máy).

- Tạo một Project mới.

- Khai báo hàm API sau trong Form1.

Option Explicit

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hWndCallback As Long) As Long

Tạo thêm hàm vbmciSendString() để nhận thông điệp đóng/mở khay CDROM. Hàm này trả về một String.

Function vbmciSendString(ByVal Command As String, ByVal hWnd As Long) As String

Dim Buffer As String

Dim dwRet As Long

Buffer = Space$(100)

dwRet = mciSendString(Command, ByVal Buffer, Len(Buffer),hWnd)

vbmciSendString = Buffer

End Function

Tạo lần lượt 2 Command Button và đặt Caption cho chúng là: "Open" & "Close". Sau đây là mã tương ứng cho 2 nút lệnh đó.

Private Sub Command1_Click()

Dim Dummy As String

Dummy = vbmciSendString("set cdaudio door open", 0)

End Sub

Private Sub Command2_Click()

Dim Dummy As String

Dummy = vbmciSendString("set cdaudio door closed ", 0)

End Sub

Như vậy Command1 dùng để mở khay CD, còn Command2 thì đóng khay. Hãy save lại & cho chạy thử chương trình xem. Hãy áp dụng những thủ thuật của các bài trước thiết kế cho chương trình chạy thường trú trong Windows, thể hiện thành 1 Icon ở System Tray để tiện sử dụng.

Nhất định nó sẽ hữu ích khi bạn làm biếng thò tay nhấn nút Eject hoặc cái nút quái quỷ đó không còn tác dụng. Riêng tôi cái tiện ích này cực kỳ tiện, do cái thùng máy (CPU) tôi đặt dưới gầm bàn, muốn lấy CD ra phải khom người nhấn nút, rồi chờ (một hai giây thôi cũng đủ làm tôi nóng ruột). Với tiện ích chỉ việc click chuột khi nào nghe tiếng khay bung ra .... thật tiện lợi.

Tùy biến Command Button

Command Button là 1 trong những control thông dụng nhất trong Windows nói chung & trong VB nói riêng. Một chương trình đơn giản nào hầu nhưng cũng có đối tượng này.

Tuy vậy nó cũng có những vướng mắt chứ chẳng phải đơn giản đâu. Sau đây là vài thắc mắc của một bạn tự học VB. Tôi muốn phổ biến cùng các bạn đang tự học VB khác.

Câu hỏi 1: Tại sao khi tôi thay đổi màu BackColor của Command Button thành một màu khác (màu mặc nhiên của Windows) nhưng nó vẫn trơ như đá, chẳng thấy thay đổi theo sự lựa chọn của tôi.

Trả lời: Command Button chỉ thay đổi màu Backcolor khi thuộc tính Style của nó được đặt là 1-Graphical mà thôi. Mặc nhiên là 0-Standard.

Điều này cũng tương tự như thuộc tính Picture, khi bạn gán một hình ảnh cũng phải gán cho thuộc tính Style là 1-Graphical thì bức ảnh mới hiện lên, nếu không thì chẳng thấy thay đổi gì.

Câu hỏi 2: Làm sao để thay đổi màu TextColor (Màu của dòng Text trên Command Button - Caption) của Command Button ?

Trả lời: Trong chế độ Design của VB không có thuộc tính nào cho phép ta thay đổi màu TextColor, và khi thi hành chương trình cũng vậy. Nói tóm lại trong môi trường phát triển của VB bạn không thể nào thay đổi màu TextColor của Command Button được.

Do vậy ta phải tìm một hướng khác. Tôi xin đề nghị 2 cách sau đây:

* Custom Control: Bạn có thể tự thiết kế, điều này đòi hỏi bạn phải có khả năng tạo ActiveX (cũng tạo bằng VB). Hay bạn có thể tìm những ActiveX được thiết kế sẳn, về bổ sung vào ứng dụng của mình (Internet là nơi chắc chắn bạn phải tìm đến, nếu không có điều kiện, hãy lục lọi trên các CD free code bán ở các cửa hàng).

Nhưng theo tôi biết, trong bộ VB 4 (Version 32bit) có một custom control tên là Sheridan 3D Controls (THREED32.OCX) bạn có thể dễ dàng tìm tìm thấy hơn. Bao gồm các đối tượng sau:

  • SSCheck

  • SSFrame

  • SSPanel

  • SSRibon

  • SSCommand

  • và SSOption

Bao gồm rất nhiều thuộc tính cho phép ta chọn đủ màu sắc, có cả thuộc tính cho phép gán hiệu ứng cho Text nữa. Thật lý thú.

Xem thử giao diện

* Tự vẽ lấy Command Button: Cách này thì ai cũng có thể làm, nhưng đẹp hay xấu là do phụ thuộc vào khả năng vẽ của bạn. Cách làm như sau:

  • Tự bạn vẽ một nút lệnh, hình dáng kích thước màu sắc tùy ý bạn. Bằng các chương trình đồ họa (hay dùng ngay Paint của Windows cũng được).

  • Lưu lại bức ảnh dưới dạng Bitmap (*.bmp). Thật ra với VB6 bạn có thể dùng format: bmp, jpg, gif ... Còn VB4 chỉ dùng bmp mà thôi.

  • Gán vào thuộc tính Picture của command button. Lưu ý: Bạn phải đặt cho thuộc tính Style là 1-Graphical & Caption là trống (không đặt gì cả).

Tôi có làm một thí dụ đơn giản để minh họa


Bức ảnh gif được vẽ bằng các chương trình vẽ thông dụng.


Button thứ nhất là do tôi vẽ, button thứ hai là của VB (không thể thay đổi màu cho Text được). Bạn hãy so sánh.

Có người cho rằng bạn có thể đặt một Picture vào Image control để giả làm button, nhưng theo riêng tôi cách này không hay, vì khi đặt hình ảnh trong Image lúc người dùng Click chuột sẽ không cảm thấy bị lún xuống như là cách đặt hình ảnh vào Command Button của tôi mới trình bày.

Làm sao để hiển thị hộp thoại BROWSE FOR FOLDER ?

Trong lúc viết ứng dụng, có lúc bạn chỉ cần cho người dùng chọn thư mục (nếu chọn tập tin thì đã có Dialog Open rồi). Lúc này bạn nên cho hiển thị hộp thoại "Browse for Folder" là tiện nhất.

Sau đây là cách thực hiện:

Hãy khởi động VB. Tạo Project mới

Gõ đoạn Code sau đây vào một Module.

Private Type BrowseInfo

hwndOwner As Long

pIDLRoot As Long

pszDisplayName As Long

lpszTitle As Long

ulFlags As Long

lpfnCallback As Long

lParam As Long

iImage As Long

End Type

Private Const BIF_RETURNONLYFSDIRS = 1

Private Const MAX_PATH = 260

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long

Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long

Public Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String

Dim iNull As Integer

Dim lpIDList As Long

Dim lResult As Long

Dim sPath As String

Dim udtBI As BrowseInfo

With udtBI

.hwndOwner = hwndOwner

.lpszTitle = lstrcat(sPrompt, "")

.ulFlags = BIF_RETURNONLYFSDIRS

End With

lpIDList = SHBrowseForFolder(udtBI)

If lpIDList Then

sPath = String$(MAX_PATH, 0)

lResult = SHGetPathFromIDList(lpIDList, sPath)

Call CoTaskMemFree(lpIDList)

iNull = InStr(sPath, vbNullChar)

If iNull Then sPath = Left$(sPath, iNull - 1)

End If

BrowseForFolder = sPath

End Function

Trên Form tạo một Command Button (Name: Command1), gõ đoạn code sau vào sự kiện Click.

Private Sub Command1_Click()

Dim strResFolder As String

strResFolder = BrowseForFolder(hWnd, "Select Folder.")

If strResFolder <> "" Then

MsgBox strResFolder

End If

End Sub

Kết quả chọn của người dùng được đặt vào biến strResFolder. Bạn hãy áp dụng vào ứng dụng của mình khi có nhu cầu.

1 comment:

  1. Cho e hỏi làm thế nào để khj ta chọn đối tượng thì nó chuyển sang màu khác ạ(như chọn bàn của quàn cf ý ạ..bàn nào có khách thì màu khác các bàn k có khách) e cảm ơn ạ

    ReplyDelete