الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 1

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



في الصورة أعلاه، النوافذ الصغيرة تظهر خرجاً وتحكمات خاصة من برامج خارجية. ما أعنيه هنا بالبرامج الخارجية هو Win32 Process. أي ملفات Exe أخرى يتم تشغيلها فتخلق نافذة خاصة بها تطوف فوق النافذة الرئيسية.
 
أستطيع حتى الآن إنشاء النوافذ وإظهار التحكمات عليها والرسم بها وكل شيء، لكن أريد للنوافذ أن تبقى دائماً فوق النافذة الرئيسية. المشكلة أنني لا أستطيع أن أجعل هذه النوافذ أبناء (children) للنافذة الرئيسية وإلا لتشابكت حلقات معالجة الرسائل الخاصة بكل النوافذ ولدخلت في متاهة من حالات الجمود (dead locks).
 
هل هناك حل لإبقاء نوافذ البرامج الفرعية فوق النافذة الرئيسية لكن دون أن تكون ابنة لها؟
 
شكراً

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  حسام زكريا مشاركة 2

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

إذا كنت تستخدم لغة ++C والـ Win32 API :

الطريقة الأولى:
 يمكنك إنشاء النافدة باستخدام تابع CreateWindowEx وتمرير القيمة WS_EX_TOPMOST ضمن القيمة الممررة الأولى dwExStyle لهذا التابع مما سيجعل النافذة تطغوا فوق جميع النوافذ الأخرى حتى ولو لم تكن فعالة.

الطريقة الثانية:
في حال كانت النافذة منشأة مسبقاً يمكنك استخدام التابع SetWindowPos وإعطاء القيمة HWND_TOPMOST للمتحول hWndInsertAfter الخاص بالتابع مما سيعطي للنافذة ميزة العلو على بافي النوافذ، يمكنك إزالة هذه الخاصية باستخدام نفس التابع ولكن بتمرير القيمة HWND_NOTOPMOST بدلاً من القيمة السابقة.

أرجو أن أكون قد أجبتك عن السؤال

Husam Zakaria
Game Programmer