none
ESTOURO DE MEMÓRIA AO MINIMIZAR O FORM PAI RRS feed

  • Pergunta

  • Olá a todos.

    Estou tendo o seguinte problema em meu projeto.

    Tenho um Form Pai MDI que recebe um Form filho. Quando este Form filho está com a propriedade Dock = Fill dentro do Form Pai, e minimizo o Form Pai, o seguinte erro é apresentado:

    ************** Texto de Exceção **************
    System.OutOfMemoryException: Memória insuficiente.
       em System.Drawing.Drawing2D.LinearGradientBrush..ctor(Point point1, Point point2, Color color1, Color color2)
       em MetroSuite.MetroForm.OnSizeChanged(EventArgs e)
       em System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
       em System.Windows.Forms.Control.UpdateBounds()
       em System.Windows.Forms.Control.WmWindowPosChanged(Message& m)
       em System.Windows.Forms.Control.WndProc(Message& m)
       em System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       em System.Windows.Forms.Form.WndProc(Message& m)
       em MetroSuite.MetroForm.WndProc(Message& m)
       em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       em System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    Não faço ideia de como resolver. Alguém tem ideia de como posso resolver esta situação?

    quinta-feira, 7 de fevereiro de 2019 13:59

Todas as Respostas

  • Bom dia, Jehan. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Poderia nos dar mais informações sobre o problema, por favor?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 8 de fevereiro de 2019 13:29
    Moderador
  • Boa tarde Filipe.

    Perdoe-me pela demora em responder.

    Meu form, está com sua borda definida em FormBorderStyle = None, com isso, utilizo algumas linhas de códigos para dar ao form, as funções de redimensionamento que o form comum teria.

    Porém, quando tenho um form filho dentro do form pai com a função Dock = Fill, e minimizo o form pai, acontece o erro descrito acima.

    Utilizo este código para dar tais funções:

            // Você pode omitir com segurança esse método se desejar
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.FillRectangle(System.Drawing.Brushes.Black, Top);
                e.Graphics.FillRectangle(System.Drawing.Brushes.Black, Left);
                e.Graphics.FillRectangle(System.Drawing.Brushes.Black, Right);
                e.Graphics.FillRectangle(System.Drawing.Brushes.Black, Bottom);
            }
    
            private const int
            HTLEFT = 10,
            HTRIGHT = 11,
            HTTOP = 12,
            HTTOPLEFT = 13,
            HTTOPRIGHT = 14,
            HTBOTTOM = 15,
            HTBOTTOMLEFT = 16,
            HTBOTTOMRIGHT = 17;
    
            // Você pode mudar o nome dessa variável se desejar
            const int newResize = 10;
            private new Rectangle Top { get { return new Rectangle(0, 0, this.ClientSize.Width, newResize); } }
            private new Rectangle Left { get { return new Rectangle(0, 0, newResize, this.ClientSize.Height); } }
            private new Rectangle Bottom { get { return new Rectangle(0, this.ClientSize.Height - newResize, this.ClientSize.Width, newResize); } }
            private new Rectangle Right { get { return new Rectangle(this.ClientSize.Width - newResize, 0, newResize, this.ClientSize.Height); } }
            Rectangle TopLeft { get { return new Rectangle(0, 0, newResize, newResize); } }
            Rectangle TopRight { get { return new Rectangle(this.ClientSize.Width - newResize, 0, newResize, newResize); } }
            Rectangle BottomLeft { get { return new Rectangle(0, this.ClientSize.Height - newResize, newResize, newResize); } }
            Rectangle BottomRight { get { return new Rectangle(this.ClientSize.Width - newResize, this.ClientSize.Height - newResize, newResize, newResize); } }
    
            protected override void WndProc(ref Message message)
            {
                base.WndProc(ref message);
    
                if (message.Msg == 0x84) // WM_NCHITTEST
                {
                    var cursor = this.PointToClient(Cursor.Position);
    
                    if (TopLeft.Contains(cursor)) message.Result = (IntPtr)HTTOPLEFT;
                    else if (TopRight.Contains(cursor)) message.Result = (IntPtr)HTTOPRIGHT;
                    else if (BottomLeft.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMLEFT;
                    else if (BottomRight.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMRIGHT;
    
                    else if (Top.Contains(cursor)) message.Result = (IntPtr)HTTOP;
                    else if (Left.Contains(cursor)) message.Result = (IntPtr)HTLEFT;
                    else if (Right.Contains(cursor)) message.Result = (IntPtr)HTRIGHT;
                    else if (Bottom.Contains(cursor)) message.Result = (IntPtr)HTBOTTOM;
                }
            }


    • Editado JehanKheller terça-feira, 25 de junho de 2019 20:01
    terça-feira, 25 de junho de 2019 20:00
  • Bom dia, Jehan. Tudo bem?

    Obrigado por usar o fórum MSDN.

    Poderia nos dar mais informações sobre o problema, por favor?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    Conseguiria me ajudar?
    quinta-feira, 5 de setembro de 2019 11:41
  • Bom dia.

    Alguém do fórum poderia me ajudar?

    segunda-feira, 9 de dezembro de 2019 14:59
  • tenta minimiza ele antes de minimiza o form principal

    veja esse link

    edit: bem agora se a função no OnPaint for seu form filho usa este código

    WindowState = FormWindowState.Minimized;

    espero ter ajudado


    • Editado Z.s2 segunda-feira, 9 de dezembro de 2019 15:27 edit
    segunda-feira, 9 de dezembro de 2019 15:21
  • tenta minimiza ele antes de minimiza o form principal

    veja esse link

    edit: bem agora se a função no OnPaint for seu form filho usa este código

    WindowState = FormWindowState.Minimized;

    espero ter ajudado


    Boa noite Z.s2.

    Obrigado por me responder.

    Realmente eu não havia pensado nessa possibilidade de minimizar os forms filhos antes de minimizar o form pai. Vou testar. Não é uma solução elegante mas deve funcionar.

    quinta-feira, 12 de dezembro de 2019 01:43
  • JehanKheller você também poderia minimizar pelo processo Link

    quinta-feira, 12 de dezembro de 2019 18:34
  • JehanKheller você também poderia minimizar pelo processo Link

    Boa noite Z.s2.

    Testei sua primeira solução, e infelizmente não funciona.

    Já a solução que o link apresenta, é para aplicações fora da sua aplicação.

    Meu código utilizado no topo do tópico, serve para criar uma borda em volta do form para redimensionar a janela simulando o mesmo funcionamento na janela padrão do windows, já que o meu form é totalmente personalizado.

    Essa é a exceção gerada ao minimizar a janela principal com um form filho aberto e a propriedade Dock definida em Fill:

    quarta-feira, 18 de dezembro de 2019 02:06
  • segunda solução ira  minimizar o processo até o mesmo já testou? basta coloca o nome do processo

    exemplo: crie uma class com o nome "HandleApp"

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    public class HandleApp
    {
        //Enumera os tipos para usar com o switch (o 1,2,3 são da API do user32)
        public enum Actions { Normal = 1, Minimize = 2, Maximize = 3 };
    
        //Importa o user32.dll para poder usar as APIs nativas
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    
        //Busca um aplicativo pelo nome
        public static IntPtr FindWindow(string title)
        {
            Process[] pros = Process.GetProcessesByName(title);
    
            if (pros.Length == 0)
                return IntPtr.Zero;
    
            return pros[0].MainWindowHandle;
        }
    
        //Dispara a ação desejada, só tem 3 opções no exemplo
        public static void Action(string name, Actions act)
        {
            IntPtr hWnd = FindWindow(name);
    
            if (!hWnd.Equals(IntPtr.Zero))
                ShowWindowAsync(hWnd, (int) act);
        }
    }

    coloca o nome do processo a ser minimizado

    HandleApp.Action("Marioworld", HandleApp.Actions.Minimize);

    bem se isso não pega ou não funciona você também pode deixa Dock.none o fill do form filho antes de minimizar

    ou minimizar o form filho e deixa Dock.none depois disso e minimizar o principal 

    bem espero ter ajudado


    • Editado Z.s2 quinta-feira, 19 de dezembro de 2019 21:05
    quinta-feira, 19 de dezembro de 2019 21:04
  • segunda solução ira  minimizar o processo até o mesmo já testou? basta coloca o nome do processo

    exemplo: crie uma class com o nome "HandleApp"

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    public class HandleApp
    {
        //Enumera os tipos para usar com o switch (o 1,2,3 são da API do user32)
        public enum Actions { Normal = 1, Minimize = 2, Maximize = 3 };
    
        //Importa o user32.dll para poder usar as APIs nativas
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    
        //Busca um aplicativo pelo nome
        public static IntPtr FindWindow(string title)
        {
            Process[] pros = Process.GetProcessesByName(title);
    
            if (pros.Length == 0)
                return IntPtr.Zero;
    
            return pros[0].MainWindowHandle;
        }
    
        //Dispara a ação desejada, só tem 3 opções no exemplo
        public static void Action(string name, Actions act)
        {
            IntPtr hWnd = FindWindow(name);
    
            if (!hWnd.Equals(IntPtr.Zero))
                ShowWindowAsync(hWnd, (int) act);
        }
    }

    coloca o nome do processo a ser minimizado

    HandleApp.Action("Marioworld", HandleApp.Actions.Minimize);

    bem se isso não pega ou não funciona você também pode deixa Dock.none o fill do form filho antes de minimizar

    ou minimizar o form filho e deixa Dock.none depois disso e minimizar o principal 

    bem espero ter ajudado


    Bom dia Z.s2, mil perdões pela demora.

    Vou testar esta solução e logo posto meu feedback. Obrigado pela ajuda.

    sexta-feira, 3 de janeiro de 2020 13:44
  • JehanKheller bom o que deu já testou?
    segunda-feira, 13 de janeiro de 2020 18:36