السلام عليكم :
مشكلة .. ما قدرت اختار عنوان مناسب .. وهذه عقدتي :wacko:
المهم .
عندك برنامج وانت تحب انك تضيف ايقونه له جنب الساعة .. ويسمونها ..
أيقونة صينيةِ النظام -- system tray icon
اولا تنشئ هذا التركيب :
NOTIFYICONDATA system_icon;
تركيب عادي ..
تقوم بملئه بالمعلومات التي يحتاجها النظام عشان يربط برنامجك بشريط المهام
الن سنملأه بالمعلومات :
اولا
system_icon.cbSize=sizeof(NOTIFYICONDATA);
حجم التركيب كما هو حال باقي التراكيب في الويندوز .
system_icon.hIcon = LoadIcon(NULL,IDI_INFORMATION);
الايقونة التي تريدها ان تظهر .. نحن اخترنا احد ايقونات النظام ..
system_icon.hWnd = hWnd;
مقبض نافذتنا .
system_icon.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
مهم جدا .
هنا تعطي الخصائص العامة لهذا التركيب وهي ثلاث ونحن جمعنا بينها كلها .
NIF_ICON يعني هل تريد له ايقونة او لا .
NIF_TIP هل تريد اظهار شريط المعلومات الاصفر TOOL TIP عند توقف الماوس على الايقونة ...
NIF_MESSAGE هل تريد استقبال رسائل من ايقونتنا .. اذا اخترت هذه الخاصية ستتمكن من استقبال الرسائل الواردة اليها ..
في الغالب جميع ما سبق تحتاجه ..
system_icon.uCallbackMessage = WM_TRAYMESSAGE;
هنا .. نعين الرسالة التي ستعالج الرسائل القادمة الى نافذتنا ..
system_icon.uID = ICONIDENT;
ID الخاص بالايقونة .. حيث يعتبر همزة الوصل بيننا وتلك الايقونة .. وهو عبارة عن رقم انت تحدده ... مثلا
#define ICONIDENT 102
strcpy(system_icon.szTip,"arab team ");
الان وضعنا tool tip .. او شريط المعلومات الاصفر الذي سيظهر .. واعتقد مايحتاج شرح .
خلاص الان عبأنا التركيب بالمعلومات الكافية .. سنجعله في ايقونة النظام
Shell_NotifyIcon(NIM_ADD,& system_icon);
هذه الدالة تمكننا من اظهار برنامجنا في ايقونة النظام . ..
البارمتر الاول نوع العملية ..
NIM_ADD اضافة
NIM_DELETE حذف
NIM_MODIFY تعديل
بالنسبة للاضافة تعلمناها ..
الحذف امره واضح ..
التعديل ايضا سهل ..
مثلا تغير النص الذي سيظهر في الشريط الاصفر .
تغير الايقونة وهكذا ..
وذلك بان تعيد كتابة اجزاء من التركيب السابق ثم تعيد تعيينه مثلا ستغير الكلام .. فقط
strcpy (system_icon.szTip,"al slam alaikum");
ونعدله
Shell_NotifyIcon(MODIFY,& system_icon);
اذا انتهيت من البرنامج .. و اردت ان تحذف الايقونة
Shell_NotifyIcon(NIM_DELETE,& system_icon);
اذا اردت ان تستقبل الرسائل ببساطة :
case WM_TRAYMESSAGE:
switch(wParam)
{
case ICONIDENT:
switch(lParam)
{
case WM_LBUTTONUP:
MessageBox(hWnd,"You clicked the LEFT button!","SysTray Icon Example",MB_OK);
}اذا الرسالة TRAYMESSAGE __ wParam الخاص بها هو ID الخاص بالايقونة ..
وهو الان ICONIDENT الذي حددناه قبل قليل ..
اما lParam الخاص بالرسالة TRAYMESSAGE فهو يحدد نوع الرسالة نقرة ماوس الخ ..
نحن قلنا اذا كانت نقرة ماوس .. اظهر مسج ..
تلميحه !
نشاهد في كثير من البرامج .. عند النقر على الزر الايمن فوق ايقونة ما....ستظهر قائمة .
كيف يتم ذلك ..
الامر بسيط لكن ان شاء الله انك تعرف كيف تتنشئ قائمة وتتعامل معها . وسأفترض ذلك .
POINT pxy; case WM_RBUTTONUP: GetCursorPos(&pxy); TrackPopupMenu(hmenu,TPM_LEFTALIGN|TPM_TOPALIGN ,(pxy.x)+1,pxy.y,0,hWnd,NULL);
خزنا موقع الفأرة عند النقر .. في التركيب POINT واللي اكيد انك تعرفه .. يحتوي على X و Y متغيرين يعني ..
وحركنا القائمة الى موقع المشيرة وهو موقع ايقونتا ..
طبعا الرسالة WM_RBUTTONUP هي lParam للرسالة WM_TRAYMESSAGE ..
الان برنامجك متصل بالمحيط الخارجي : )
الموضوع هذا لقيته في ملف وورد كاتبه من شهور :D ,, ما راجعته ... لكن إن شاء الله انه مافيه اخطاء .. والملف المرفق سأضيفه لاحقا بمشيئة الله ,
