הגדרה של FormBorderStyle עבור טפסים שהם MDI

17 בנובמבר 2009

2 תגובות

 


בתפוז עלתה השאלה הבאה:

 

יש טופס אב ויוצרים בזמן ריצה מופעים של טפסי בן ומוספים אותם לאב – במקרה שהמאפיין FormBorderStyle מוגדר כ – none על טופס הבן, מה שיקרה בפועל שלשנייה אחת יראו את המסגרת ואז זה יעלם – השאלה כיצד מתפטרים מהמסגרת לתמיד.

 

נניח שהקוד נראה ככה:

 


private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    f.MdiParent = this;
    f.Show();
}

 

למעשה הבעייה נובעת מכך ש – windows מציירת כל הזמן את כל הפקדים שעל המסך – ולכן הדרך היחידה לא לראות את המסגרת היא להגיד למערכת ההפעלה להפסיק לצייר את הטופס עד שהכל יסתדר במקום.

 

כדי לעשות את זה נוכל להשתמש ב – Extension Methods שכתבתי בפוסט השני שלי (כל ההסברים נמצאים שם ולכן כאן אני רק אדגים שימוש בזה)

 

הנה קוד ה – Extension


namespace System.Windows.Forms
{
    public static class ControlExtensions
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);
 
        public static void BeginUpdate(this Control control)
        {
            SendMessage(new HandleRef(control, control.Handle), 11, 0, 0);
        }
 
        public static void EndUpdate(this Control control)
        {
            SendMessage(new HandleRef(control, control.Handle), 11, -1, 0);
            control.Invalidate(true);
        }
    }
}

 

והנה הקוד השימוש בו

 


private void button1_Click(object sender, EventArgs e)
{
    this.BeginUpdate();
    Form2 f = new Form2();
    f.MdiParent = this;
    f.Show();
    this.EndUpdate();
}

 

ועכשיו לא יראו את המסגרת של טופס הבן אפילו לשבריר שנייה

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. יוסי גולדברג18 בנובמבר 2009 ב 11:49

    מה שאני לא מבין זה למה מלכתחילה רואים את ה border הרי ה onpaint אמור לפעול לפי הנתונים ההתחלתיים?

    הגב
  2. Shlomo18 בנובמבר 2009 ב 12:17

    כנראה מימוש פנימי שגוי של טפסים שהם בתוך טפסי אב

    הגב