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

ال Console و ال Windows Forms

بدأه C++er في 24 أغسطس 2009 · 2 رد · 1,324 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

منذ فتره طويله كنت ادرس برنامج Emulator اسمه PSX2 و هو لتشغيل العاب الـ Playstation 2 على جهاز الـ PC. هذا البرنامج يستخدم GUI و بالإضافه إلى ذلك يستخدم شاشة الـ Console لعرض الـ Log للعمليه الحاليه مع امكانية اخفائها و اظهارها.

حقيقة الفكره عجبتنى فلماذا دائما لابد ان يتم حفظ الـ Log File داخل ملف نصى (طبعا انا بتكلم عن برامج خلاف قواعد البيانات - النوعيه دى انساها خالص دلوقتى)، و لكن المشكله هى انه اما Windows Forms او Console Application.

فى حال استخدامنا للنوع Console Application فلا توجد مشكله و لكن كيف سنقوم بإستخدام شاشة الـ Console و الكتابه فيها و القراءه منها داخل Windows Forms؟

الحل يكمن فى الداله AllocConsole حيث تتيح لك انشاء نسخه من الـ Console للنسخه الحاليه من البرنامج و طبعا توجد الداله FreeConsole لحذف هذه النسخه و مع وجود الداله ShowWindow اصبح بالإمكان اظهار شاشه الـ Console و اخفائها و حيث ان هذه الداله تتطلب معرفة الـ Handle لشاشة الـ Console لذا فمن الضرورى استخدام الداله GetConsoleWindow و التى تعود بمقبض لشاشة الـ Console الخاصه بتلك النسخه من البرنامج سواء كانت ظاهره او مخفيه.

طبعا للعلم الـ Process لا يسمح له بإستخدام اكثر من شاشة Console واحده و بالتالى عند استخدامك لـ AllocConsole مع وجود شاشة Console لن تعمل و ستعود بصفر.

الجميل فى الموضوع هو انك بعد ان تقوم بعمل Allocate لشاشة الـ Console يمكنك استخدام الـ Console Class بشكل كامل مع البرنامج و بدون اى مشاكل

هذه هى الـ Class التى قمت بعملها لتفعيل الـ Console

Class ConsoleHelper
	Private Declare Function AllocConsole Lib "kernel32.dll" () As Integer
	Private Declare Function FreeConsole Lib "kernel32.dll" () As Integer
	Private Declare Function GetConsoleWindow Lib "kernel32.dll" () As IntPtr
	Private Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer

	Public Shared Sub ShowConsole(Optional ByVal show As Boolean = True)
		Dim hWnd As IntPtr = GetConsoleWindow()
		Dim i As Integer = If(show = True, 5, 0)
		ShowWindow(hWnd, i)
	End Sub

	Public Shared Function CreateConsole() As Boolean
		If AllocConsole() <> 0 Then Return True
		Return False
	End Function

	Public Shared Function RemoveConsole() As Boolean
		If FreeConsole() <> 0 Then Return True
		Return False
	End Function

End Class

تحتوى الفئه على 3 دوال هما :

1 - CreateConsole : و تقوم بإنشاء نسخة الـ Console و بشكل افتراضى تقوم بإظهارها.

2 - RemoveConsole : تقوم بحذف نسخة الـ Console الخاصه بهذا البرنامج (للنسخه الحاليه فقط) و بالتبعيه تقوم بحذف الشاشه.

3 - ShowConsole : و هى تقوم بإظهار او اخفاء شاشة الـ Console و تستقبل معامل واحد فقط اما True و هو الإفتراضى لإظهار الشاشه او False لإخفائها.

إذا لم يتضح لك فكره عن كيفية الإستفاده من هذه الخاصيه داخل برنامجك دعنى اعطيك فكره.

فالنفترض انك صنعت برنامج ما و الذى يحتوى على GUI و قام عميل بطلب منك (فى الأغلب ممكن يكون مهندس شبكات او system Admin) ان تكون هناك امكانية ان يعمل البرنامج من داخل الـ Command Prompt طبعا الطبيعى انك ستقوم بعمل نسختين، و لكن البديل هنا انك ستقوم بإستخدام الحدث Startup الخاص بـ Application Events و تتحقق من e.CoomandLine فإذا كانت تحتوى على Switch و ليكن مثلا -console فتقوم بإنشاء نسخة من فئه الخاصه بالتعامل مع البرنامج من الـ CommandLine و بعدها سيتم التعامل مع هذه الـ Class و بعد الإنتهاء ستقوم بإستخدام الأمر End لإنهاء البرنامج.

ارجو ان تكون الفكره قد وضحت و عموما فقد ارفقت لكم هذا المثال. لتشغيل البرنامج من الـ CommandLine قم بإستدعاء اسم البرنامج و تمرير معامل -Console ليعمل البرنامج من الـ CommandLine و هذه هى صوره لما سيظهر فى وقت عمل الـ Console فقط

post-135620-1251099026_thumb.jpg

و هذا شكل الـ GUI اثناء عمل البرنامج فى هذا النمط

post-135620-1251099040_thumb.jpg

لتجربة البرنامج فى وضع الـ Console من داخل الـ VS قم بفتح خصائص المشروع ثم حدد الـ Debug Tab ستجد TextBox مكتوب بجانبه CommandLine قم بكتابة -console و احفظ الإعدادات ثم قم بتشغيل البرنامج

Console.rar

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 24 أغسطس 2009 في 11:48

مدونتي: C++ Tips and Tricks

#2

السلام عليكم و رحمة الله و بركاته ،،،

اخي محمد علاء B) , معلومة مفيدة و جديدة و حلوة , :haha: يمكن ان ادمج هذه الفكرة مع برامجي المستقبلية إن شاء الله ان وجدت لها تطبيق فعلي :evil: :cash:

شكرا جزيلا لك :clapping:

<EMBED src=http://www.abdelghafar.com/images/banners/bm2.swf width=486 height=60 type=application/x-shockwave-flash EMBED < menu="false" loop="true" quality="high">

#3

ماشاء الله ,, هو ده النشاط :wink:

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

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