Sumber artikel: Internet Penulis: ggg82/CSDN
Saat ini, banyak antarmuka pengguna yang menggunakan toolbar untuk membuat bilah menu. Saya baru-baru ini tertarik dengan hal ini dan meminta bantuan secara online, namun sebagian besar bantuan yang saya terima adalah kode sumber BCGControlBar atau kode sumber SizableRebar antarmuka mereka sendiri untuk memiliki ini Untuk teman-teman yang fungsional, ini mungkin pilihan yang bagus. Lihat saja demonya lalu langsung hubungi perpustakaan kelas orang lain. Namun bagi pembaca seperti saya yang tertarik dengan topik ini dan berharap dapat memahami seluk beluknya , Melihat langsung kode sumber ini tanpa penjelasan detail, tidak mudah untuk mengetahui alasannya, setidaknya bagi pemula seperti saya. Untuk itu, artikel ini berharap dapat membantu orang yang masih mencarinya beberapa bantuan.
Mari kita simak dan ngobrol di bawah ini:
Saat menerima pesan tekan tombol toolbar, kami biasanya menggunakan TrackPopupMenuEx untuk memunculkan menu. Kunci masalahnya adalah ketika menu tidak ditutup, TrackPopupMenuEx tidak kembali dan mencegat pesan mouse dan keyboard toolbar saat ini Jika tidak ada pesan yang diterima tentunya tidak ada cara untuk mengganti hotspot. Hal ini mengharuskan kita mendeteksi sendiri posisi mouse dan menutup menu sebelumnya dan menampilkan menu berikutnya ketika mouse berpindah ke hotspot berikutnya. Disini kita menggunakan fungsi hook SetWindowsHookEx untuk memasang hook WH_MSGFILTER sebelum memanggil TrackPupupMenuEx. Kodenya adalah sebagai berikut:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc adalah fungsi hook, kodenya sebagai berikut:
membatalkan TrackPopup(HWND hWndToolBar, int iButton)
{
sementara (iButton >= 0)
{
Kirim Pesan(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//Pasang pengait
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//Menu munculan
TrackPopupMenuEx(…);
// Copot pemasangan kait
Lepaskan kaitan WindowsHookEx(g_hMsgHook);
iButton = iNextPop; //Item pop-up berikutnya, jika negatif, keluar
}
Kirim Pesan(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(Pengalaman dan saran: Jika tombol menggunakan gaya TBSTYLE_DROPDOWN, mohon jangan memanggil fungsi tersebut secara langsung dalam pesan TBN_DROPDOWN. Anda harus menggunakan pesan perantara, lalu gunakan PostMessa untuk mengirim pesan sehingga TBN_DROPDOWN dapat kembali secara langsung, jika tidak maka yang pertama hotspot yang disorot akan dihilangkan. Ini sangat merepotkan.)
iPopup adalah item pop-up saat ini, dan iNextPop adalah item pop-up berikutnya. Variabel-variabel ini perlu diproses dalam fungsi HookMessageProc.