Hỏi: Hiển thị thông tin khi chỉ chuột vào CommandButton (1 người xem)

  • Thread starter Thread starter pro8x
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

pro8x

Thành viên hoạt động
Tham gia
3/11/11
Bài viết
142
Được thích
24
Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah
 

File đính kèm

Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah
Thử một phương án khác, dùng tạm một cái Label để chứa thông tin và sử dụng sự kiện MouseMove để ẩn/hiện Label này.
Bạn tham khảo trong file nhé.
 

File đính kèm

Upvote 0
Cảm ơn anh đã hướng dẫn, nhưng có cách khác không ạ, bởi vì file của em có tất cả 26 botton và mỗi botton lịa tương ứng với ghi chú ở 1 cell nhất định, nếu dùng label thì phẩi thêm nhiều Label lắm.
File e gửi 4r là file ví dụ ạ
 
Upvote 0
Cảm ơn anh đã hướng dẫn, nhưng có cách khác không ạ, bởi vì file của em có tất cả 26 botton và mỗi botton lịa tương ứng với ghi chú ở 1 cell nhất định, nếu dùng label thì phẩi thêm nhiều Label lắm.
File e gửi 4r là file ví dụ ạ
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.

Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.
 
Upvote 0
Hi, e không rành về vụ này lắm, CommandButton và cell theo thứ tự tăng dấn từ 1 đến 26, anh có thể sửa lại code giúp e, hoặc giải thích kỹ hơn đc k, vì e chưa hiểu cách lấy dữ liệu vào Label1 như thế nào khi chuột chỉ và CommandButton thay đỏi
 
Upvote 0
ah, Có phải mỗi 1 CommandButton lại có 1 sụ kiện Mousemove không bác
 
Upvote 0
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.

Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.
Em thử test vào file của e thì có vấn đề như sau:
1. Vì độ dài ngắn ghi chú khác nhau dẫn đến Label hiển thị bị thay dổi rất xấu.
2. Label bị Button che khuất
3. Label không hiện thị ngay tại vị trí Button chỉ mouse
 
Upvote 0
Thì cũng chỉ cần dùng một cái Label đó thôi chứ làm gì phải dùng đến 26 cái luôn dữ vậy?!
Với bài này, tôi nghĩ là nếu biết dùng đến ClassModule thì code sẽ gọn gàng, tiếc là tôi mù tịt món này.

Ý tưởng là: Đặt tên các CommandButton theo thứ tự, chẳng hạn Cmd1, Cmd2,..., tương ứng với các ô chứa thông tin Z1, Z2,... Sau đó dựa vào số thứ tự trong tên CommandButton để xác định địa chỉ ô chứa thông tin. Hoặc nếu không thể bố trí tương ứng thứ tự tên như vậy thì có thể sử dụng câu lệnh Select Case để quyết định lấy thông tin từ ô nào đưa vào Label1. Hoặc cũng có thể đưa địa chỉ ô chứa thông tin vào thuộc tính Tag của mỗi CommandButton này rồi dựa vào thuộc tính này để lấy thông tin.

giúp sức với bác 1 tay -0-/., hehe

Link: https://www.mediafire.com/?83vl1siqsdlo8la
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, đúng cài mình cần, cho mình hỏi thêm là có thể Fix kích thước của Label khi hiển thị không nhỉ, Còn vụ Label hiển thị bị Button che khuất nũa bạn

 
Upvote 0
ah, Có phải mỗi 1 CommandButton lại có 1 sụ kiện Mousemove không bác
Nếu không biết dùng ClassModule thì nó là như vậy, còn nếu biết dùng thì tất cả gom lại thành 1 sự kiện được khai báo trong ClassModule. Thú thật là nãy giờ tôi nghiên cứu topic này mà chưa "làm ăn" được gì với nó cả: Dùng Class Module để tạo sự kiện người dùng (như trên tôi đã nói là tôi mù tịt món này).
Em thử test vào file của e thì có vấn đề như sau:
1. Vì độ dài ngắn ghi chú khác nhau dẫn đến Label hiển thị bị thay dổi rất xấu.
2. Label bị Button che khuất
3. Label không hiện thị ngay tại vị trí Button chỉ mouse
1. Bạn nới rộng kích thước Label thêm cho phù hợp là được.
2. Bạn thêm câu lệnh .ZOrder vào trong câu lệnh With LblTip là được.
3. Không hiện ngay đó là do tôi đặt .Left = X + 50 : .Top = Y. Bạn chỉnh 2 câu lệnh này cho phù hợp là được.
 
Upvote 0
Xin chào mọi người trên 4r. Em có làm 1 form và khi di chuột vào botton trên form sẽ hiện thông tin ( Kiểu như comment trên cell vậy), Hiện tại em dang dùng Controltiptext nhưng có vấn đề là kiểu hiển thị này chỉ hiển thị trên 1 dòng, nếu thông tin dai thì sẽ rất khó xem, Mọi người chỉ em cách để hiển thị dưới dạng hình vuuông như comment trên cell được không ah

Mọi người định chơi class thì ta chơi ToolTip.

Làm chơi chút.
Thực ra tôi đã chơi từ lâu lắm rồi, từ hồi còn nghịch Delphi.

Tìm hiểu thêm trên trang

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760250(v=vs.85).aspx

Có những code ví dụ, hướng dẫn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mọi người định chơi class thì ta chơi ToolTip.

Làm chơi chút.
Thực ra tôi đã chơi từ lâu lắm rồi, từ hồi còn nghịch Delphi.

Tìm hiểu thêm trên trang

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760250(v=vs.85).aspx

Có những code ví dụ, hướng dẫn.
Thiệt tình thì em không đủ trình để hiểu code trong file, nhưng mà em tải file về, mở Form lên, di chuyển chuột khắp nơi mà không thấy động tĩnh gì cả. Nhờ bác chỉ giúp cách khắc phục.
Cảm ơn bác!
 
Upvote 0
Anh NGHIAPHUC em mở file và thấy chạy bình thường mà, anh thử tải lại xem. Thank bạn siwtom nhé, rất đẹp
 
Upvote 0
à các anh cho e hỏi thêm chút, liệu có thể cho hiện ảnh thay vì chữ được không nhỉ ( trên cell là đường dẫn ảnh để tự load, hoặc chèn ảnh vào cell rùi load lên => Cái này e làm được, nên nếu được thì hướng dẫn em phần load lên trên form)
 
Upvote 0
Mình mở cũng không thấy động tĩnh gì, có phải là thiếu Controls gì không nhỉ?
Thiệt tình thì em không đủ trình để hiểu code trong file, nhưng mà em tải file về, mở Form lên, di chuyển chuột khắp nơi mà không thấy động tĩnh gì cả. Nhờ bác chỉ giúp cách khắc phục.
Cảm ơn bác!

Lạ hen, cũng là file đó, có máy thấy có máy không. Máy của anh hoạt động bình thường!
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    22.2 KB · Đọc: 105
Upvote 0
Mình mở cũng không thấy động tĩnh gì, có phải là thiếu Controls gì không nhỉ?

Không phải.
Nói nôm na thì như thế này. ToolTop có thể tạo bằng nhiều cách. Trước tiên phải tạo một cửa sổ và nó sẽ quản lý các tool. Những tool này phải thêm vào tập các tool quản lý bởi cái cửa sổ kia. Có nhiều cách tạo tool. Tôi dùng cách như sau:
Nếu trong vùng client area của một cửa sổ nào đó ta muốn hiển thị tooltip thì ta cho thuộc tính hWnd của cấu trúc tagTOOLINFOW = handle của cửa sổ đó. Tiếp theo ta thiết lập thuộc tính rc của cấu trúc trên = vùng hình chữ nhật trong client area (thiết lập tọa độ (x, y) của góc trái bên trên và góc phải bên dưới) của cửa sổ có handle là hWnd. Và thiết lập thuộc tính lpszText = text cần hiển thị. Sau đó ta thêm tool có các thuộc tính như thế vào tập tool quản lý bởi cửa sổ tạo ban đầu. Do có 3 thông tin là hWnd, rc và lpszText nên "người quản lý" tool biết là khi trỏ chuột "đi vào" vùng có tọa độ được xác định bởi rc trong cửa sổ có handle là hWnd thì nó phải hiển thị tooltip có text = lpszText. Và khi trỏ chuột "đi ra khỏi" vùng rc thì nó phải "tắt" tooltip.
Nếu ta cần hiển thị những text khác nhau khi trỏ chuột đi vào những vùng khác nhau trong client area của cửa sổ có handle là hWnd thì với mỗi vùng ta tạo và thêm 1 tool với rc (xác định vùng hình chữ nhật) và lpszText (text cần hiển thị) khác nhau.

UserForm có class là "ThunderDFrame" (Office >= 2000). Vùng client area lại có một cửa sổ con (con của cửa sổ "ThunderDFrame") và trên nó các CommandButton, ComboBox, Image được vẽ. Ta phải thiết lập handle của cửa sổ con này cho thuộc tính hWnd kể trên.

Tôi kiểm tra trên XP Home Edition và Excel 2007 thì cửa sổ con có class là "F3 Server 60000000"

Tôi cũng đã kiểm tra trên Excel 2007 nhưng Windows 7 Starter thì cửa sỗ con không có class là "F3 Server 60000000". Vì thế không tìm thấy cửa sổ con nếu ta tìm theo class "F3 Server 60000000". Kết quả là tool của ta không có giá trị.

Tôi kiểm tra thì với Excel 2007 + Windows 7 Starter thì cửa sổ con có class là "F3 Server 6a070000"
Nếu tìm cửa sổ con có class như thế thì tooltip hiển thị bình thường.
------------
Tôi sửa code: trước tiên tìm cửa sổ con có class là "F3 Server 60000000", nếu không tìm thấy thì tìm cửa sổ con có class là "F3 Server 6a070000"

Chỉ có một nỗi lo là class của cửa sổ con thay đổi liên tục thì rách việc quá. Lúc đó có lẽ không tìm theo class mà tìm "con đầu lòng" chăng?

Tôi đã gửi lại tập tin ở bài #11. Bạn và bạn nghiaphuc kiểm tra và thông báo cho tôi nhé.
 
Upvote 0
Không phải.
Nói nôm na thì như thế này. ToolTop có thể tạo bằng nhiều cách. Trước tiên phải tạo một cửa sổ và nó sẽ quản lý các tool. Những tool này phải thêm vào tập các tool quản lý bởi cái cửa sổ kia. Có nhiều cách tạo tool. Tôi dùng cách như sau:
Nếu trong vùng client area của một cửa sổ nào đó ta muốn hiển thị tooltip thì ta cho thuộc tính hWnd của cấu trúc tagTOOLINFOW = handle của cửa sổ đó. Tiếp theo ta thiết lập thuộc tính rc của cấu trúc trên = vùng hình chữ nhật trong client area (thiết lập tọa độ (x, y) của góc trái bên trên và góc phải bên dưới) của cửa sổ có handle là hWnd. Và thiết lập thuộc tính lpszText = text cần hiển thị. Sau đó ta thêm tool có các thuộc tính như thế vào tập tool quản lý bởi cửa sổ tạo ban đầu. Do có 3 thông tin là hWnd, rc và lpszText nên "người quản lý" tool biết là khi trỏ chuột "đi vào" vùng có tọa độ được xác định bởi rc trong cửa sổ có handle là hWnd thì nó phải hiển thị tooltip có text = lpszText. Và khi trỏ chuột "đi ra khỏi" vùng rc thì nó phải "tắt" tooltip.
Nếu ta cần hiển thị những text khác nhau khi trỏ chuột đi vào những vùng khác nhau trong client area của cửa sổ có handle là hWnd thì với mỗi vùng ta tạo và thêm 1 tool với rc (xác định vùng hình chữ nhật) và lpszText (text cần hiển thị) khác nhau.

UserForm có class là "ThunderDFrame" (Office >= 2000). Vùng client area lại có một cửa sổ con (con của cửa sổ "ThunderDFrame") và trên nó các CommandButton, ComboBox, Image được vẽ. Ta phải thiết lập handle của cửa sổ con này cho thuộc tính hWnd kể trên.

Tôi kiểm tra trên XP Home Edition và Excel 2007 thì cửa sổ con có class là "F3 Server 60000000"

Tôi cũng đã kiểm tra trên Excel 2007 nhưng Windows 7 Starter thì cửa sỗ con không có class là "F3 Server 60000000". Vì thế không tìm thấy cửa sổ con nếu ta tìm theo class "F3 Server 60000000". Kết quả là tool của ta không có giá trị.

Tôi kiểm tra thì với Excel 2007 + Windows 7 Starter thì cửa sổ con có class là "F3 Server 6a070000"
Nếu tìm cửa sổ con có class như thế thì tooltip hiển thị bình thường.
------------
Tôi sửa code: trước tiên tìm cửa sổ con có class là "F3 Server 60000000", nếu không tìm thấy thì tìm cửa sổ con có class là "F3 Server 6a070000"

Chỉ có một nỗi lo là class của cửa sổ con thay đổi liên tục thì rách việc quá. Lúc đó có lẽ không tìm theo class mà tìm "con đầu lòng" chăng?

Tôi đã gửi lại tập tin ở bài #11. Bạn và bạn nghiaphuc kiểm tra và thông báo cho tôi nhé.
Bác ơi con đã test thử! không thấy có hiệu ứng gì bác ạ!
Bác xem video đính kèm nhé!
 

File đính kèm

Upvote 0
Bác ơi con đã test thử! không thấy có hiệu ứng gì bác ạ!
Bác xem video đính kèm nhé!

Bạn có thể giúp tôi được không?

1. Tải ReadClass.rar về và bung ra.
2. Nếu bạn có Visual Basic thì tự compile project. Nếu không thì đã có ReadClass.exe rồi.
3. Chạy ReadClass.exe
4. Mở tập tin ở bài #11
5. Đặt UserForm và ReadClass.exe ở bên cạnh nhau rồi đưa trỏ chuột vào vd. Image
5. Bạn chụp màn hình và gửi để tôi xem. Hoặc bạn ghi lại ở dòng thứ 2 nó viết là ClassName gì.

Mà bạn dùng Excel, Windows nào đấy?

À, bạn test thế nào đấy? Video chạy nhanh nên tôi không biết bạn có dừng không. Bạn đưa trỏ chuột vào Image, hoặc CommandButton hoặc ComboBox rồi dừng một tí xem có gì hiển thị không. Không phải click gì cả.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
......................................
Tôi đã gửi lại tập tin ở bài #11. Bạn và bạn nghiaphuc kiểm tra và thông báo cho tôi nhé.
Lúc chiều em mở tập tin trước ở trên trường, xài Win XP và Excel 2010 thì chạy file lúc trước bình thường. Còn máy của em xài Win 7, Excel 2010 (cả 2 máy ở trường và ở nhà đều xài bản 32 bit) thì cả file trước và file này đều không thấy động tĩnh gì cả. Như vậy thì có lẽ là vấn đề ở chỗ "class của cửa sổ con" trong trường hợp này không phải là 2 giá trị "F3 Server 60000000" hay "F3 Server 6a070000".

Vậy làm cách nào để biết được giá trị này trong từng trường hợp cụ thể vậy bác?
 
Upvote 0
Lúc chiều em mở tập tin trước ở trên trường, xài Win XP và Excel 2010 thì chạy file lúc trước bình thường. Còn máy của em xài Win 7, Excel 2010 (cả 2 máy ở trường và ở nhà đều xài bản 32 bit) thì cả file trước và file này đều không thấy động tĩnh gì cả. Như vậy thì có lẽ là vấn đề ở chỗ "class của cửa sổ con" trong trường hợp này không phải là 2 giá trị "F3 Server 60000000" hay "F3 Server 6a070000".

Vậy làm cách nào để biết được giá trị này trong từng trường hợp cụ thể vậy bác?

Bạn xem hộ tôi bài #20 nhé.
 
Upvote 0
Bạn xem hộ tôi bài #20 nhé.
Dạ, cảm ơn bác, em gửi bài rồi mới đọc được bài #20. Em kiểm tra thì nó ra giá trị là "F3 Server 50140000". Em đã sửa lại và chạy được rồi, rất đẹp.
Xin cảm ơn bác nhiều!
 
Upvote 0
Bạn có thể giúp tôi được không?

1. Tải ReadClass.rar về và bung ra.
2. Nếu bạn có Visual Basic thì tự compile project. Nếu không thì đã có ReadClass.exe rồi.
3. Chạy ReadClass.exe
4. Mở tập tin ở bài #11
5. Đặt UserForm và ReadClass.exe ở bên cạnh nhau rồi đưa trỏ chuột vào vd. Image
5. Bạn chụp màn hình và gửi để tôi xem. Hoặc bạn ghi lại ở dòng thứ 2 nó viết là ClassName gì.

Mà bạn dùng Excel, Windows nào đấy?

À, bạn test thế nào đấy? Video chạy nhanh nên tôi không biết bạn có dừng không. Bạn đưa trỏ chuột vào Image, hoặc CommandButton hoặc ComboBox rồi dừng một tí xem có gì hiển thị không. Không phải click gì cả.

Dạ cảm ơn Bác con dùng Win7 Ofice 2010 Bác ạ!
Vâng bác xem đoạn video chậm hơn nhé!
[video=youtube;IBXiLsy1aDs]https://www.youtube.com/watch?v=IBXiLsy1aDs&feature=youtu.be[/video]
Còn mấy bước trên để thực hiện con chưa hiểu lắm, con sẽ từ từ thực hiện như Bác hướng dẫn rồi thông tin lại cho Bác biết.
--------------
Nếu có bạn nào rành thì test giúp mình mà cách Bác Siwtom đã chỉ nhé!
Xin Cảm ơn!
 
Upvote 0
Tô thử không đọc cửa sổ con theo class nữa mà đọc "con đầu lòng" của "ThunderDFrame"

Nhờ các bạn test hộ.
 

File đính kèm

Upvote 0
OK! đọc được rồi Bác ạ!hihi , con cảm Bác!
Con con gửi Bác cái hình lúc chưa được:
Test.jpg

Và lúc được:
Test2.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, cảm ơn bác, em gửi bài rồi mới đọc được bài #20. Em kiểm tra thì nó ra giá trị là "F3 Server 50140000". Em đã sửa lại và chạy được rồi, rất đẹp.
Xin cảm ơn bác nhiều!

Cảm ơn bạn.
Như thế thì không tìm theo danh sách nữa. Tức không dò 60000000, 6a070000 rồi 50140000. Như thế có mà chết.
Tôi thử đọc "con đầu lòng" của "ThunderDFrame"

Bạn test hộ tập tin ở bài #25
 
Upvote 0
--------------
Nếu có bạn nào rành thì test giúp mình mà cách Bác Siwtom đã chỉ nhé!
Xin Cảm ơn!
Bạn phải chạy file ReadClass.exe rồi mới rê chuột vào Form này, trong cửa sổ của ReadClass.exe sẽ hiện ra chuỗi này ở dòng thứ 2. Bạn gõ lại chuỗi này vào câu lệnh hChild = FindWindowEx(hForm, 0, "F3 Server 60000000", vbNullString), sẽ chạy được.

Bác siwtom ơi, vấn đề có vẻ như rắc rối rồi. Mỗi lần mở file ra, nó phát sinh một chuỗi khác nhau, vậy thì phải làm sao?

Lại gửi chậm nữa rồi! File mới #25 đã tốt rồi. Cảm ơn bác.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải chạy file ReadClass.exe rồi mới rê chuột vào Form này, trong cửa sổ của ReadClass.exe sẽ hiện ra chuỗi này ở dòng thứ 2. Bạn gõ lại chuỗi này vào câu lệnh hChild = FindWindowEx(hForm, 0, "F3 Server 60000000", vbNullString), sẽ chạy được.

Bác siwtom ơi, vấn đề có vẻ như rắc rối rồi. Mỗi lần mở file ra, nó phát sinh một chuỗi khác nhau, vậy thì phải làm sao?

Bạn test hộ tập tin bài #25 nhé
 
Upvote 0
ủa bài #25 cũng hiển thị giống bài 11 mà. À các bác cho em hỏi vụ thay chữ bằng ảnh với, liệu có được không nhỉ.
 
Upvote 0
ủa bài #25 cũng hiển thị giống bài 11 mà. À các bác cho em hỏi vụ thay chữ bằng ảnh với, liệu có được không nhỉ.
Có lẽ máy bạn xài Win XP nên file ở bài #11 (file ban đầu) đã có thể chạy bình thường rồi. Bạn thử chạy trên Win 7 xem nào, tôi tin là file ở bài #11 sẽ có thể chẳng có động tĩnh gì cả. Còn file ở bài #25 thì đã khắc phục được vấn đề này (thuật toán có hơi khác một chút so với file ở bài #11).

Còn vấn đề bạn hỏi, có lẽ phải chờ đến các cao thủ ra tay thôi, tôi thì chịu chết.
 
Upvote 0
ủa bài #25 cũng hiển thị giống bài 11 mà. À các bác cho em hỏi vụ thay chữ bằng ảnh với, liệu có được không nhỉ.
Tạo một Label, dùng sự kiện MouseMove trên form và các controls để LoadPicture lên Label đó, tôi nghĩ không khó đâu.
 
Upvote 0
À,các anh ơi có chút vấn đề nữa là nếu button lồng trong Frame thì k có tác dụng,hic, e mò mãi mà chưa sửa đc.mọi người chỉ thêm e với
 
Upvote 0
File ở bài #25 của simtw đó bạn,xem giúp m với
Ps. Truong bạn vào tạo chủ đề mới để đăng bài nhé
 
Upvote 0
À,các anh ơi có chút vấn đề nữa là nếu button lồng trong Frame thì k có tác dụng,hic, e mò mãi mà chưa sửa đc.mọi người chỉ thêm e với

1. Tôi tách CreateTipsWindow cũ thành 2 sub: sub CreateTipsWindow và sub AddTool
2. Trong UserForm_Initialize bạn phải gọi CreateTipsWindow để tạo cửa sổ quản lý các tool. Tiếp theo cần hiển thị tooltip cho Control nào thì gọi AddTool và truyền Control đó
Trước khi gọi AddTool thì phải nhập các text cần hiển thị vào Tag của control. Nói cho cùng có thể gọi AddTool cho tất cả các control trên UserForm nhưng chỉ có những control có Tag <> "" mới được thêm tool.
3. Code bổ sung để hiển thị cho cả ListBox, Frame. Tôi không thêm được cho TextBox.
 

File đính kèm

Upvote 0
1. Tôi tách CreateTipsWindow cũ thành 2 sub: sub CreateTipsWindow và sub AddTool
2. Trong UserForm_Initialize bạn phải gọi CreateTipsWindow để tạo cửa sổ quản lý các tool. Tiếp theo cần hiển thị tooltip cho Control nào thì gọi AddTool và truyền Control đó
Trước khi gọi AddTool thì phải nhập các text cần hiển thị vào Tag của control. Nói cho cùng có thể gọi AddTool cho tất cả các control trên UserForm nhưng chỉ có những control có Tag <> "" mới được thêm tool.
3. Code bổ sung để hiển thị cho cả ListBox, Frame. Tôi không thêm được cho TextBox.
Trên cái Page, rê con trỏ qua nút lệnh trên page1, nó có tooltip, song chọn vào page2 rồi quay lại page1, rê con trỏ qua nút lệnh, nó không có tooltip. Thầy xem lại thử xem.
 
Upvote 0
Trên cái Page, rê con trỏ qua nút lệnh trên page1, nó có tooltip, song chọn vào page2 rồi quay lại page1, rê con trỏ qua nút lệnh, nó không có tooltip. Thầy xem lại thử xem.

Ở điểm 3 bài #43 tôi có nói: "Code bổ sung để hiển thị cho cả ListBox, Frame"
Không phải vô cớ mà tôi không liệt kê MultiPage. Cũng có thể hiện được tooltip cho MultiPage nhưng chỉ khi trỏ chuột vào Page đang Active khi hiển thị Form. Khi chuyển sang Page khác rồi quay lại thì không còn tooltip nữa. ToolTip đặt trên Page cũng bị bệnh tương tự. Nguyên nhân là cửa sổ tạo ra cho mỗi Page (là cửa sổ con của MultiPage. MultiPage cũng là cửa sổ riêng biệt) được tạo ra một cách dynamic. Khi chuyển sang Page khác thì cửa sổ bị hủy và khi trở lại thì cửa sổ lại được tạo mới với Handle khác hẳn.
Vì nguyên nhân trên tôi không làm được cho Page.

Nếu cố tình làm thì phải bắt sự kiện "đổi Page" để làm cho Page vừa Active. Nhưng tôi không muốn làm. Bạn thử xem. Cũng chỉ là bắt sự kiện "đổi Page" và gọi AddTool cho CommandButton4 thôi mà. Đây là trường hợp riêng, mà code là tổng quát nên tôi không làm. Ai đó khi cần thì bắt sự kiện "đổi Page" và gọi AddTool. Cũng vì lẽ đó mà tôi tách AddTool ra riêng để lúc nào cần thì gọi.
 
Upvote 0
em xin cảm ơn mọi người đã quân tâm và hướng đãn, Hi file đúng với file của em rùi đáy bác siwtom ah.thank
 
Upvote 0
Ở điểm 3 bài #43 tôi có nói: "Code bổ sung để hiển thị cho cả ListBox, Frame"
Không phải vô cớ mà tôi không liệt kê MultiPage. Cũng có thể hiện được tooltip cho MultiPage nhưng chỉ khi trỏ chuột vào Page đang Active khi hiển thị Form. Khi chuyển sang Page khác rồi quay lại thì không còn tooltip nữa. ToolTip đặt trên Page cũng bị bệnh tương tự. Nguyên nhân là cửa sổ tạo ra cho mỗi Page (là cửa sổ con của MultiPage. MultiPage cũng là cửa sổ riêng biệt) được tạo ra một cách dynamic. Khi chuyển sang Page khác thì cửa sổ bị hủy và khi trở lại thì cửa sổ lại được tạo mới với Handle khác hẳn.
Vì nguyên nhân trên tôi không làm được cho Page.

Nếu cố tình làm thì phải bắt sự kiện "đổi Page" để làm cho Page vừa Active. Nhưng tôi không muốn làm. Bạn thử xem. Cũng chỉ là bắt sự kiện "đổi Page" và gọi AddTool cho CommandButton4 thôi mà. Đây là trường hợp riêng, mà code là tổng quát nên tôi không làm. Ai đó khi cần thì bắt sự kiện "đổi Page" và gọi AddTool. Cũng vì lẽ đó mà tôi tách AddTool ra riêng để lúc nào cần thì gọi.

Không thấy bạn Hoàng Trọng Nghĩa viết code gì nên tôiviết thêm.
1. Code chính có sửa chút để không SetFocus những Page không là active, đang ẩn.
2. Khi có MultiPage mà muốn có tooltip cho các control trên nó thì thêm code MultiPage1_Change mà tôi đã viết trong code của UserForm trong tập tin ví dụ. Cũng có thể sửa để chỉ gọi AddTool cho những control nằm trên Page đang active. Gọi cho tất cả cũng được nhưng code AddTool sẽ chỉ thêm tool cho những control nằm trên Page active.
3. Các control chắc chắn có quyền có tooltip là: ListBox, Frame, CommandButton, ComboBox, Image. Mọi người tự thử cho những standard control khác.
----------
Có 1 lỗi nhỏ.
Các tooltip không hiển thị icon và tiêu đề "Balloon tip của siwtom"

Nguyên nhân? Tôi thêm một số control và thêm cho chúng text hiển thị ở Sheet1. Vì thế text tiêu đề trước đó đang ở dòng 11 bị đẩy xuống dòng 14 (do tôi thêm dòng trống để nhập text cho các control). Tôi quên không sửa trong code ví dụ.

Sửa lại trong UserForm_Initialize dòng

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]11[/COLOR]").Value

thành

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]14[/COLOR]").Value
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không thấy bạn Hoàng Trọng Nghĩa viết code gì nên tôiviết thêm.
1. Code chính có sửa chút để không SetFocus những Page không là active, đang ẩn.
2. Khi có MultiPage mà muốn có tooltip cho các control trên nó thì thêm code MultiPage1_Change mà tôi đã viết trong code của UserForm trong tập tin ví dụ. Cũng có thể sửa để chỉ gọi AddTool cho những control nằm trên Page đang active. Gọi cho tất cả cũng được nhưng code AddTool sẽ chỉ thêm tool cho những control nằm trên Page active.
3. Các control chắc chắn có quyền có tooltip là: ListBox, Frame, CommandButton, ComboBox, Image. Mọi người tự thử cho những standard control khác.
----------
Có 1 lỗi nhỏ.
Các tooltip không hiển thị icon và tiêu đề "Balloon tip của siwtom"

Nguyên nhân? Tôi thêm một số control và thêm cho chúng text hiển thị ở Sheet1. Vì thế text tiêu đề trước đó đang ở dòng 11 bị đẩy xuống dòng 14 (do tôi thêm dòng trống để nhập text cho các control). Tôi quên không sửa trong code ví dụ.

Sửa lại trong UserForm_Initialize dòng

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]11[/COLOR]").Value

thành

Mã:
CreateTipsWindow Me, 1, Sheet1.Range("A[COLOR=#ff0000]14[/COLOR]").Value
Định thắc mắc, nhưng khi Test lại thì quá tuyệt vời! Khi Form đặt sát trên cùng màn hình thì cái "góc" hướng về Control nó cũng tự đão chiều xuống dưới! Quá hay luôn! Thank Thầy siwtom!
 
Lần chỉnh sửa cuối:
Upvote 0
Em có một thắc mắc:

Mã:
Private Type [COLOR=#ff0000][B]tagInitCommonControlsEx[/B][/COLOR]
    dwSize As Long
    dwICC As Long
End Type

và:

Mã:
Sub CreateTipsWindow(form As Object, ByVal hIcon As Long, ByVal Title As String)
Dim iccex As tagInitCommonControlsEx


    iccex.dwSize = Len([COLOR=#ff0000][B]tagInitCommonControlsEx[/B][/COLOR])
'....


Tại sao cũng có thể đo chiều dài của chuỗi lên một Type được vậy ạ? Nhưng rõ ràng, iccex.dwSize nếu có kết quả nó cũng bằng 0, vì thế không cần câu này (iccex.dwSize = Len(tagInitCommonControlsEx)) cũng được mà?

Nhờ Thầy giải thích việc này giúp em ạ! Xin cám ơn.
 
Upvote 0
Định thắc mắc, nhưng khi Test lại thì quá tuyệt vời! Khi Form đặt sát trên cùng màn hình thì cái "góc" hướng về Control nó cũng tự đão chiều xuống dưới! Quá hay luôn! Thank Thầy siwtom!

1. Có một chút nhầm lẫn. Phải là
Mã:
iccex.dwSize = Len(iccex)

Tôi nhầm vì quen bên Delphi.
Trong Delphi thì
Mã:
iccex.dwSize := SizeOf([COLOR=#ff0000]tagINITCOMMONCONTROLSEX[/COLOR]);

và

Mã:
iccex.dwSize := SizeOf([COLOR=#ff0000]iccex[/COLOR]);

đều được.

2. Tôi xác định dwSize do thói quen làm bài bản thôi. Trong rất nhiều khi gọi hàm API và có thông số là cấu trúc thì trước khi gọi phải thiết lập một loạt trường của cấu trúc đó mà dwSize, tức độ lớn của cấu trúc, thường phải thiết lập.

3.
Tại sao cũng có thể đo chiều dài của chuỗi lên một Type được vậy ạ?

Tôi không hiểu câu hỏi. Tại sao dùng LEN? LEN đâu có chỉ dùng với STRING?

Returns a Long containing the number of characters in a string or the number of bytes required to store a variable
...
Type CustomerRecord ' Define user-defined type.
ID As Integer ' Place this definition in a
Name As String * 10 ' standard module.
Address As String * 30
End Type

Dim Customer As CustomerRecord ' Declare variables.
Dim MyInt As Integer, MyCur As Currency
Dim MyString, MyLen
MyString = "Hello World" ' Initialize variable.
MyLen = Len(MyInt) ' Returns 2.
MyLen = Len(Customer) ' Returns 42.
MyLen = Len(MyString) ' Returns 11.
MyLen = Len(MyCur) ' Returns 8.

4.
Khi Form đặt sát trên cùng màn hình thì cái "góc" hướng về Control nó cũng tự đão chiều xuống dưới!

Thì thằng tooltip vốn nó là thế. Nó luôn xác định chỗ trống để hiển thị. Nếu có nhiều khả năng thi nó sẽ chọn "bên trên bên phải"
 
Upvote 0
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.

Riêng với ActiveX Control, ta dùng sự kiện MouseMove để hiện TooltipText là đơn giản nhất
 
Upvote 0
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.

Tôi không hiểu cái drag của bạn. Nếu bạn nhấn chuột phải vd. shape và kéo shape sang chỗ khác thì tôi hiểu là drag. Nhưng ở đây có lẽ bạn không kéo gì cả. Bạn chỉ muốn khi trỏ chuột đi vào shape thì sẽ có tooltop hiển thị?

Làm việc trong Excel rất khó vì các control không có handle, không là các window theo cách hiểu của Windows. Một số còn không có cả MouseMove. Sheet cũng không có MouseMove. Ở đây hơi khác với UserForm vì các control trên Form thường không thay đổi tọa độ của mình trong hệ tọa độ của Form. Trên sheet ta có thể cuộn sheet lên xuống, phải trái. Tôi chưa rõ sẽ có ảnh hưởng gì.

Tốt nhất là bạn gửi tập tin có những shape bạn cần và text tooltip của từng shape. Từ nay tới chủ nhật nếu có nhiều thời gian rỗi thì tôi sẽ nghiên cứu.
 
Upvote 0
Cái này em sẽ nghiên cứu, vậy với shapes và Form controls thì sao anh em nghĩ code trên chỉ cần chế biến lại sẽ được vì hàm API hơi khó đói với em ;;;;;;;;;;;

Tôi thì luôn thích cái gì đơn giản và code phải "vừa tầm" với ứng dụng
Đối với Shape ta có thể dùng tí "mẹo" như topic này:

http://www.giaiphapexcel.com/forum/showthread.php?86052-L%C3%A0m-th%E1%BA%BF-n%C3%A0o-%C4%91%E1%BB%83-bi%E1%BA%BFt-%C4%91%C6%B0%E1%BB%A3c-t%C3%AAn-Label-%28ActiveX-Control%29-khi-Mousemove-%C4%91%E1%BA%BFn-Label&highlight=

Hoặc cao cấp hơn chút, có thể tham khảo bài này:
http://www.mrexcel.com/forum/excel-questions/194053-changing-shape-fill-color-mouseover.html
Nói cho cùng thì cái ta cần là tạo ra sự kiện MouseMove cho Shape, có sự kiện ấy rồi, muốn gì chả được
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu em muốn hiện tooltip khi drag chuột trên shapes hoặc trên các button của form controls hoặc ActiveX Controls trực tiếp của Sheet mình sửa đoạn code trên lại chỗ nào vậy chú Switom. Không biết có phải viết lại toàn bộ hay không vậy Chú? Vì e có biết cách dùng Hyperlink của form controls hoặc insert comment cho vừa ô chứa shapes, form controls,ActiveX cũng có thể tạo Tooltip như nó không được hay cho lắm!
Xin cảm ơn./.

Do bạn không phản hồi nên tôi tự thiết kế tập tin.
Hiện thời tôi dùng hook mouse để theo dõi chuột và tùy theo nó có vào và vào shape nào để hiển thị hoặc ẩn tooltip. Tôi dùng hook mouse do những Forms controls không có mousemove.

Text hiển thị cho từng control được nhập vào AlternativeText

Thực tình là tôi không thích hook. Nhất là hook từ khi mở tập tin cho tới tận khi đóng tập tin. Trong suốt quá trình đó user có thể thao tác rất nhiều, ở nhiều cửa sổ, hộp thoại, vào VBE v...v. Ngoài ra làm trong Excel thì phụ thuộc vào Excel, khó làm chủ code hoàn toàn được. Khi ta viết phần mềm thì ta viết code từ A đến Z nên ta chủ động được. Còn đây là chạy nhờ code trong Excel. Hook là trò chơi cao cấp nhưng chỉ cần sơ xuất nhỏ thì phần mềm bị treo ngay.

Nếu tôi tìm được cách khác như tooltip trên Form thì tôi sẽ thông báo. Code trên Form là code an toàn. Cùng lắm nếu có sự cố thì tooltip không hiển thị. Thế thôi
 

File đính kèm

Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Do bạn không phản hồi nên tôi tự thiết kế tập tin.
Hiện thời tôi dùng hook mouse để theo dõi chuột và tùy theo nó có vào và vào shape nào để hiển thị hoặc ẩn tooltip. Tôi dùng hook mouse do những Forms controls không có mousemove.

Text hiển thị cho từng control được nhập vào AlternativeText

Thực tình là tôi không thích hook. Nhất là hook từ khi mở tập tin cho tới tận khi đóng tập tin. Trong suốt quá trình đó user có thể thao tác rất nhiều, ở nhiều cửa sổ, hộp thoại, vào VBE v...v. Ngoài ra làm trong Excel thì phụ thuộc vào Excel, khó làm chủ code hoàn toàn được. Khi ta viết phần mềm thì ta viết code từ A đến Z nên ta chủ động được. Còn đây là chạy nhờ code trong Excel. Hook là trò chơi cao cấp nhưng chỉ cần sơ xuất nhỏ thì phần mềm bị treo ngay.
Chú Switom viết rất đúng ý con, đúng nhưng CHú nói khi thao tác liên quan tới hộp thoại, vào VBE, hoặc Design Form thì Excel có thể bị lỗi khỏi động lại hoặc không hiện Tooltip có lẽ liên quan tới Hook
Nếu tôi tìm được cách khác như tooltip trên Form thì tôi sẽ thông báo. Code trên Form là code an toàn. Cùng lắm nếu có sự cố thì tooltip không hiển thị. Thế thôi
Nếu được thì CHú chỉ giúp còn không được mình dùng cái khác vì thấy chủ đề này hiện tooltip thấy hay và liên quan tới hàm API thấy hay nên con muốn học hỏi thêm

Nói cho cùng thì cái ta cần là tạo ra sự kiện MouseMove cho Shape, có sự kiện ấy rồi, muốn gì chả được
Em đã Test thử sao nó hiện đen thui thấy cũng lạ, khi chế biến thành công em sẽ gửi lên diễn đàn tham khảo . Anh NDU xem giúp em file đính kèm không biết có sai chỗ nào không
 
Upvote 0
Em đã Test thử sao nó hiện đen thui thấy cũng lạ, khi chế biến thành công em sẽ gửi lên diễn đàn tham khảo . Anh NDU xem giúp em file đính kèm không biết có sai chỗ nào không

Tôi test bình thường nha:


[video=youtube;KBYXXGhwHEk]https://www.youtube.com/watch?v=KBYXXGhwHEk&feature=youtu.be[/video]
 
Upvote 0
Tôi test bình thường nha:
Em cũng test giống anh như mà khi con trỏ chuột đi chỗ khác là nó đen textbox? Vậy mình có thể sửa chỗ nào, các đoạn code trên đã đáp ứng được yêu cầu tooltip chỉ còn vài vướn mắc nhỏ có thể bị reset lại excel e sẽ cải thiện lại.
 
Upvote 0
Em cũng test giống anh như mà khi con trỏ chuột đi chỗ khác là nó đen textbox? Vậy mình có thể sửa chỗ nào, các đoạn code trên đã đáp ứng được yêu cầu tooltip chỉ còn vài vướn mắc nhỏ có thể bị reset lại excel e sẽ cải thiện lại.
Theo mình thì đen thui tại vì đoạn
Mã:
Private Sub MyShapeEvents_ShapeExit(Sh As Shape)
 Select Case Sh.Name
 Case "Rectangle 1"
 Sh.Fill.ForeColor.SchemeColor = 64
 Sh.TextFrame.Characters.Text = ""
 Sh.Line.Weight = 1#
 Sh.Line.ForeColor.SchemeColor = 64
 End Select
End Sub

Cái này hay thật bởi nó bắt được sự kiện MouseMove trên shape nên sẽ xử lý trực tiếp khi có sự kiện MouseMove xảy ra.
 
Upvote 0
Theo mình thì đen thui tại vì đoạn
Cái này hay thật bởi nó bắt được sự kiện MouseMove trên shape nên sẽ xử lý trực tiếp khi có sự kiện MouseMove xảy ra.
Cảm ơn dhn chép vào mà không đọc code ặc...ặc...Tóm lại mình nghĩ bắt được MouseMove là sẽ làm gì cũng được bây giờ có thể chế biến code khác được rồi
 
Upvote 0
Ngồi mày mò thử áp dụng Code bác Siwtom với bài #56 cũng thấy hay thật.
 

File đính kèm

Upvote 0
Change code này để màu cho đẹp hơn

Mã:
Private Sub MyShapeEvents_ShapeExit(Sh As Shape)
 Select Case Sh.Name
 Case "Rectangle 1"
 Sh.Fill.ForeColor.SchemeColor = 40
 Sh.TextFrame.Characters.Text = "This is a shape"
 Sh.Line.Weight = 6#
 Sh.Line.ForeColor.SchemeColor = 40
 End Select
End Sub
 
Upvote 0
Code này em chạy trên office 2010 báo lỗi anh ạ.
Nếu File bài #56 của bạn nmhung49 mở trên máy của bạn không bị lỗi thì lỗi bạn nêu tại bài #63 thì tôi không rõ nguyên nhân bởi dòng Code lỗi đó đều lấy từ Class bài #56

dhn46 cũng chỉ "mò" thôi chứ có hiểu API đâu.
Đọc Code bài bác Siwtom nhận ra rằng sub CreateTipsWindow để tạo Tooltip dựa trên hWnd của đối tượng sau đó truyền tham số vào ti.hwnd

Việc lấy hWnd của đối tượng được thông qua hàm WindowFromPoint dựa trên vị trí con chuột khi move trên đối tượng trong khi Code bài #56 bắt được sự kiện Move chuột qua đối tượng trên Form => Chắp vá code theo nguyên tắc:

- Bước 1: Lấy hWnd của đối tượng để truyền vào sub CreateTipsWindow như vậy cần khai báo 2 hàm
WindowFromPoint và GetCursorPos. Edit sub CreateTipsWindow của bác Siwtom 1 chút để phù hợp với đối tượng trên Sheet

- Bước 2: Gọi sub CreateTipsWindow khi xảy ra sự kiện move chuột qua Object => chính là sự kiện MyShapeEvents_ShapeEnter

- Bước 3 hủy Tooltip khi Move chuột ra khỏi Object => sử dụng DestroyToolTip của bác Siwtom

Nói tóm lại: Code bài #61 dựa trên yếu tố "mò" là chủ yếu chứ dhn46 chưa có hiểu ^^. Thôi bạn đợi các cao thủ khác trả lời nhé.
 
Upvote 0
Ngồi mày mò thử áp dụng Code bác Siwtom với bài #56 cũng thấy hay thật.

Trong trường hợp này bạn có thể, và nên dùng "kỹ thuật" tại bài #54

Trong bài #45 và bài #54 có 2 "kỹ thuật" khác nhau. Các bạn đọc code thì sẽ thấy chỗ khác.

Để tiết kiệm thời gian cho các bạn thì tôi nêu các điểm chính:

0. Dù dùng kỹ thuật gì chăng nữa thì phải tạo cửa sổ ToolTip (dùng CreateWindowEx). Nó sẽ quản lý các tool được thêm vào. Ta cũg thiết lập mầu chữ, mầu nền, chiều rộng, delay.

Nếu ta cần bao nhiêu tool thì phải thêm vào bấy nhiêu tool (SendMessage ToolTipsHandle, TTM_ADDTOOLW, 0, ti). Trong bài #45 cứ mỗi control trên Form thì ta thêm 1 tool.

1. Kỹ thuật trong bài #45
Ta thiết lập cho mỗi tool cần thêm vào:
Mã:
ti.hwnd = [COLOR=#ff0000]handle của cửa sổ nào đó[/COLOR]

Ta định nghĩa những vùng hình chữ nhật, mỗi vùng cho 1 tool. Vùng được xác định trong hệ tọa độ của client area của cửa sổ có handle đỏ đỏ ở trên. Giả dụ vùng có góc trên bên trái là (100, 200) và chiều rộng là 250, chiều cao là 30 thì
Mã:
ti.rc.Left = 100
ti.rc.Top = 200
ti.rc.Right = 100 + 250 = 350
ti.rc.Bottom = 200 + 30 = 230

Chú ý là các giá trị phải tính bằng Pixels

Sau khi đã thêm các tool thì control tooltip sẽ chịu trách nhiệm theo dõi vị trí của trỏ chuột. Nếu trỏ chuột ở trong cửa sổ có handle đỏ đỏ và đồng thời đi vào vùng nào đó đã được định nghĩa thì control tooltip sẽ hiển thị tool được gán cho vùng đó. Khi control tooltip phát hiện trỏ chuột sau đó đi ra khỏi vùng thì nó sẽ ẩn tool trước đó được hiển thị do trỏ chuột đi vào vùng.

Nói ngắn gọn thì ta định nghĩa các vùng cần hiển thị tooltip còn việc theo dõi trỏ chuột đi vào vùng nào, ra khỏi vùng nào để hiển thị hoặc ẩn tip thì do control tooltip đảm nhiệm.

2. Kỹ thuật trong bài #54
Trong kỹ thuật này thì ta không định nghĩa vùng nào cả. Dĩ nhiên trong trường hợp này thì control tooltip không theo dõi trỏ chuột. Thậm chí nếu muốn thì nó cũng không biết phải theo dõi vùng nào. Trong trường hợp này tự ta phải hiển thị và ẩn tooltip. Nhưng cũng do vậy mà ta có nhiều lựa chọn hơn: hiển thị bất cứ khi nào ta muốn, bất cứ tại đâu trên màn hình, không nhất thiết phải ở vị trí trỏ chuột.

Trong tập tin đính kèm tôi dùng kỹ thuật ở bài #54 nhưng code cần thiết tôi để riêng trong 1 module.
Khi mở tập tin thì nhấn nút "Create tooltip". Sau đó nhấn nút "Show tip" liên tục để thấy là cứ mỗi lần nhấn thì tooltip hiển thị ở một vị trí ngẫu nhiên trên màn hình. Khi nào mỏi tay thì nhấn "Destroy tooltip" để dọn đồ chơi.
--------------
Trong trường hợp của bạn thì

0. Thêm module1 có trong tập tin đính kèm.

1. Tạo control tooltip 1 lần, vd. khi mở tập tin.
Mã:
CreateToolTip 1, tiêu đề

2. Hủy control 1 lần, vd khi đóng tập tin
Mã:
DestroyToolTip

3. Trong sự kiện Enter (thay cho nhấn nút "Show tip")
Mã:
ShowTip text, x, y, TRUE

Bạn sẽ hiển thị tại vị trí trỏ chuột nên sẽ dùng hàm GetCursorPos để đọc tọa độ x, y

4. Trong sự kiện Exit
Mã:
ShowTip text, x, y, FALSE

text, x, y tùy ý vì không dùng tới. Vd. gọi ShowTip "", 0, 0, FALSE
--------------
Về tiêu đề của tooltip thì nếu tiêu đề = "" thì tip hiển thị không có tiêu đề. Icon dù có nhập thì cũng chỉ hiển thị khi có tiêu đề.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu File bài #56 của bạn nmhung49mở trên máy của bạn không bị lỗi thì lỗi bạn nêu tại bài #63 thì tôi không rõ nguyên nhân bởi dòng Code lỗi đó đều lấy từ Class bài #56

dhn46 cũng chỉ "mò" thôi chứ có hiểu API đâu.
Đọc Code bài bác Siwtom nhận ra rằng sub CreateTipsWindow để tạo Tooltip dựa trên hWnd của đối tượng sau đó truyền tham số vào ti.hwnd

Việc lấy hWnd của đối tượng được thông qua hàm WindowFromPoint dựa trên vị trí con chuột khi move trên đối tượng trong khi Code bài #56 bắt được sự kiện Move chuột qua đối tượng trên Form => Chắp vá code theo nguyên tắc:

- Bước 1: Lấy hWnd của đối tượng để truyền vào sub CreateTipsWindow như vậy cần khai báo 2 hàm
WindowFromPoint và GetCursorPos. Edit sub CreateTipsWindow của bác Siwtom 1 chút để phù hợp với đối tượng trên Sheet

- Bước 2: Gọi sub CreateTipsWindow khi xảy ra sự kiện move chuột qua Object => chính là sự kiện MyShapeEvents_ShapeEnter

- Bước 3 hủy Tooltip khi Move chuột ra khỏi Object => sử dụng DestroyToolTip của bác Siwtom

Nói tóm lại: Code bài #61 dựa trên yếu tố "mò" là chủ yếu chứ dhn46 chưa có hiểu ^^. Thôi bạn đợi các cao thủ khác trả lời nhé.

Xin đọc bài #66 có giải thích về các cách

Kỹ thuật trong bài #54 không cần thiết lập hwnd, không cần tới handle hwnd

Tại sao trong bài #45 cần hwnd? Vì khi ta xác định vùng thì chỉ là tọa độ đơn thuần (Left, Top, Right, Bottom). Nếu có 2 cửa sổ với handle hwnd1 và hwnd2 thì khi trỏ chuột đi vào vùng ở cửa sổ hwnd1 thì control tooltip phải hiển thị tip hay khi đi vào cũng vùng như thế (có toạ độ như thế) nhưng ở cửa sổ hwnd2 thì control tooltip phải hiển thị tip? Chính vì thế mà phải thiết lập cả hwnd (ti.hwnd). Lúc đó control tooltip sẽ vào cuộc khi và chỉ khi trỏ chuột đi vào vùng có tọa độ "như thế như thế" trong cửa sổ có handle là ti.hwnd.

Trong kỹ thuật ở bài #54 thì control tooptip không theo dõi trỏ chuột. Lúc nào ta cần hiển thị tip thì hiển thị thôi. Chuyện hiển thị không phụ thuộc vào vị trí trỏ chuột, không phụ thuộc vào cửa sổ nào cả. Hiển thị lúc nào, ở đâu là do ta muốn thôi. Ví dụ ta bật đồng hồ và đọc vị trí trỏ chuột (GetCursorPos) rồi xác định class của cửa sổ dưới trỏ chuột (WindowFromPoint + GetClassName). Nếu đó là cửa sỗ notepad (class = "notepad") thì hiển thị tip (ShowTip) ở vd. góc trái bên trên của màn hình. Hoặc ta cũng có thể kiểm tra thời gian. Nếu là 12:30 giờ (giờ ăn trưa, cà phê tâm sự?) thì hiển thị tip tại giữa màn hình. Trong trường hợp này thì tip chả liên quan tới vùng hay cửa sổ nào cả. Thích lúc nào thì hiển thị, và hiển thị ở đâu tùy theo hứng. Chính vì thế nếu bạn sửa CreateTipsWindow tức bạn chưa hiểu được triết lý của kỹ thuật trong bài #54.

Cũng chính vì thế mà chỉ cần trong Enter gọi ShowTip + TRUE và trong Exit gọi ShowTip + FALSE. Thế thôi. Chả liên quan gì tới handle ti.hwnd cả. Nhưng khi thêm tool (SendMessage ToolTipsHandle, TTM_ADDTOOLW, 0, ti) thì có
Mã:
ti.uFlags = TTF_TRACK
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ đúng rồi bác Siwtom, dhn46 mới chỉ biết biến đổi bài #45 chút xíu để vooc API một chút chứ chưa có tìm hiểu. Cái này chắc còn phải tìm hiểu dài dài ^^ bác nhỉ? Qua những bài viết trên diễn đàn và đặc biệt là những bài của bác dhn46 đã biết cách biến đổi một số Code phục vụ công việc của mình, hy vọng là tương lai sẽ biết biến đổi nhiều hơn nữa.

Cảm ơn bác, cảm ơn GPE!
 
Upvote 0
Bác Siwtom sửa giúp code trên để khi di chuột vào khoảng 2s thì mới hiện thông báo với.
 
Upvote 0
Bác Siwtom sửa giúp code trên để khi di chuột vào khoảng 2s thì mới hiện thông báo với.
siwtom bị đình chỉ hoạt động rồi bạn ạ.

Bạn tải tập tin ở bài #45 -> mở -> Alt + F11 -> modToolTip -> Sub CreateTipsWindow -> dòng
Mã:
SendMessage ToolTipsHandle, TTM_SET[COLOR=#ff0000][B]DELAYTIME[/B][/COLOR], TTDT_INITIAL, ByVal 100
là đặt thời gian. Khi trỏ chuột vào vùng của tool được 100 mili giây (1 giây = 1000 mili giây) thì hiển thị. Như vậy về lý thuyết nếu bạn muốn đặt 2 giây thì sửa 100 thành 2000. Nhưng có lẽ bạn không đặt lâu tùy ý được đâu. Người quyết định là ông chủ Windows, tức system.

Vài dòng thế thôi. Tôi không muốn tham gia diễn đàn này nữa đâu. Bạn hỏi người khác nhé. Đầy sư phụ trên này mà.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi show form mà có control nào mình để visible = false thì xảy ra lỗi, Có bác nào ngang qua hướng dẫn em cách sửa lỗi với.
 

File đính kèm

  • loi.jpg
    loi.jpg
    16.4 KB · Đọc: 32
Upvote 0
Tô thử không đọc cửa sổ con theo class nữa mà đọc "con đầu lòng" của "ThunderDFrame"

Nhờ các bạn test hộ.
Mạnh đang Làm 1 Cái Form màu mè và Tooltiptext đẹp một chút ....Thấy bài này của Anh siwtom rất hay ...

Máy mạnh Windows10_x32 +Office 2016_x32 chạy tốt

Vậy nhờ befaint test dùm Mạnh code này Trên Winx64 + OfficeX64 xem nó có chạy không báo dùm Mạnh với (Bài 25 nhé)
Xin cảm ơn
 
Upvote 0
Mạnh đang Làm 1 Cái Form màu mè và Tooltiptext đẹp một chút ....Thấy bài này của Anh siwtom rất hay ...

Máy mạnh Windows10_x32 +Office 2016_x32 chạy tốt

Vậy nhờ befaint test dùm Mạnh code này Trên Winx64 + OfficeX64 xem nó có chạy không báo dùm Mạnh với (Bài 25 nhé)
Xin cảm ơn
Anh Mạnh cho thêm cái @ trước nick em để biết anh tag nhé :)

Bị lỗi anh ơi. Đã thêm PtrSafe rồi đổi Long sang LongPtr. Em không biết còn phải chỉnh cái nào nữa đâu.

upload_2017-7-29_12-28-57.png
 
Upvote 0
Upvote 0

Bài viết mới nhất

Back
Top Bottom