• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Xác định đúng sự kiện nhấn trên button hình tròn

Các thủ thuật liên quan đến việc xử lý ứng dụng, biểu mẫu và control
giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Sat 12/04/2008 12:30 am

Thủ thuật: Xác định đúng sự kiện nhấn trên button hình tròn
Tác giả: GiongTo35
Mô tả: Bạn thường hay tạo những button cực kì đẹp mắt lộng lẫy (như hình tròn), rồi lại nhét nó vô một image, Khi ta roll over , hay click vào viền ngoài của button nó vẫn thông báo sự kiện (vì phần image là hình chữ nhật ở bên ngoai) . Vậy làm sao để có một button hình tròn có thể thụ lí được sự kiện khi click vào mà ko ở xác định nhầm ở phần ngoại biên


Mình chỉ biết 2 phương pháp
1 . Xử lí điểm ảnh (nếu là màu lọa bỏ thì ko chọn)
2 . Xử lí region
Cách này rất đơn giản , trong bài này chỉ giới thiệu region hình tròn cho button có đường kính 132cm . Nhưng nếu bạn thích làm button hình ellip hay thậm chí là đa giác cũng được , miễn sao bạn vẽ cái viền cho nó đúng thôi
Api sử dụng :

Code: Select all

  1. Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
  2. Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
  3. Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Attachments
ButtonHinHTron.rar
(43.12 KiB) Downloaded 1173 times


________________________________________________________________________________________________
. . . . . . . . . . . . .. .

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby playgemboy » Sat 10/05/2008 4:40 pm

Hì, Em đang nghiên cứu là cái sự kiện Mouse Move cho cái Line. Xài Hàm API PtInRegion này chắc là được.Nhưng mà cái "region" của đường thẳng ra sao thì em chịu. Có ai biết không nhỉ?.(ý em nói là khi Con trỏ chuột move lên Line thì chạy code sự kiện,con trỏ chuột move lên Line không bằng Timer)
<I Come Back>

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Sat 10/05/2008 5:25 pm

chắc được , vì trong tạo region có thể vẽ bất kì thứ gì , polygon cũng được
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby playgemboy » Sat 10/05/2008 6:55 pm

Em cũng nghĩ là được nhưng bác giongto có biết Region của đường thẳng tạo như thế nào không?( hình tròn, hình vuông đều có hàm tạo ra hết rồi, sao lại không có đường thẳng nhỉ?)
<I Come Back>

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Sat 10/05/2008 7:14 pm

Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
2 point n count=2
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby playgemboy » Sat 10/05/2008 7:50 pm

"lpPoint As Any" híc, cái này em không biết, anh code giùm em luôn đi!!. Kiểu Any là gì?
<I Come Back>

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Sat 10/05/2008 8:14 pm

là mảng point đó , lục api guilde ra xem đi :D
để làm thử
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

QuangHoa
Guru
Guru
Posts: 542
Joined: Thu 27/03/2008 9:02 am
Location: Quê hương Đại tướng Võ Nguyên Giáp
Been thanked: 5 times
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby QuangHoa » Mon 09/06/2008 9:26 am

Mình thấy cái này cũng hay, thật ra thì Code nó cũng ngắn thôi nhưng mà mình cố tình chỉnh lại chút ít để cho tiện, bạn chỉ cần thêm một Shape vào form, dán Code vào là F5

Code: Select all

  1. Option Explicit
  2. Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
  3. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  4. Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  5. Dim UserRgn As Long
  6. Private Sub Form_Load()
  7.     Me.ScaleMode = 3
  8.     With Shape1
  9.     .BackStyle = 0
  10.     .FillColor = &HFF&
  11.     .Shape = 2
  12.     .Top = 50
  13.     .Height = 150
  14.     .Width = 250
  15.     .Left = 50
  16.     End With
  17.     UserRgn& = CreateEllipticRgn(50, 50, 300, 200)
  18. End Sub
  19. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  20. If PtInRegion(UserRgn&, X, Y) Then
  21.         Shape1.FillStyle = 0
  22.         Me.Print "Trong"
  23.     Else
  24.         Shape1.FillStyle = 1
  25.         Me.Print "Ngoai"
  26.     End If
  27. End Sub
  28.  
  29.  
朋友
这些年一个人风也过雨也走,有过泪有过错还记得坚持什么。
真爱过才会懂会记没会回手,终有梦中有你在心中。
朋友一生一起走那些日子不再有,一句话一辈子一生情一杯九。
朋友不曾孤单过一声朋友你会懂,还有伤还有痛还要走还有我。

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Mon 09/06/2008 11:29 am

GiongTo sẽ cố gắng làm một soft cho vẽ viền cho cái skin , bất cứ hình gì ... ngoài hình tròn :"> rôi biên dịch ra code
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby playgemboy » Fri 13/06/2008 8:56 am

giongto35 wrote:là mảng point đó , lục api guilde ra xem đi :D
để làm thử

Uh, làm rồi, không được, chắc tại cái line nhỏ quá, con chuột không "in region" vô được. cái PtInRegion hay đó, em làm phần mềm vẽ hình không gian, muốn biết con chuột đang nắm trong mặt phẳng nào, lấy cái này ra.(chứ ngồi đó mà tính toán chi li chút một chắc... chết)
<I Come Back>

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Fri 13/06/2008 1:12 pm

xài mảng point nè viewtopic.php?f=18&t=2029
Đừng xài region nữa, chỉnh line width = 5 cho bự lên , rồi dùng hàm
Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

để xác định màu có phải màu đen ko
________________________________________________________________________________________________
. . . . . . . . . . . . .. .

User avatar
tuyen_dt18
Guru
Guru
Posts: 261
Joined: Sat 19/04/2008 8:46 pm
Location: Hưng Yên
Been thanked: 43 times
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby tuyen_dt18 » Thu 19/06/2008 11:02 pm

Em có ý kiến đóng góp với các bác là sao các bác không thử sử dụng cái thuộc tính X1,X2,Y1,Y2 xem sao.Ví dụ như thế này:
Sub Form_MouseMove(...)
Getcursorpos lPoint
If lPoint.X >=Me.Left + Line1.X1 And lPoint.X <=Me.Left + Line1.X2 And lPoint.Y >=Me.Top + Line1.Y1 And lPoint.Y<= Me.Top + Line1.Y2 Then
' Ma xu ly o day VD:Mau = vbBlue
Else
Mau = vbWhite
End If

Mã trên chưa chuẩn nhưng em thấy sử dụng thuộc tính đó là đễ đấy.

Mà cái mã nguồn trên cũng chưa chính xác lắm.Em Click chưa vào đến viền của đường tròn mà nó cứ bảo là em Click rồi.
Hỏi ý kiến tác giả trước khi sử dụng hoặc trích dẫn rõ nguồn bài viết khi sử dụng.

giongto35
Thành viên danh dự
Thành viên danh dự
Posts: 194
Joined: Thu 19/04/2007 10:17 am
Location: Đà Nẵng City
Been thanked: 1 time
Contact:

Re: Xác định đúng sự kiện nhấn trên button hình tròn

Postby giongto35 » Fri 20/06/2008 7:48 am

Code trên tớ viết hoàn chỉnh lại nè.

Code: Select all

  1.  
  2. Private Type POINTAPI
  3.         x As Long
  4.         y As Long
  5. End Type
  6.  
  7. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  8. Dim lpoint As POINTAPI
  9. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  10. GetCursorPos lpoint
  11. lpoint.x = lpoint.x * 15
  12. lpoint.y = lpoint.y * 15
  13. If lpoint.x >= Me.Left + Line1.X1 And lpoint.x <= Me.Left + Line1.X2 And lpoint.y >= Me.Top + Line1.Y1 And lpoint.y <= Me.Top + Line1.Y2 Then
  14. MsgBox "ROLL"
  15. Else
  16. Mau = vbWhite
  17. End If
  18. End Sub
  19.  

Sai rùi đấy , bởi vì nó get ko đúng đâu , đây là đường thẳng . Nếu làm như kiểu bạn thì nó sẽ xét xem con trỏ chuột có nằm trong phạm vi hình chữ nhật :
Rect (x1,x2,y1,y2) = > ko cần chạm lên line nó vẫn thông báo :D

Theo cách xài getcolor thì code đây , xuất hiện message khi click vào line

Code: Select all

  1.  
  2. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  4.  
  5. Private Sub Form_Load()
  6. Line1.BorderWidth = 30
  7. Line1.BorderColor = vbBlack
  8. End Sub
  9.  
  10. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  11. If GetPixel(GetDC(Form1.hwnd), X / 15, Y / 15) = Line1.BorderColor Then
  12.     MsgBox "Click on line"
  13. End If
  14. End Sub
  15.  


Mà cái mã nguồn trên cũng chưa chính xác lắm.Em Click chưa vào đến viền của đường tròn mà nó cứ bảo là em Click rồi.

Còn code của mình thì cái hình tròn mình vẽ trong photoshop , mang vô VB nên cái hình tròn mình vẽ chỉ mang tính ước chừng mà thôi , chưa chắc chính xác được
________________________________________________________________________________________________
. . . . . . . . . . . . .. .


Return to “[VB] Ứng dụng - Form và Control”

Who is online

Users browsing this forum: No registered users and 0 guests