Temukan item menu berdasarkan posisi mouse di C++

Saya mencoba mendapatkan item menu dari aplikasi lain.

Saya dapat melakukan ini dengan secara manual mengarahkan pegangan ke menu utama dan menelusuri submenunya. Namun sangat sulit untuk mengetahui berapa banyak level sub menu yang ada untuk suatu menu tertentu. Misalnya jika kita melihat menu tampilan pandangan seperti ini, Lihat -> Atur berdasarkan -> Tampilan Saat Ini -> Pesan.

Jadi saya memutuskan untuk mendapatkan item menu berdasarkan posisi mouse. Tapi saya tidak bisa menemukan cara untuk melakukan itu.

Tolong sarankan beberapa ide untuk melakukan ini.


person Prasad    schedule 07.06.2011    source sumber


Jawaban (1)


Saya menduga apa yang ingin Anda capai kurang lebih menjadi tidak mungkin karena bagaimana sistem menu di windows dirancang.

Perhatikan bahwa mungkin ada beberapa cara non-konvensional untuk mengatasi hal ini, namun saya ragu Anda akan menemukan solusi yang menghasilkan lebih sedikit pekerjaan daripada strategi Anda saat ini dalam menelusuri hierarki menu.

Soalnya, hierarki menu dan submenu sebenarnya adalah pohon menu biasa. Di MFC Anda memiliki pohon objek CMenu dan di win32 C api itu adalah pohon pegangan HMENU.

Setiap menu, baik itu submenu atau menu utama, mempunyai sejumlah item yang bukan merupakan objek. Yaitu. tidak ada kelas MFC yang disebut CMenuItem dan tidak ada tipe pegangan API win32 yang disebut HMENUITEM. Jika Anda melihat fungsi apa pun yang berhubungan dengan menu, selalu tentang meneruskan ID item menu. Misalnya lihat CMenu::EnableMenuItem atau CMenu::GetDefaultItem.

Sekarang, masalah sebenarnya terdiri dari dua fakta - Item menu bersifat lokal pada menu tempatnya berada. Jika Anda melihat fungsi apa pun di C API, Anda selalu perlu menentukan pegangan menu dan ID item menu, karena fakta bahwa ID item tidak dapat diselesaikan kecuali kerangka kerja mengetahui objek menu mana yang sedang Anda bicarakan. Oleh karena itu ID tidak bersifat global. Di MFC Anda biasanya tidak perlu menentukan pegangan menu, tapi itu tentu saja karena objek CMenu itu sendiri membungkus pegangan HMENU.

Bagian kedua dari masalah ini adalah tidak ada cara alami untuk mengambil menu (CMenu atau HMENU) dari posisinya. Anda bisa mendapatkan item menu dari posisi melalui MenuItemFromPoint, tetapi seperti yang Anda lihat, Anda juga memerlukan pegangan menu dan ID yang dikembalikan hanya valid jika dikombinasikan dengan pegangan menu yang Anda tentukan. Karena Anda tidak bisa menangani menu itu dengan cara lain selain melintasi hierarki submenu - Anda kembali ke titik awal.

Sebagai catatan terakhir - kemampuan menu Visual C++ (CMenu) selalu terbatas pada kemampuan Fungsi menu API Win32 C, jadi fungsi apa pun yang tidak ditemukan di sana kurang lebih di luar jangkauan.

person sharkin    schedule 07.06.2011
comment
Terima kasih telah berbagi pandangan Anda. Saya akan berupaya meningkatkan metode penelusuran hierarki menu saya saat ini sehingga saya dapat mencapai hasil yang lebih baik. - person Prasad; 08.06.2011