سؤال

أنا أكتب برنامجًا يحتوي على جزأين (عبر CSplitter)، ولكنني أواجه مشكلات في معرفة كيفية تغيير حجم عناصر التحكم في كل إطار.من أجل البساطة، هل يمكن لأحد أن يخبرني كيف سأفعل ذلك لإطار أساسي بإطار واحد CEdit يتحكم؟

أنا متأكد إلى حد ما أن الأمر يتعلق بـ CEdit::OnSize() وظيفة...لكني لا أصل إلى أي مكان حقًا..

شكرًا!:)

هل كانت مفيدة؟

المحلول

عندما يتلقى إطارك رسالة OnSize، فسوف يمنحك العرض والارتفاع الجديد - يمكنك ببساطة استدعاء الأسلوب CEdit SetWindowPos لتمرير هذه القيم إليه.

افترض أن CMyPane هو جزء التقسيم الخاص بك ويحتوي على CEdit الذي قمت بإنشائه في OnCreate والذي يسمى m_wndEdit:

void CMyPane::OnSize(UINT nType, int cx, int cy)
{
    m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}

نصائح أخرى

تتلقى النافذة رسالة WM_SIZE (والتي تتم معالجتها بواسطة معالج OnSize في MFC) مباشرة بعد تغيير حجمها، لذا فإن CEdit::OnSize ليس هو ما تبحث عنه.

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

شيء من هذا القبيل

void MyFrame::OnSize(UINT nType, int w, int h)
{
    // w and h parameters are new width and height of your frame
    // suppose you have member variable CEdit myEdit which you need to resize/move
    myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}

GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // في الواقع يمكنك النقل وتغيير الحجم...إلخ

يعد SetWindowPos واجبًا ثقيلًا بعض الشيء لهذا الغرض.يحتوي MoveWindow على ما هو مطلوب فقط.

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

قد ترغب أيضًا في التعامل مع رسالة WM_SIZING التي يتم إرسالها أثناء عملية تغيير الحجم.سيتيح لك ذلك تغيير حجم النوافذ الفرعية بشكل فعال بينما يستمر المستخدم في سحب الماوس.ليس من الضروري التعامل مع WM_SIZING ولكنه يمكن أن يوفر تجربة أفضل للمستخدم.

أستخدم فئة CResize من CodeGuru لتغيير حجم كافة عناصر التحكم تلقائيًا.يمكنك تحديد الطريقة التي تريد بها تغيير حجم كل عنصر تحكم ويقوم بالمهمة نيابةً عنك.

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

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

مفيد جدًا عندما يكون لديك عدد كبير من عناصر التحكم في الحوار.

مصدر الرمز

عندما يتعلق الأمر بتغيير حجم النافذة، هناك ثلاث رسائل نافذة قد تكون مهتمًا بها: ON_WM_SIZE(), ON_WM_SIZING(), ، و ON_WM_GETMINMAXINFO().

مثل المستندات الرسمية يقول:

  • ON_WM_SIZE معالج الرسائل الذي هو ::OnSize() يتم تشغيله بعد تغيير حجم CWnd؛
  • ON_WM_SIZING معالج الرسائل الذي هو ::OnSizing() يتم تشغيله عندما يتغير حجم منطقة العميل في نافذة عارض الحافظة؛
  • ON_WM_GETMINMAXINFO معالج الرسائل الذي هو ::OnGetMinMaxInfo() يتم تشغيله عندما تحتاج النافذة إلى معرفة الموضع أو الأبعاد القصوى، أو الحد الأدنى أو الأقصى لحجم التتبع.

إذا كنت تريد تقييد حجم cwnd إلى بعض النطاق، يمكنك الرجوع إلى الرسالة ON_WM_GETMINMAXINFO;وإذا كنت تريد استرداد التغييرات في الحجم في الوقت الفعلي، فيمكنك الرجوع إلى الرسالتين الأخريين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top