แหล่งที่มาของบทความ: อินเทอร์เน็ต ผู้แต่ง: ggg82/CSDN
ทุกวันนี้ อินเทอร์เฟซผู้ใช้จำนวนมากใช้แถบเครื่องมือเพื่อสร้างแถบเมนู ฉันเพิ่งเริ่มสนใจสิ่งนี้และขอความช่วยเหลือทางออนไลน์ อย่างไรก็ตาม ความช่วยเหลือส่วนใหญ่ที่ฉันได้รับคือซอร์สโค้ดของ BCGControlBar หรือซอร์สโค้ดของ SizableRebar อินเทอร์เฟซของตัวเองที่จะมีสิ่งนี้ สำหรับเพื่อน ๆ ที่ใช้งานได้นี่อาจเป็นทางเลือกที่ดีเพียงแค่ดูการสาธิตแล้วโทรหาห้องสมุดชั้นเรียนของคนอื่นโดยตรง แต่สำหรับผู้อ่านเช่นฉันที่สนใจในหัวข้อนี้และหวังว่าจะเข้าใจข้อมูลเชิงลึก การดูซอร์สโค้ดเหล่านี้โดยตรงโดยไม่มีคำอธิบายโดยละเอียด ไม่ใช่เรื่องง่ายที่จะหาสาเหตุ อย่างน้อยสำหรับมือใหม่อย่างฉัน ด้วยเหตุนี้ บทความนี้จึงหวังที่จะช่วยเหลือผู้ที่ยังคงมองหาสิ่งนี้ ผู้อ่านสามารถให้ได้ ความช่วยเหลือบางอย่าง
มาดูและพูดคุยกันด้านล่าง:
เมื่อได้รับข้อความกดปุ่มแถบเครื่องมือ โดยทั่วไปเราใช้ TrackPopupMenuEx เพื่อแสดงเมนู กุญแจสำคัญของปัญหาคือเมื่อเมนูไม่ปิด TrackPopupMenuEx จะไม่ส่งคืนและดักจับข้อความของเมาส์และคีย์บอร์ด แถบเครื่องมือ ณ เวลานี้ หากไม่ได้รับข้อความ แน่นอนว่าไม่มีทางที่จะเปลี่ยนฮอตสปอตได้ ซึ่งเราต้องตรวจสอบตำแหน่งเมาส์ด้วยตนเองและปิดเมนูก่อนหน้าและแสดงเมนูถัดไปเมื่อเมาส์เลื่อนไปยังฮอตสปอตถัดไป ที่นี่เราใช้ฟังก์ชัน hook SetWindowsHookEx เพื่อติดตั้ง WH_MSGFILTER hook ก่อนที่จะเรียก TrackPupupMenuEx รหัสจะเป็นดังนี้:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc เป็นฟังก์ชัน hook รหัสจะเป็นดังนี้:
เป็นโมฆะ TrackPopup (HWND hWndToolBar, int iButton)
-
ในขณะที่ (iButton >= 0)
-
ส่งข้อความ(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//ติดตั้งตะขอ
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
// เมนูป๊อปอัพ
TrackPopupMenuEx(...);
//ถอนการติดตั้งตะขอ
ปลดตะขอ WindowsHookEx(g_hMsgHook);
iButton = iNextPop; // รายการป๊อปอัปถัดไป หากเป็นค่าลบ ให้ออก
-
ส่งข้อความ(hWndToolBar,TB_SETHOTITEM,-1,0);
-
(ประสบการณ์และข้อเสนอแนะ: หากปุ่มใช้รูปแบบ TBSTYLE_DROPDOWN โปรดอย่าเรียกใช้ฟังก์ชันโดยตรงในข้อความ TBN_DROPDOWN คุณควรใช้ข้อความสื่อกลาง จากนั้นใช้ PostMessa เพื่อส่งข้อความเพื่อให้ TBN_DROPDOWN สามารถส่งคืนได้โดยตรง ไม่เช่นนั้นจะเป็นข้อความแรก ฮอตสปอตที่ไฮไลต์จะถูกกำจัดออกไป เป็นเรื่องที่ลำบากมาก)
iPopup เป็นรายการป๊อปอัปปัจจุบัน และ iNextPop เป็นรายการป๊อปอัปถัดไป ตัวแปรเหล่านี้จำเป็นต้องได้รับการประมวลผลในฟังก์ชัน HookMessageProc