كيفية التعامل مع MDI شكل صورة خلفية تتمحور بشكل صحيح

StackOverflow https://stackoverflow.com/questions/1421040

  •  07-07-2019
  •  | 
  •  

سؤال

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

وكيف يمكن لهذا الوضع بشكل صحيح يتم التعامل معها منتديات هل يجب حقا أن نطلق عليه "this.Refresh ()" في جميع معالجات الأحداث المرتبطة لتشكيل حجم والدولة؟

وأدرك

والتطبيق في 3.5SP1 صافي C # مع Windows.Forms.

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

المحلول

ولسوء الحظ هناك لا يبدو أن يكون وسيلة فائقة سريعة للقيام بذلك، ولكن ما يلي هي لغتي حل، وعلى الأقل لا يبدو أن تعتمد على الصدف.

في منشئ MDI، والتعامل مع تغيير حجم:

this.ResizeEnd += delegate { this.Refresh(); };

وثم وهذا تجاوز للتعامل مع تعظيم / استعادة الأحداث

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Win32.WM_SYSCOMMAND)
        {
            int test = m.WParam.ToInt32() & 0xFFF0;
            switch (test)
            {
                case Win32.SC_MAXIMIZE:
                case Win32.SC_RESTORE:
                    this.Invalidate();  // used to keep background image centered
                    break;
            }
        }
        base.WndProc(ref m);
    }

ويتم تحديد القيم الثابتة على النحو التالي:

    public const int WM_SYSCOMMAND =                    0x0112;
    //wparam for WM_SYSCOMMAND should be one of these after masking with 0xFFF0:
    public const int SC_RESTORE =                       0xF120;
    public const int SC_MINIMIZE =                      0xF020;
    public const int SC_MAXIMIZE =                      0xF030;

نصائح أخرى

هل يمكن أن تفعل كل ذلك، أو هل يمكن أن مجرد وضع me.refresh في الحدث resize وMDI و.

واتصل طريقة PositionContainersToParentMiddle في حالة تغيير حجم الشكل MDI الخاصة بك. أنا لم نجرب ذلك، ولكن ينبغي لها أن تعمل. قد يكون لديك لوضع الشروط في حالة تغيير الحجم لوقف تغيير موقع صورة في كل تغيير الحجم.

   private void YourMDI_Resize(object sender, EventArgs e)
    {
        PositionContainersToParentMiddle();
    }

    private void PositionContainersToParentMiddle()
    {
        int iInitX = (ParentOfImage.Size.Width - YourImage.Size.Width) / 2;
        int iInitY = ( ParentOfImage.Location.Y + YourImage.Size.Height ) / 2;
        YourImage.Location = new Point( iInitX, iInitY ) ;

    }
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    Me.BackgroundImage = My.Resources.YourBackgroundImageName
    Me.Refresh()
 End Sub
    private void Change_BackgroundImage(string _path)
  {
    string imagepath = _path;
    System.IO.FileStream fs;
 // MDI Form image background layout change her`enter code here`e     
 //(Remember control imagebakground layout take default form background layount )
          this.BackgroundImageLayout = ImageLayout.Center;
            // Checking File exists if yes go --->
            if (System.IO.File.Exists(imagepath))
            {
              // Read Image file
              fs = System.IO.File.OpenRead(imagepath);
                fs.Position = 0;
                // Change MDI From back ground picture
                foreach (Control ctl in this.Controls)
                {
                    if (ctl is MdiClient)
                    {
                      //ctl.BackColor = Color.AntiqueWhite;
                       ctl.BackColor = Color.FromArgb(31, 26, 23);
                       ctl.BackgroundImage = System.Drawing.Image.FromStream(fs);
                      break;
                       }
                  }
             }
          }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top