معهد دعم اتش فى اى بى اس لحلول الويب - Powered by vBulletin


 
 
النتائج 1 إلى 1 من 1

الموضوع: أسمبلي 32بت: Notify Icon لنتعلم معا

  1. #1
    عضو جديد


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 7
    المشاركات: 2,181
    HVIPS5 غير متواجد حالياً

    أسمبلي 32بت: Notify Icon لنتعلم معا


    أسمبلي 32بت: Notify Icon لنتعلم معا
    أسمبلي 32بت: Notify Icon لنتعلم معا
    أسمبلي 32بت: Notify Icon لنتعلم معا


    Notify Icon

    سنرى في هذا الدرس كيف ندرج أيقونة في مساحة الحالة لشريط المهام –الموجود بجانب الساعة- و إظهار قائمة منسدلة عند الضغط عليها

    المحتوى:

    1. إنشاء Notify Icon
    2. إنشاء قائمة منسدلة (PopUp Menu)
    3. البرنامج

    1. إنشاء Notify Icon

    تقوم الدالة Shell_NotifyIcon المُصدّرة من المكتبة shell32.dll بإظهار أيقونة في مساحة الحالة لشريط المهام (Taskbar status area) التي نجد ضمنها الساعة الرقمية و غيرها. نموذج الدالة:

    كود:
    Shell_NotifyIcon PROTO Operation:DWORD, PNID:DWORD


    • Operation: نحدد العملية التي سنقوم بها (إضافة، حذف أو تغيير أيقونة)


    يمكن تحديد قيمة من القيم التالية:
    - NIM_ADD: لإضافة أيقونة
    - NIM_DELETE: لحذف أيقونة
    - NIM_MODIFY: لتغيير معلومات أيقونة

    • PNID: مؤشر إلى البنية NOTIFYICONDATA



    ملاحظة: بما أننا سنستعمل دالة مصدّرة من المكتبة shell32.dll علينا تضمين ملف نماذج دوال هذه المكتبة (shell32.inc) و ملف تصدير المكتبة (shell32.lib)

    NOTIFYICONDATA: تحتوي هذه البنية على معلومات الأيقونة
    كود:
    NOTIFYICONDATA STRUCT
      cbSize            DWORD      ?
      hwnd              DWORD      ?
      uID               DWORD      ?
      uFlags            DWORD      ?
      uCallbackMessage  DWORD      ?
      hIcon             DWORD      ?
      szTip             BYTE 64 dup (?)
    NOTIFYICONDATA ENDS

    • cbSize: نحدد حجم البنية –نستعمل SizeOf-
    • hwnd: نمرر مقبض النافذة التي نريدها أن تستقبل رسائل الإخبار من أيقونة
    • uID: نحدد معرّف الأيقونة –نمرر أي رقم-
    • uFlags: نستعمل أعلام لتحديد أيٌ من بقية أعضاء هذه البنية سنحدد فيها معلومات


    يمكن تحديد قيمة من القيم التالية:
    - NIF_ICON: إذا كنا سنحدد قيمة في العضو hIcon
    - NIF_MESSAGE: في حالة كنا نريد تحديد قيمة في العضو uCallbackMessage
    - NIF_TIP: إذا أردنا أخذ معلومات العضو szTip

    • uCallbackMessage: نحدد رسالة قمنا بتعريفها ليتم ارسالها إلى إجراء النافذة المُتعلق بالمقبض المحدّد في العضو hwnd و ذلك عند حدوث أي تفاعل بين المستعمل و الأيقونة مثل الضغط بيمين الفأرة أو النقر عليها ...



    • hIcon: مقبض الأيقونة
    • szTip: هذه حجرة مكونة من 64 بايت يمكننا أن نحدد فيها النص الذي نريد إظهاره عند وضع مؤشر الفأرة على الأيقونة و ذلك من خلال نسخه إلى هذه الحجرة



    ملاحظة: عند إلتقاط الرسالة المحدّدة في العضو uCallbackMessage سيحتوي البارامتر wParam على معرّف الأيقونة –نفسها القيمة الموجودة في العضو uID- أما lParam فهو يحتوي على رسالة الفأرة (مثل: WM_RBUTTONDOWN عند الضغط بيمين الفأرة، WM_LBUTTONDBLCLK عند الضغط مرتين بيسار الفأرة...)

    مثال: كود لنسخ نص إلى الحجرة szTip

    كود:
    ;=========================
    ; szTip كود النسخ إلى الحجرة
    ;=========================
    LEA   ESI, TipText ; ESI=عنوان النص الذي نريد نسخه
    LEA   EDI, NID.szTip ; EDI=szTip عنوان الحجرة
    mov   ECX, SizeOf TipText ; ECX=عدد حروف النص الذي نريد نسخه
    rep   movsb ; بدأ عملية النسخ


    2. إنشاء قائمة منسدلة (PopUp Menu)

    القائمة المنسدلة هي قائمة يمكن إظهارها في أي مكان نريده و ذلك عند الضغط على زر ما. يمكن إنشاء هذا النوع من القوائم باستعمال الدالة CreatePopupMenu (لا تملك بارامترات) التي تنشأ قائمة فارغة لا تحتوي على أية عناصر لذلك سنستعمل دوال أخرى لإضافة العناصر.

    ملاحظة: إذا نجحت الدالة ترجع لنا مقبض القائمة في المسجل EAX

    يوّفر لنا نظام التشغيل Windows عدة دوال تمكّننا من إضافة عناصر إلى قائمة، و منها نذكر: InsertMenuItem، InsertMenu و الدالة AppendMenu التي سنستعملها في هذا الدرس.

    AppendMenu: دالة تقوم بإضافة عنصر إلى قائمة

    كود:
    AppendMenu PROTO hMenu:DWORD,Flags:DWORD,IDNewItem:DWORD,NewItem:DWORD


    • hMenu: مقبض القائمة التي سنضيف لها عنصر
    • Flags: نحدد خصائص العنصر الجديد


    يمكن تحديد قيمة من القيم التالية:
    - MF_BITMAP: إذا أردنا استعمال خريطة بتات كعنصر. كذلك نشير إلى أنّ البارامتر NewItem هو مقبض خريطة البتات
    - MF_CHECKED: لوضع علامة تثبّت (Check Mark) بجانب عنصر القائمة
    - MF_GRAYED: لترميد عنصر القائمة لكي لا يتم اختياره
    - MF_SEPARATOR: لوضع خط أفقي يفصل بين عناصر القائمة
    - MF_STRING: لنشير إلى أنّ عنصر القائمة هو نص و أنّ البارامتر NewItem هو مؤشر إلى هذا نص

    • IDNewItem: نحدد معرّف الأيقونة
    • NewItem: نحدد مؤشر إلى نص أو مقبض الأيقونة (حسب قيمة البارامتر Flags)


    لإظهار قائمة منسدلة في مكان نحدده يمكننا إستعمال الدالة TrackPopupMenu. نموذج الدالة:

    كود:
    TrackPopupMenu PROTO hMenu:DWORD,Flags:DWORD,\
                         x:DWORD,y:DWORD, Reserved:DWORD,\
                         hWnd:DWORD,pRect:DWORD


    • hMenu: مقبض القائمة التي نريد إظهارها
    • Flags: نحدد TPM_LEFTBUTTON أو TPM_RIGHTBUTTON
    • x/y: نحدد إحداثيات بداية رسم القائمة
    • Reserved: محجوزة –نمرر Null-
    • hWnd: نحدد مقبض النافذة التي تملك القائمة و التي ستستقبل رسائلها
    • pRect: مؤشر إلى متغير من نوع البنية RECT التي نحدد فيها جزء الشاشة الذي يمكن للمستعمل الضغط فيه لإظهار القائمة المنسدلة. –إذا أردنا مساحة الأيقونة بأكملها نمرر Null-



    مثال: عند الضغط على الزر الأيمن من الفأرة نقوم بإظهار قائمة منسدلة
    كود:
     Local pt:POINT ; بنية تحتوي على إحداثيات نقطة
      ......
    .ELSEIF lParam==WM_RBUTTONDOWN ; رسالة الضغط على الزر الأيمن
            invoke GetCursorPos,addr pt ; جلب إحداثيات الفأرة
            invoke SetForegroundWindow,hWnd
           invoke TrackPopupMenu,hMenu,TPM_LEFTBUTTON,pt.x,pt.y,0,hWnd,NULL
    .ENDIF


    ملاحظة:
    - تقوم الدالة SetForegroundWindow بجعل النافذة المحدد مقبضها هي الأمامية لكي يتم إخفاء القائمة المنسدلة عند الضغط على مكان خارج مساحة النافذة أو الأيقونة الموجودة في مساحة الحالة لشريط المهام
    - عند الضغط على عنصر من القائمة المنسدلة يتم إرسال معرّفه إلى إجراء النافذة في الرسالة WM_COMMAND. –يمكننا معالجة العناصر على أنها أزرار عادية-

    3. البرنامج

    فكرة البرنامج
    سنكتب مثال بسيط يوضّح طريقة إنشاء Notify Icon و كيفية التفاعل مع رسائلها و ذلك من خلال كتابة برنامج يقوم بـ:

    • إظهار Notify Icon عند الضغط على زر الإخفاء [-]
    • إظهار قائمة منسدلة تحتوي على عنصرين الأول "إظهار النافذة" و الآخر "خروج" و ذلك عند الضغط بيمين الفأرة على الـNotify Icon
    • إظهار نافذة الرئيسية للبرنامج و إخفاء الـNotify Icon عند الضغط النقر عليها مرتين


    دوال و رسائل مُستعملة

    WM_SIZE: تُرسل عند تغيّر حجم نافذة
    كود:
    WM_SIZE  
    fwSizeType = wParam 
    nWidth = LOWORD(lParam)
    nHeight = HIWORD(lParam)


    • fwSizeType: نستقبل فيه نوع التغيير الذي طرأ على النافذة


    يمكن أن يكون قيمة من القيم التالية:
    - SIZE_MAXIMIZED: عند فتح النافذة على كامل الشاشة
    - SIZE_MINIMIZED: عند تصغير النافذة إلى أدنى حد
    - SIZE_RESTORED: عند إرجاع حجم النافذة من الحالة Minimized

    • nWidth: عرض النافذة الجديد
    • nHeight: طول النافذة بعد تغيير الحجم


    ShowWindow: يمكننا إستعمال هذه الدالة لوضع حالة النافذة

    كود:
    ShowWindow PROTO hWnd:DWORD,State:DWORD


    • hWnd: مقبض النافذة التي نريد تغيير حالتها
    • State: نحدد القيمة SW_HIDE لإخفاء النافذة و لإظهارها نحدد SW_RESTORE


    GetCursorPos: نستعمل هذه الدالة لجلب إحداثيات مؤِشر الفأرة. تتطلب هذه الدالة تمرير متغير من نوع البنية POINT و التي تحتوي على متغيرين من نوع كلمة مزدوجة تُرجع فيهما الدالة الإحداثيات

    حمل الملف المرفق
    أسمبلي 32بت: Notify Icon لنتعلم معا
    أسمبلي 32بت: Notify Icon لنتعلم معا
    الملفات المرفقة

 

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •