مصدر المقال: كاتب الإنترنت: ggg82/CSDN
في الوقت الحاضر، تستخدم العديد من واجهات المستخدم أشرطة الأدوات لإنشاء أشرطة القوائم، وقد أصبحت مهتمًا بهذا الأمر مؤخرًا وطلبت المساعدة عبر الإنترنت، ومع ذلك، كانت معظم المساعدة التي تلقيتها هي الكود المصدري لـ BCGControlBar أو الكود المصدري لـ SizableRebar واجهتهم الخاصة للحصول على هذا بالنسبة للأصدقاء العاملين، قد يكون هذا اختيارًا جيدًا، ما عليك سوى إلقاء نظرة على العرض التوضيحي ثم الاتصال مباشرة بمكتبات الفئات الخاصة بالأشخاص الآخرين، ولكن بالنسبة للقراء مثلي المهتمين بهذا الموضوع ويأملون في فهم التفاصيل الداخلية والخارجية ، بالنظر مباشرة إلى رموز المصدر هذه دون شرح مفصل، ليس من السهل معرفة السبب، على الأقل بالنسبة للمبتدئين مثلي، تأمل هذه المقالة في مساعدة الأشخاص الذين ما زالوا يبحثون عن المساعدة التي يمكنهم تقديمها بعض المساعدة.
دعونا نشاهد ونتحدث أدناه:
عند تلقي رسالة الضغط على زر شريط الأدوات، نستخدم عمومًا TrackPopupMenuEx لإظهار القائمة المنبثقة. مفتاح المشكلة هو أنه عندما لا تكون القائمة مغلقة، فإن TrackPopupMenuEx لا يُرجع ويعترض رسائل الماوس ولوحة المفاتيح شريط الأدوات في هذا الوقت إذا لم يتم تلقي أي رسالة، بالطبع لا توجد طريقة لتغيير نقطة الاتصال، وهذا يتطلب منا اكتشاف موضع الماوس بأنفسنا وإغلاق القائمة السابقة وعرض القائمة التالية عندما يتحرك الماوس إلى نقطة الاتصال التالية. نستخدم هنا وظيفة الخطاف SetWindowsHookEx لتثبيت الخطاف WH_MSGFILTER قبل استدعاء TrackPupupMenuEx، ويكون الرمز كما يلي:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, messageProc, 0, GetCurrentThreadId() );
MssageProc هي وظيفة ربط، رمزها كما يلي:
باطلة TrackPopup (HWND hWndToolBar، int iButton)
{
بينما (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//تثبيت هوك
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, messageProc, 0, GetCurrentThreadId());
// القائمة المنبثقة
TrackPopupMenuEx(...);
// إلغاء تثبيت الخطاف
UnhookWindowsHookEx(g_hMsgHook);
iButton = iNextPop; // العنصر المنبثق التالي، إذا كان سلبيًا، فاخرج
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);
}
(الخبرة والاقتراحات: إذا كان الزر يستخدم النمط TBSTYLE_DROPDOWN، فيرجى عدم استدعاء الوظيفة مباشرة في الرسالة TBN_DROPDOWN. يجب عليك استخدام رسالة وسيطة، ثم استخدام PostMessa لإرسال الرسالة حتى يتمكن TBN_DROPDOWN من العودة مباشرة، وإلا فإن الأول سيتم القضاء على نقطة الاتصال المميزة، إنها مزعجة للغاية.)
iPopup هو العنصر المنبثق الحالي، وiNextPop هو العنصر المنبثق التالي الذي يجب معالجته في الدالة HookMessageProc.