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

كيف أبقي أبعاد النافذة نفسها عند تحريكها بالكود

مغلق
بدأه eias في 28 سبتمبر 2005 · 16 رد · 941 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

..نحن نعلم انا الدالة MoveWindow تأخذ 5بارمترات(هي في الحقيقة 6 ) وهذه البارمترات هي :

الموقع على السينات - الموقع على العينات -الطول -العرض -إعادة الرسم

طيب انا طبقت الكود التالي مثلا :

MoveWindow(10,10,x,y,TRUE);
x=x-10;
y=y-10;

و لكن المشكلة إني أريد أن تبقى النافذة مكانها لا تتحرك :lol: ...يعني باختصار كيف أضع مكان 10و10 الأبعاد الحالية للنافذة أي كيف أحصل على أبعاد النافذة الحالية لكي أكتبها في متغيرات...

وشكرا لكم.

#2

السلام عليكم

يمكنك إستخدام الدالة GetWindowsRect للحصول على النقطة العلوية للنافذه ..

BOOL GetWindowRect(      

    HWND hWnd,
    LPRECT lpRect
);

وإذا اردت ان تعرف حجم النافذه وموقعها فى الشاشة إذا كانت مصغرة مثلاً وإذا كانت مفعلة إلخ

يمكنك ان تستخدم الدالة GetWindowInfo ولكن مشكلة هذه الدالة هى انها تتطلب struct حجمه كبير جداً ومحتوياتة اكثر, ولكن من طلب العلى سهر اليالي ..

الدالة

BOOL GetWindowInfo(      

    HWND hwnd,
    PWINDOWINFO pwi
);

والـStructure

typedef struct {
    DWORD cbSize;
    RECT rcWindow;
    RECT rcClient;
    DWORD dwStyle;
    DWORD dwExStyle;
    DWORD dwWindowStatus;
    UINT cxWindowBorders;
    UINT cyWindowBorders;
    ATOM atomWindowType;
    WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;

طبعاً الـStructure يحتوى على 2 structure من نوع RECT وهى عبارة عن نقطة تتكون من x و y, كم انه يحتوى على structure من نوع ATOM وهى WNDCLASSEX والباقى كله متغيرات عادية ماعليك سوى الاطلاع على معناها فى MSDN وهذا هو الرابط المباشر لها ..

http://msdn.microsoft.com/library/default..../windowinfo.asp

بالتوفيق

والسلام عليكم

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

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

عزيزى انا اعرف هذه الداله move windwo وهى فى الحقيقة لها 6 بارميتر وجلست اما مكتبة msdn ابحث لك عن دالة لما طلبته ولكن الكلام كله انجليزى وما فهمت شىء

كنت اتمنى ان اساعدك

تم تعديل هذه المشاركة بواسطة hamada hassan ali في 28 سبتمبر 2005 في 21:15

_____________________________

C Language && Windwos_API

_____________________________

#4

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

شكرا لك أخي الكريم hamada hassan ali على تعذبك معانا

#7

السلام عليكم

الان فهمت قصدك انت تريد ان تحرك النافذه بدون ان يتغير حجمها

MoveWindow(x,y,10,10,TRUE);

انت وضعت المتغيرات غلط لذلك سوف يصبح حجم النافذه بعرض 10 وطول 10.

والسلام عليكم

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

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#8

شكرا اخي الكريم ..

الفكرة نفسها و لكن المشكلة كيف أجعل اللغة تفهم أني لا أريد تغير الحجم مثلا أو أني لا أريد تغير الموقع..

يعني كيف أحصل على الطول و العرض الحالي او الموقع الحالي حتى أضعه مكان xو y أتمنى تكون فهمت علي ^.^

#9

بصراحة انا لم اتعامل مع هذا الموضوع, لكن لاحظ الـ function

BOOL GetWindowRect(      

   HWND hWnd,
   LPRECT lpRect
);

اعطيه الـ HWND الخاص بالنافذة .. و هو راح يكتب لك معلومات النافذة في *lpRect

http://msdn.microsoft.com/library/default....twindowrect.asp

من هنا تستطيع بسهولة ان تحصل على ابعاد النافذة ..

اذا كنت تريد طول و عرض النافذة مثلا,

RECT rect;
GetWindowRect( hwnd, &rect );
int width = rect.right - rect.left + 1;
int height = rect.bottom - rect.top + 1;

حسب ما أظن .. جرب و قللي

#10

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

الدالة MoveWindow تضبط حجم النافذة و تغير موقعها

النقطة التى تختارها فى الموقع, هى نقطة نسبية بالنسبة للنافذة الام, كيف هذا

لنفرض ان هناك نافذة النافذة الام لها الDesktop و انت تريد ان تغير حجمها من غير موقعها

بعد ان تحصل على المستطيل تبع النافذة, عليك ان تحوله الى ابعاد ال screen يمكن ان تستخدم الدالة

ClientToScreen

و من ثم اضبط كل من العرض و الارتفاع و اعده بواسطة SetWindowRect

و السلام.

ملاحظة, اذا كانت النافذة WS_CHILD عليك ان تقوم بعدد من التحويلات حتى ينجح الامر

شكرا

#11

تماما أخي الكريم .hasan_aljudy.شكرا لك

ولو أنك أضفت 1 لا أعرف لماذا أنا حذفته و الكود ممتاز

بالنسبة للنقطة الثانية أنا فهمت عليك ..بس المشكلة في التطبيق يعني أنا هذه الدوال لم اتعامل معها من قبل ..

ال++C كلها دوال و هذا يعقدها ..ممكن مثال على الدالةClientToScreen

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

شكرا لك

#12

الـ RECT هو ببساطة structure بيه اربع متغيرات تمثل حدود المربع .. اي معلومات تريدها عن المربع تستطيع استخراجها من هذا الـ structure

لاحظ ايضا ان الـ Win32 api مكتوبة بالسي .. يعني في كثير من الاحيان المعلومات اللتي تريدها لم يتم ارجاعها من الدالة, بل يتم اعطائها لك عن طريق بارامترات الدالة .. و هي طريقة متخلفة بنظري .. و لكن هذه هي الحال.

موقع النافذة (من جهة الـ x و الـ y) المفروض هو rect.top و rect.left

int x = rect.left;
int y = rect.top;
#14

لا اعتقد انها سذاجة .. لكن انت متعود على الفجول بيسك حسب ما اعتقد .. لذلك لا زلت تفكر و كأنك في الفجول بيسك :)

لازم تنسى الـ vb و انت تتعامل بالسي .. لان الاشياء مختلفة كثيرا .. احيانا للأسوأ, و أحيانا للأفضل .. و لكن السي لغة واطية (منخفضة), و الـ win32 api ايضا هي مكتبة منخفضة المستوى مكتوبة بلغة منخفضة المستوى .. يعني حاجة منيلة في ستين نيلة :lol:

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 3 أكتوبر 2005 في 01:05

#16

سأختصر الكلام قدر الامكان هالمرة : ) .

اذا اردت معرفة طول وعرض النافذة .. في اي وقت

ضع في دالة الرسائل

case WM_SIZE : 
nWidth = LOWORD(lParam);  // width of client area 
nHeight = HIWORD(lParam); // height of client area

حيث وضعنا متغيرين انت تعلن عنهم ... لاتنسى break

اما لو اردت معرفة احداثيات النافذة

WM_MOVE  
xPos = (int) LOWORD(lParam);    // horizontal position 
yPos = (int) HIWORD(lParam);    // vertical position

حيث تعلن عن المتغيرات المناسبة ..

اذا كنت لاتعرف مامعنى wparam ,lparam و hiword ,loword راجع هنا .

/index.ph...opic=71472&st=0

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#17

أخي الكريم الشمري..طريقكت جميلة..بس ياريت لو أقدر على تطبيقها..لماذا؟

لأني أعمل على نوافذجاهزة أي Dialog و لا أبني المشروع من الصفر كما في الدروس ..

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…