الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اضهر Try Icon لبرنامجك

مغلق
بدأه madi في 27 يناير 2002 · 4 رد · 1,685 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام

( اعدروني لأني أعاني مشاكل كبيرة في الاتصال بالانترنت )

لم أجد المعنى العربي ل Try Icon , لكن هو رمز صغير يظهر بجانب الساعة في نضام الوندوز .

لكي تجعل برنامج يملك واحد ,

أولا أضف إلى قائمة uses المكتبة ShellAPI .

عرف المتغير

كمتغير خارجي IconData

[l]

var

  Form1: TForm1;

  IconData: TNOTIFYICONDATA;

[/l]

ألان تحاج في الأساس إلى الأوامر التالية فقط لكي تظهره

[l]

procedure TForm1.Button2Click(Sender: TObject);

begin



  IconData.cbSize := SizeOf(TNOTIFYICONDATA);

  IconData.uFlags :=  NIF_ICON+NIF_TIP;

  IconData.hIcon := Application.Icon.Handle;

  Shell_NotifyIcon(NIM_ADD,@IconData);

end;

[/l]

الشرح

الأمر الأول يحدد حجم Icon

IconData.cbSize := SizeOf(TNOTIFYICONDATA);

الأمر الثاني يحدد نوع Icon

IconData.uFlags := NIF_ICON+NIF_TIP;

الأمر الثالث يحدد الصورة Icon,

IconData.hIcon := Application.Icon.Handle;

وقد استخدمت Icon الخاص بالبرنامج نفسه ( حيت يمكن تعديلها من قائمة

Project->Options->Application ->LoadIcon )

الأمر الأخير هو أمر إظهار Icon

Shell_NotifyIcon(NIM_ADD,@IconData);

وبإمكانك استخدام الأمر التالي لإخفاء Icon

[l]

  Shell_NotifyIcon(NIM_DELETE,@IconData);

[/l]

نفد البرنامج , ستلاحظ ظهور Try Icon بجانب الساعة و له نفس Icon برنامجك .

___________________________________________

بعد تنفيذ البرنامج وظهور Icon حرك الماوس باتجاهها , تلاحظ أنه بمجرد وصول الماوس عليها فأنها تختفي . السبب لأنها فقدت Handel

لحل هده المشكلة ( وهي اختفاء Icon عند وصول الماوس لها )

ضع الأمر التالي

[l]

  IconData.wnd := AllocateHWnd(WndProc);

[/l]

WinProc مصطلح يختلف تعريفه بين عنصر و أخر ,

وفي مثالنا هدا استخدما WinProc الخاص بالنافدة Form

حيت يعرف Winproc انه يشير إلى إجراء النّافذة window procedure الذي يردّ على الرّسائل التي أرسلت إلى التحكّم Control.

الآن لنكتب الخطوات بعد التعديل كاملة :

[l]

procedure TForm1.Button2Click(Sender: TObject);

begin

  IconData.cbSize := SizeOf(TNOTIFYICONDATA);

  IconData.wnd := AllocateHWnd(WndProc);

  IconData.uFlags :=  NIF_ICON+NIF_TIP;

  IconData.hIcon := Application.Icon.Handle;

  Shell_NotifyIcon(NIM_ADD,@IconData);

end;

[/l]

___________________________________________

سوف نجري بعض التحسينات ,

لو أردنا ظهور عبارة arabteam200 عندما يكون الماوس موجود فوق Icon

أضف العبارة التالية إلى الخطوات السابقة ,

[l]

  StrPCopy(IconData.szTip,'arabteam200');

[/l]

الآن لنكتب الخطوات كاملة بعد التعديل

[l]

  IconData.cbSize := SizeOf(TNOTIFYICONDATA);

  IconData.wnd := AllocateHWnd(WndProc);

  StrPCopy(IconData.szTip,'arabteam200');

  IconData.uFlags :=  NIF_ICON+NIF_TIP;

  IconData.hIcon := Application.Icon.Handle;

  Shell_NotifyIcon(NIM_ADD,@IconData);

[/l]

___________________________________________

ما رأيك بمزيد من الإضافات

طبعا نحن وضعنا Try Icon لكي نستفيد منه في شي , أهم هده الفوائد هو إمكانية ظهور القوائم السريعة PopupMenu عند الضغط على زر الماوس الأيمن مثلا .

أولا ضع PopupMenu على الفورم , و أضف إليه مجموع عناصر ,

في الخطوات التالية ستلاحظ ظهور مصطلح جديد وهو Message , حيت أن الوندوز يتعامل مع البرامج باستخدام Message حيت يقوم دائما بإنتاج Message وإرسالها إلى البرامج , أيضا البرامج تتبادل Message فيما بينها , مثلا عندما تضغط بالماوس على برنامج معين فأن الوندوز يرسل رسالة إلى هدا البرنامج بذلك ,

المهم ,

1- او تعديل سنقوم به هو إضافة خاصية جديدة لنوع Icon وهي NIF_MESSAGE فتصبح

[l]

  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;

[/l]

حتى يستطيع هدا Icon التعامل مع الرسائل Message .

2- تحديد رقم الرسالة الراجعة CallbackMessage كالتالي

[l]

  IconData.uCallbackMessage := WM_USER+1;

[/l]

حيت يتم تحديد رقم معين لحدت التعامل مع Icon , فهناك عدة احدات أخرى و لها أرقام خاصة ,

3- سوف تحتاج إلى برمجة الدالة WinProc كالتالي :

[l]

procedure TForm1.WndProc(Var Msg : TMessage);

begin

  if (Msg.Msg = WM_USER+1) then

  begin

    case Msg.lParam of

      WM_RBUTTONUP     : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);

    end;

  end

  else

    DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam);

end;

[/l]

لاحظ المقارنة

if (Msg.Msg = WM_USER+1) then

هو نفس رقم الرسالة التي أعطيناها في الخطوة 2

IconData.uCallbackMessage := WM_USER+1;

ألان لنكتب الخطوات كاملة بعد التعديل

خطوات تكوين Icon

[l]

  IconData.cbSize := SizeOf(TNOTIFYICONDATA);

  IconData.wnd := AllocateHWnd(WndProc);

  IconData.uID := 0;

  IconData.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;

  IconData.hIcon := Application.Icon.Handle;

  StrPCopy(IconData.szTip,'HI');

  IconData.uCallbackMessage := WM_USER+1;

  Shell_NotifyIcon(NIM_ADD,@IconData);

[/l]

الدالة Winproc

[l]

procedure TForm1.WndProc(Var Msg : TMessage);

begin

  if (Msg.Msg = WM_USER+1) then

  begin

    case Msg.lParam of

      WM_RBUTTONUP     : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);

    end;

  end

  else

    DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam);

end;

[/l]

___________________________________________

ملاحظة أخيرة وهي أن أفضل مكان لوضع خطوات التكوين هو FormShow

أيضا من الأفضل وضع أمر إلغاء Icon عند إغلاق البرنامج

[l]

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  Shell_NotifyIcon(NIM_DELETE,@IconData);

end;

[/l]

أرجو أن أكون ما قصرت , و الله أعلم

وشكرا

مــــMADIــــدي

#2

فعلا أكثر من رائع اخ MADI والله يعطيك الف عافية فأنا من أشد المعجبين بدروسك وتأابعها على الدوام

وفقك الله (f)

#3

بصراحة شفيت غليلي.

#4

بقي شيء ما تحدثت عنه وأود أن تكمله وهو كيف أخفي أيقونة واسم البرنامج من TaskBarشريط ابدأ

#5

شكرا لكم جميعا , و الله الموفق

لكي تستطيع اخفا البرنامج و اضهاره باستخدام النقر على Try Icon

تحتاج الى تلات اجراءات

اخفاء الفورم الرئيسي ينتج عته احفا البرنامج من TaskBar:

Frotm1.hide;

ضعها في اي مكان تريده انت ,

اضهار الفورم عند الظغط بالماوس عليه

WM_LBUTTONUP:form1.show;

ضعها داخل دالة Winproc

لتصبح دالة Winproc كالتالي

[l]

procedure TForm1.WndProc(Var Msg : TMessage);

begin

  if (Msg.Msg = WM_USER+1) then

  begin

    case Msg.lParam of

      WM_LBUTTONUP:form1.show;

      WM_RBUTTONUP     : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);

    end;

  end

  else

    DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam);

end;

[/l]

و تستطيع اجراء الطريقة التالية ,

form1.Visible:= not form1.Visible;

عد الضغط على Try Icon وكان البرنامج ضاهرا فانه يختفي , وعند الضغط على Try Icon وكان البرنامج مختفي فانه سوف يظهر ,

ودلك بتعديل WinProc فقط كالتالي

[l]

procedure TForm1.WndProc(Var Msg : TMessage);

begin

  if (Msg.Msg = WM_USER+1) then

  begin

    case Msg.lParam of

      WM_LBUTTONUP: form1.Visible:= not form1.Visible;

      WM_RBUTTONUP     : PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);

    end;

  end

  else

    DefWindowProc(IconData.wnd, Msg.Msg, Msg.wParam, Msg.lParam);

end;

[/l]

وشكرا

مــــMADIــــدي

هذا الموضوع مغلق.

مواضيع مشابهة