Hỏi: Hiển thị thông tin khi chỉ chuột vào CommandButton (4 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

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
Web KT

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

Back
Top Bottom