تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Visual Studio Extensibility الجزء الثاني- توسيع إطار الأدوات
#1
كاتب الموضوع : Islam Ibrahim

هذا الموضوع هو تكملة لموضوع إنشاء إطار الأدوات Tools Window, حيث سنتحدث فيه عن كيفية توسيع إطار الأدوات الذي قمنا بإنشائه في المقال السابق, بإضافة الزر الذي سيظهر في القائمة Tools لـ Visual Studio, والذي سيقوم بعرض مربع حوار "فتح ملف", لاستعراض ملف ما وتشغيله داخل عنصر التحكم "Windows Media Player" , سنقوم كذلك بإضافة قائمة منسدلة DropDown-List والتي ستقوم بعرض قائمة الملفات المتوفرة لتشغيلها في عنصر التحكم, سننفذ هذا الموضوع في ثلاث خطوات رئيسية:
  • إضافة مظهر حيوي للعنصر Menu Command
  • إضافة التعليمات البرمجية اللازمة للتفاعل مع إطار الأدوات
  • استخدام ComboBox في شريط أدوات إطار الأدوات

إضافة مظهر حيوي للعنصر Menu Command

افتراضياً أزرار التحكم Menu Commands ثابتة في موضعها ولا يمكن إخفاؤها بعد إظهارها, سنحاول في هذه الفقرة جعلها حيوية المظهر, أي قابلة للظهور أو الاختفاء, وذلك تبعا لحالة إطار الأدوات الخاص بنا, إن كان نشطاً أم لا.

يجب علينا أولا تغيير FirstToolWin.vsct لإضافة المظهر الحيوي, ثم تنفيذ منطق معيَن لتعيين المظهر عن طريق الكود, سنقوم بإنشاء فئة تحتوي بداخلها على أحداث إطار الأدوات Events, ثم جعل عنصر Menu الخاص بنا قابلا للوصول Accessible in code, ثم ربط الأحداث مع هذا العنصر.

افتح المشروع FirstToolWin الذي قمت بإنشائه في هذا الموضوع.

في مستكشف المشاريع Solution Explorer, افتح FirstToolWin.vsct .

ابحث عن العنصر <Button> الذي يملك المعرِّف cmdidWindowsMedia , بين العنصر <Icon> والعنصر <Strings> أضف ما يلي:


كود :
<CommandFlag>DefaultInvisible</CommandFlag>
<CommandFlag>DynamicVisibility</CommandFlag>
احفظ الملف.
لإنشاء أحداث إطار الأدوات, قم بما يلي:

في مستكشف المشاريع, أنقر بزر الماوس الأيمن فوق اسم المشروع الحالي, ثم اختر Add, ثم انقر فوق "Class".

في مربع الحوار "Add New Item", قم بتسمية الفئة الجديدة ToolWindowEvents ثم انقر "Add".

افتح ToolWindowEvents ثم أضف الأسطر التالية بعد عبارات Using:


كود :
using Microsoft.VisualStudio.Shell.Interop;
using System.ComponentModel.Design;
using System.Security.Permissions;
قم بتغيير خصائص الفئة إلى public و sealed, ثم قم بتنفيذ الواجهة: IVsWindowFrameNotify3


كود :
public sealed class ToolWindowEvents : IVsWindowFrameNotify3
انقر بزر الماوس الأيمن فوق IVsWindowFrameNotify3 في محرر التعليمات البرمجية, انقر فوق Implement Interface لإضافة الإجراءات التي تحتاجها الواجهة Implement Interface.

قم بتنفيذ الإجراء OnShow الخاص بالواجهة كما يلي:


كود :
[PrincipalPermission(SecurityAction.Demand)]
public int OnShow(int fShow)
{
package.toolMenuItem1.Visible
= ((__FRAMESHOW)fShow
!= __FRAMESHOW.FRAMESHOW_WinHidden);
return Microsoft.VisualStudio.VSConstants.S_OK;
}
الأكواد التي قمنا بإضافتها ستقوم باستقبال أحداث إطار الأدوات الخاص بنا, الحدث المستخدم هنا هو الحدث OnShow, والذي يمكن تعيين قابلية إظهار عنصر Menu اعتماداً على القيمة الممررة إلى هذا الحدث, القيمة الممررة إلى هذا الحدث هي ترقيم Enumeration من النوع __FRAMESHOW , يحمل هذا الترقيم عدة قيم , يجب التحقق إن كانت هذه القيمة مساوية لـ FRAMESHOW_WinHidden , غن لم تكن كذلك سنقوم بتغيير خاصية Visible إلى true, وإن كانت كذلك سنقوم تعيين خاصية Visible إلى false.
لاحظ كذلك أن الكود السابق يحتوي المتغير المسمى package هذا المتغير سيمرّر إلى المنشئ .
بعد ذلك, أضف الكود التالي إلى أعلى الفئة, فوق إجراءات الواجهة IVsWindowFrameNotify3


كود :
private FirstToolWinPackage package;
public ToolWindowEvents(FirstToolWinPackage apackage)
{
package = apackage;
}
احفظ التغييرات الجديدة.
في مستكشف المشاريع, افتح الملف FirstToolWinPackage.cs, سنجعل عنصر القائمة Menu Command قابلاُ للوصول من خلال الفئة ToolWindowEvents

عرِّف كائن من النوع MenuCommand في أعلى الفئة, والذي سيمثل عنصر MenuCommand الخاص بنا.


كود :
public MenuCommand toolMenuItem1;
انتقل في محرر الكود إلى الإجراء Initialize انتقل إلى السطرين التاليين:


كود :
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
mcs.AddCommand(MenuItem);
أضف بعدهما مايلي:


كود :
menuCommandID = new CommandID(GuidList.guidFirstToolWinCmdSet, (int)PkgCmdIDList.cmdidWindowsMedia);
toolMenuItem1 = new MenuCommand(MenuItemCallback, menuCommandID);
mcs.AddCommand(toolMenuItem1);
احفظ الملف.

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

لربط الأحداث, قم بما يلي:

في مستكشف المشاريع, افتح MyToolWindow.cs, قم بعمل Overriding للإجراء OnToolWindowCreated بإضافة الأسطر التالية قبل نهاية الملف


كود :
public override void OnToolWindowCreated()
{
base.OnToolWindowCreated();
var handler = new ToolWindowEvents((FirstToolWinPackage)this.Package);
((IVsWindowFrame)this.Frame).SetProperty((int)__VSFPROPID.VSFPROPID_ViewHelper, handler);
}
يقوم الإجراء السابق بإضافة مثيل (كائن) جديد من فئة الأحداث, ثم يقوم بإضافة هذا المثيل إلى خصائص الإطار, الإجراء SetProperty يقوم بتحقيق ذلك حيث يمرر إليه معلَّمتان two parameters الأولى كائن من نوع الترقيم VSFPROPID_ViewHelper والثانية معالج حدث جديد كما هو ظاهر في الكود.

احفظ الملف.

لتجربة الكود السابق, قم بما يلي:
  • اضغط مفتاح F5 لتشغيل الوضع التجريبي لـ Visual Studio
  • اضغط قائمة Tools في شريط القوائم. (عنصر القائمة WindowsMedia لا يجب أن يظهر)
  • قم بعرض إطار الأدوات Windows Media Player من القائمة View, ثم قم بالتأشير على العنصر Other Windows.
  • اضغط شريط القائمة Tools ثانيةً.
الآن يجب أن يظهر عنصر القائمة WindowsMedia لأنه الآن يمتلك خاصية الظهور أو الاختفاء بناءا على ظهور أو اختفاء إطار الأدوات Windows Media Player
}}}
تم الشكر بواسطة:
#2
كاتب المشاركة : Islam Ibrahim

إضافة التعليمات البرمجية اللازمة للتفاعل مع إطار الأدوات

الآن سنقوم بإضافة التعليمات البرمجية للفئة التي تمثل عنصر القائمة, من خلال هذا الكود, سيتم عرض مربع الحوار "Open File", ومن ثم استدعاء الإجراء الجديد LoadFile, لتحميل الملف في عنصر التحكم Windows Media Player.

قم بفتح FirstToolWinPackage.cs

أضف مجال الأسماء System.Windows.Forms


كود :
using System.Windows.Forms;
ابحث عن الإجراء MenuItemCallback هذا هو معالج حدث النقر على عنصر القائمة, استبدل محتويات الإجراء MenuItemCallback بما يلي:


كود :
OpenFileDialog openFileDialog = new OpenFileDialog();
DialogResult result = openFileDialog.ShowDialog();
if (result == DialogResult.OK)
{
MyToolWindow window = (MyToolWindow)(this.FindToolWindow(
typeof(MyToolWindow), 0, true));
if (window != null)
{
window.LoadFile(openFileDialog.FileName);
}
}
احفظ التغييرات الجديدة.

استخدام ComboBox في شريط أدوات إطار الأدوات

يمكنك ملئ أداة DropDown ComboBox في شريط الأدوات Toolbar الخاص بإطار الأدوات, بإضافة Playlist (قائمة تشغيل), فيصبح بإمكان المستخدم اختيار ملف مباشرة من ComboBox لتشغيله وعرضه داخل Media Player, أو عن طريق كتابة اسم الملف في ComboBox, للقيام بذلك سنستخدم كلا الحدثين التاليين: حدث اختيار أو كتابة اسم الملف, والثاني لملئ قائمة التشغيل, لتحديد ما إذا قام المستخدم بكتابة اسم الملف أو قائمة التشغيل, سنقوم بمقارنة الاسم الذي تم إدخاله إن كان في القائمة فعلاً, عندها سيكون playlist وإلا سيكون ملفاً.

في المقال السابق, قمنا بإضافة معالجي حدثين: ComboHandler و ComboListHandler , الآن سنقوم بإضافة دعم Playlist للحدثين السابقين, وكذلك إضافة متغيرين لحفظ ما قام المستخدم بإدخاله أو اختياره, عندما يقوم المستخدم بإدخال أو اختيار عنصر ما, سيتم حفظ القيمة في المتغير المناسب, وعندما يقوم المستخدم بالضغط على الزر, سيتم قراءة ذلك المتغير, ثم سيتم تشغيل الـ Playlist أو الملف.

لتمكين قائمة التشغيل Playlist في Media Player:

افتح الملف MyToolWindow.cs.

أضف الأسطر التالية إلى أعلى الفئة:



كود :
WMPLib.IWMPPlaylist playlist = null;
قم باستبدال معالجي الحدثين ComboHandler و ComboListHandler الموجودين مسبقا بما يلي:


كود :
private void ComboHandler(object sender, EventArgs arguments)
{
var eventArgs = arguments as OleMenuCmdEventArgs;
if (eventArgs != null)
{
var output = eventArgs.OutValue;
var input = eventArgs.InValue;
if (input != null)
{
// Save away the value from the combobox.
comboValue = input.ToString();
playlist = null;

// Check if string is the name of a playlist.

// Declare the playlist
// and playlistarray variables.
WMPLib.IWMPPlaylist aplaylist;
WMPLib.IWMPPlaylistArray playlistarray;

// Get the array of playlists from the
// media player.
playlistarray = control.MediaPlayer.
playlistCollection.getAll();

// Iterate through the array.
Int32 i, count;
count = playlistarray.count;
if (count > 0)
{
for (i = 0; i < count - 1; i++)
{
aplaylist = playlistarray.Item(i);
if (aplaylist.name == comboValue)
{
playlist = aplaylist;
}
}
}
}
else if (output != null)
{
Marshal.GetNativeVariantForObject(
comboValue, output);
}
}
}

private void ComboListHandler(object sender,
EventArgs arguments)
{
var eventArgs = arguments as OleMenuCmdEventArgs;
if (eventArgs != null)
{
IntPtr output = eventArgs.OutValue;
if (output != null)
{
// Declare the playlist and
// playlistarray variables.
WMPLib.IWMPPlaylist aplaylist;
WMPLib.IWMPPlaylistArray playlistarray;

// Get the array of playlists from the
// media player.
playlistarray = control.MediaPlayer.
playlistCollection.getAll();

// Iterate through the array
Int32 i, count;
count = playlistarray.count;
if (count > 0)
{
string[] names = new string[count];
for (i = 0; i < count - 1; i++)
{
aplaylist = playlistarray.Item(i);
names[i] = aplaylist.name;
}
Marshal.GetNativeVariantForObject(
names, output);
}
}
}
}
استبدل معالج الحدث الخاص بالزر ButtonHandler الموجود مسبقا بما يلي:


كود :
private void ButtonHandler(object sender,
EventArgs arguments)
{
if (playlist != null)
{
control.MediaPlayer.currentPlaylist = playlist;
}
else
{
if (comboValue != null)
{
LoadFile(comboValue);
}
}
}
الآن يمكنك تجربة إطار الأدوات الجديد في البيئة التجريبية لـ Visual studio.


انتهى
}}}
تم الشكر بواسطة:
#3
http://vb4arb.com/vb/uploaded/18_01349684023.zip
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  حصرياً جميع روابط Microsoft Visual Studio.Net مباشرة وشغالة 100% من شركة Microsoft أسامة أحمد 11 23,863 14-01-24, 10:55 AM
آخر رد: سعيدة نبيل
  تحميل برنامج مايروسوفت فيجوال بيسك Download Microsoft Visual Basic mohamed atef2018 2 5,165 09-07-16, 10:58 PM
آخر رد: عمور2016
  مجموعة من الأدوات المجانية والمفتوحة المصدر ali.alfoly 8 4,738 28-08-13, 12:05 AM
آخر رد: Riad Soft
  الفوارق الأشيع بين لغات .net الأربع (C#- Visual basic - C++-CLI- F#) RaggiTech 0 4,229 27-10-12, 04:20 PM
آخر رد: RaggiTech
  درس-التشفير - الجزء الثانى(Deep in) RaggiTech 2 3,070 09-10-12, 06:44 PM
آخر رد: RaggiTech
  زمن المعالجات - Microsoft Visual Studio LightSwitch RaggiTech 0 2,651 09-10-12, 06:27 PM
آخر رد: RaggiTech
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الثالث how To Handle Events in.net Part 3 RaggiTech 0 1,976 09-10-12, 05:22 PM
آخر رد: RaggiTech
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الثانى how To Handle Events in .net Part 2 RaggiTech 0 1,983 09-10-12, 05:21 PM
آخر رد: RaggiTech
  كيفيه اداره الاحداث فى بيئه الدوت نت الجزء الاول part 1 how to Handle Events in .net RaggiTech 0 1,866 09-10-12, 05:20 PM
آخر رد: RaggiTech
  مدخل إلى Visual Studio Extensibility باستخدام Visual Studio SDK RaggiTech 0 2,469 09-10-12, 05:05 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم