ค้นหารายการเมนูตามตำแหน่งเมาส์ใน C ++

ฉันกำลังพยายามรับรายการเมนูจากแอปพลิเคชันอื่น

ฉันสามารถทำได้โดยนำที่จับไปที่เมนูหลักด้วยตนเองแล้ววนซ้ำผ่านเมนูย่อย แต่เป็นเรื่องยากมากที่จะทราบว่าเมนูนั้นๆ มีเมนูย่อยกี่ระดับ ตัวอย่างเช่น ถ้าเราดูที่เมนูมุมมอง Outlook บางอย่างเช่นนี้ View -> Arrange by -> Current View -> Messages

ดังนั้นฉันจึงตัดสินใจรับรายการเมนูตามตำแหน่งเมาส์ แต่ฉันไม่สามารถหาวิธีทำเช่นนั้นได้

กรุณาแนะนำแนวคิดบางอย่างในการทำเช่นนี้


person Prasad    schedule 07.06.2011    source แหล่งที่มา


คำตอบ (1)


ฉันสงสัยว่าสิ่งที่คุณพยายามทำให้สำเร็จนั้นเป็นไปไม่ได้ไม่มากก็น้อยเนื่องจากวิธีการออกแบบระบบเมนูใน windows

โปรดทราบว่าอาจมีวิธีที่ไม่ธรรมดาในเรื่องนี้ แต่ฉันสงสัยว่าคุณจะพบวิธีแก้ปัญหาดังกล่าวเพื่อรองรับงานน้อยกว่ากลยุทธ์ปัจจุบันของคุณในการสำรวจลำดับชั้นของเมนู

ประเด็นก็คือ ลำดับชั้นของเมนูและเมนูย่อยจริงๆ แล้วเป็นแผนผังของเมนูปกติ ใน MFC คุณมีแผนผังของวัตถุ CMenu และใน win32 C api จะเป็นแผนผังของตัวจัดการ HMENU

แต่ละเมนู ไม่ว่าจะเป็นเมนูย่อยหรือเมนูหลัก มีหลายรายการซึ่งในตัวเองไม่ใช่วัตถุ เช่น. ไม่มีคลาส MFC ที่เรียกว่า CMenuItem และไม่มีประเภทการจัดการ win32 API ที่เรียกว่า HMENUITEM หากคุณดูฟังก์ชันใดๆ ที่เกี่ยวข้องกับเมนู คุณจะต้องส่ง ID ของรายการเมนูเสมอ ตัวอย่างเช่น ดูที่ CMenu::EnableMenuItem หรือ CMenu::GetDefaultItem

ตอนนี้ ปัญหาที่แท้จริงประกอบด้วยข้อเท็จจริงสองประการ - รายการเมนูจะอยู่ภายในเมนูที่ตั้งไว้ หากคุณดูฟังก์ชันใดๆ ใน C API คุณจะต้องระบุทั้งตัวจัดการเมนูและ ID รายการเมนูเสมอ เนื่องจาก ความจริงที่ว่ารหัสรายการไม่สามารถแก้ไขได้เว้นแต่กรอบงานจะรู้ว่าวัตถุเมนูใดที่คุณกำลังพูดถึง ดังนั้น ID จึงไม่เป็นแบบสากล ใน MFC คุณมักจะไม่จำเป็นต้องระบุตัวจัดการเมนู แต่นั่นเป็นหลักสูตรเนื่องจากวัตถุ CMenu เองก็ล้อมตัวจัดการ HMENU

ส่วนที่สองของปัญหาคือไม่มีวิธีที่เป็นธรรมชาติในการดึงเมนู (CMenu หรือ HMENU) จากตำแหน่ง คุณสามารถรับรายการเมนูจากตำแหน่งผ่าน MenuItemFromPoint แต่อย่างที่คุณเห็น คุณจะต้องใช้ตัวจัดการเมนูด้วย และ ID ที่ส่งคืนจะใช้ได้กับตัวจัดการเมนูที่คุณระบุเท่านั้น เนื่องจากคุณไม่สามารถจัดการเมนูนั้นด้วยวิธีอื่นได้นอกจากการข้ามลำดับชั้นของเมนูย่อย - คุณจึงกลับมาที่ตารางหนึ่งอีกครั้ง

หมายเหตุสุดท้าย - ความสามารถของเมนู Visual C++ (CMenu) จะถูกจำกัดอยู่ที่ความสามารถของ ฟังก์ชันเมนู Win32 C API ดังนั้นฟังก์ชันการทำงานใดๆ ที่ไม่พบก็จะเข้าถึงได้ยากไม่มากก็น้อย

person sharkin    schedule 07.06.2011
comment
ขอบคุณสำหรับการแบ่งปันมุมมองของคุณ ฉันจะทำงานเพื่อปรับปรุงวิธีการสำรวจลำดับชั้นเมนูปัจจุบันของฉันเพื่อที่ฉันจะได้ผลลัพธ์ที่ดีขึ้น - person Prasad; 08.06.2011