Inquiridor
ESTOURO DE MEMÓRIA AO MINIMIZAR O FORM PAI

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?
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.
-
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
-
Bom dia, Jehan. Tudo bem?
Conseguiria me ajudar?
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.
-
-
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.
-
-
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:
-
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
-
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.
-