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

تحريك النافذة بدون شريط العنوان

بدأه Mohammad Elsheimy في 3 يوليو 2009 · 6 رد · 2,018 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
قمت بكتابة هذا الدرس سابق في موقعي
.

مقدمة

درسنا اليوم يتكلم عن كيفية تحريك النافذة Window بدون شريط العنوان Title Bar.

window-title-bar-and-body.gif

ربما تكون لاحظت أن هناك بعض البرامج التي تسمح للمستخدم بتحريك نافذتها بدون استخدام شريط العنوان. فعلى سبيل المثال برنامج Windows Media Player وبرنامج Winamp وأيضا برنامج. فهذه البرامج أصلا ليس لها شريط عنوان فهي تسمح للمستخدم بتحريكها من خلال جسمها وليس من خلال شريط العنوان الخاص بها. وأيضا من البرامج المميزة برنامج Windows Live Messenger فهذا البرنامج يقوم بإخفاء شريط العنوان الخاص به حتى يقوم المستخدم بضغط زر Alt فيظهر شريط القوائم وشريط العنوان. وأيضا فبرنامج Windows Live Messenger يسمح لك بتحريك نوافذه بدون استخدام شريط العنوان أو على الأقل من شكل مبتكر يسمح لك بتحريك الشاشة من خلاله كصورة مثلا كبديل لشريط العنوان.

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

الفكرة

نظريا، لا يمكنك تحريك النافذة بدون شريط العنوان. ولكن، يمكنك ذلك عن طريق محاكاة عملية التحريك والتي تتكون من الضغط بزر الماوس الأيسر على شريط العنوان ثم التحريك مع الاستمرار في الضغط وهكذا تتم عملية سحب أو تحريك النافذة. فبدلا من جعل المستخدم يقوم بالضغط على شريط العنوان سوف نجعله يقوم بسحب النافذة من خلال جسمها أي أنه سوف يقوم بالضغط على جسم النافذة والسحب ومن خلال الكود سوف نقوم بعملية المحاكاة وبالتالي يكون ضغطه على جسم النافذة كأنه يضغط على شريط العنوان وبالتالي يمكنه تحريك النافذة من خلال جسم النافذة.

لتطبيق عملية المحاكاة سوف نستخدم الدالة SendMessage() وهي دالة خاصة بالويندوز أي دالة Win32 API Function. تستخدم هذه الدالة لإرسال أمر معين (رسالة Message معينة) إلى عنصر معين. كما يمكنك إضافة خيارات معينة إلى هذه الرسالة لتنفيذ الأمر المعين. فعلى سبيل المثال، لمحاكاة عملية الضغط على شريط العنوان سوف نقوم بإرسال الأمر (الرسالة) WM_NCLBUTTONDOWN إلى النافذة نفسها ومع هذه الرسالة سوف نقوم بتحديد الاختيار HTCAPTION. وبالتالي سوف نقوم بمحاكاة الضغط بالزر الأيسر (WM_NCLBUTTONDOWN) على شريط العنوان (HTCAPTION) وهكذا. وهذا الكود بالطبع سوف يوضع في المكان المعين الذي نرغب بجعله بدل شريط العنوان. فمثلا إذا كنا نرغب بالسماح للمستخدم بتحريك النافذة من جسمها سوف نقوم بإضافة الكود الخاص بنا في حدث Event الضغط بالماوس MouseDown الخاص بالفورمة Form. أما في حالة أننا نريد أن نسمح للمستخدم بتحريك النافذة من خلال عنصر صورة PictureBox مثلا، سوف نقوم بإضافة الكود في الحدث MouseDown الخاص بهذا العنصر. وهكذا...

التطبيق

الآن سوف نقوم بتطبيق الفكرة التي تعلمناها. سوف نقوم بإخفاء شريط العنوان والسماح للمستخدم بتحريك النافذة من خلال جسمها. الخطوات كالتالي:

  • افتح مشروع جديد من نوع Windows Forms Application.
  • من خلال شاشة خصائص الفورمة حدد خاصية FormBorderStyle لتصبح None وبالتالي يختفي شريط العنوان.
  • من خلال شاشة خصائص الفورمة أيضا قم بالانتقال إلى الأحداث الخاصة بالفورمة وقم بالضغط على الحدث MouseDown مرتين لإظاهره في شاشة الكود. الشكل التالي يوضح شاشة خصائص الفورمة في وضع الأحداث Events.
    selecting-mousedown-event.gif
  • الآن قم بإضافة هذا الكود إلى الحدث MouseDown:

هذا كود سي شارب:

 // C#
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle,
WM_NCLBUTTONDOWN,
HTCAPTION, 0);
}

وهذا كود VB.NET:

 ' VB.NET Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load ReleaseCapture()
SendMessage(Me.Handle, _
WM_NCLBUTTONDOWN, _
HTCAPTION, 0)
End Sub

ثم قم بعد ذلك بإضافة هذا الكود إلى الفورمة نفسها أي ليس داخل أي حدث أو دالة:

هذا كود سي شارب:

// C#
[DllImport("user32.dll")]
static extern int SendMessage(
IntPtr hWnd,
int Msg,
int wParam,
int lParam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

const int WM_NCLBUTTONDOWN = 0xA1; // 161
const int HTCAPTION = 2;

وهذا كود VB.NET:

 ' VB.NET
Declare Function SendMessage Lib "user32.dll" ( _
ByVal hWnd As IntPtr, _
ByVal Msg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer

Declare Auto Function ReleaseCapture Lib "user32.dll" () As Boolean

Const WM_NCLBUTTONDOWN As Integer = 161
Const HTCAPTION As Integer = 2

والآن قم بتشغيل البرنامج وتجربته.

معالجة الأخطاء

ماذا لو قمت بالسماح للمستخدم بتحريك النافذة من خلال جسمها وقام المستخدم بسحبها من خلال عنصر عنوان Label؟ بالطبع، لن تتحرك النافذة معه وهذا على العكس المتوقع بالنسبة للمستخدم وكذلك لو حاول تحريكها من خلال صورة PictureBox على النافذة وذلك لأنها عناصر أخرى ولا تنتمي إلى النافذة برغم من أنها تظهر فوقها إلا أنها لا تنتمي إليها.

والحل أن تقوم بوضع الكود الموجود في حدث MouseDown الخاصة بالفورمة في كل حدث MouseDown لكل عنصر آخر على النافذة ترغب في أن تسمح للمستخدم بتحريك الشاشة من خلاله كعنصر عنوان Label مثلا.

أو طريقة أخرى وذلك لاختصار الكود وجعله أسهل وهي وضع الكود الموجود في حدث MouseDown في دالة جديدة خاصة به لنفرض أن يكون اسمها مثلا DragForm() ثم بعد ذلك تقوم بالنداء على هذه الدالة من كل حدث MouseDown لكل عنصر ترغب في السماح للمستخدم بتحريك النافذة من خلاله وهكذا.

مثال

أما الآن فهذا مثال يوضح ما شرحناه وهو عبارة عن برنامج بسيط بالـ C# يسمح للمستخدم بتحريك الفورمة من خلال جسمها. تم تصميم خلفية بسيطة للفورمة ووضعها كخلفية وليس بداخل صورة. هذه صورة من المثال:

تم تعديل هذه المشاركة بواسطة Mohammad Elsheimy في 3 يوليو 2009 في 17:30

#2

ما شاء الله

هذه هى الهمة

جعله الله فى ميزانك

لى ملحوظة صغيرة فقط

قم بتحميل ما تشاء هنا على السيرفر الخاص بالمنتدى

فأنت تعرف أن بعد فترة سوف يتم حذف الملفات من مواقع الرفع المجانية و هذا أسوء ما قد يصيب الدرس

لذلك قم برفع كل شئ هنا

بالتوفيق

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#3

شكرا اخي وجزاك الله كل خير

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#4

شكرا لكم

#6

شكرا جزيلا، وشكرا على المرور

#7

درس كتير مفيد . الف شكر

--==iceDragon==--
ماجستير نظم دعم القرار الذكية IDSS

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