Черные поля появляются при расширении формы? - PullRequest
0 голосов
/ 15 октября 2010

Создайте приложение формы Windows .net 2.0, добавьте закрепленную заливку splitContainer, с помощью этого в конструкторе формы:

public Form1()
{
    InitializeComponent();

    for (int i = 1; i <= 300; i++)
    {
        FlowLayoutPanel f = new FlowLayoutPanel();
        f.Dock = DockStyle.Fill;
        Button b = new Button();
        f.Controls.Add(b);
        splitContainer1.Panel2.Controls.Add(f);
    }
}

Нажмите F5.Возьмите форму за нижний правый край и быстро перетащите, чтобы развернуть форму.Форма расширяется довольно резко из-за работы, выполняемой во всех элементах управления.

У меня есть приложение с формой в нем с некоторыми медленными элементами управления, которое также стало медленным.Разница в том, что в моем приложении я получаю уродливое черное пространство, которое появляется на долю секунды в промежутках, когда я вытаскиваю форму с помощью мыши.Окно перерисовывается неправильно.Это уродливое черное пространство не появляется в приведенном выше примере кода.

Есть идеи, что может привести к появлению черного пространства при развертывании медленной формы?

Я пробовал двойную буферизацию, но это не даетРазница.

РЕДАКТИРОВАТЬ: Я разобрал форму до ее основ, чтобы это можно было воспроизвести.Запустите новое приложение Windows Form C # под названием WindowsFormsApplication_SampleFault.Вставьте приведенный ниже код в Form1.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Diagnostics;
using System.Security.Principal;
using System.Runtime.InteropServices;


namespace WindowsFormsApplication_SampleFault
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            for (int i = 1; i <= 200; i++)
            {
                Button b = new Button();
                b.Dock = DockStyle.Fill;
                this.Controls.Add(b);
            } 
        }
        }
}

, затем вставьте его в Form1.Designer.cs

namespace WindowsFormsApplication_SampleFault
{
    partial class Form1
    {
            /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        /// 

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
            this.SuspendLayout();
            // 
            // statusStrip1
            // 
            this.statusStrip1.Location = new System.Drawing.Point(0, 472);
            this.statusStrip1.Name = "statusStrip1";
            this.statusStrip1.Size = new System.Drawing.Size(756, 22);
            this.statusStrip1.TabIndex = 6;
            this.statusStrip1.Text = "statusStrip1";
            // 
            // frmOptions
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(756, 494);
            this.Controls.Add(this.statusStrip1);
            this.DoubleBuffered = true;
            this.ImeMode = System.Windows.Forms.ImeMode.Off;
            this.MinimizeBox = false;
            this.MinimumSize = new System.Drawing.Size(750, 500);
            this.Name = "frmOptions";
            this.ShowIcon = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.StatusStrip statusStrip1;

    }
}

Нажмите F5 и попытайтесь перетащить форму.Примечание. Я намеренно перегружаю механизм перерисовки для создания черных областей.

Я считаю, что что-то не так с кодом конструктора форм, но я не уверен, что именно.

1 Ответ

0 голосов
/ 16 октября 2010

Этот частный случай можно легко исправить с помощью WS_EX_COMPOSITED.

const int WS_EX_COMPOSITED = 0x02000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= WS_EX_COMPOSITED;
        return cp;
    }
}

P.S. 200 кнопок это слишком много для любого GUI:)

ИМХО

РЕДАКТИРОВАНИЕ: здесь я публикую то, что мне удалось сделать, чтобы исправить черные ящики на Win7 Код немного уродливый, но идея ясна, я надеюсь.

public Form1()
{
    InitializeComponent();

    for (int i = 1; i <= 200; i++)
    {
        Button b = new Button();
        b.Dock = DockStyle.Fill;
        this.Controls.Add(b);
    }
    _layoutWorker.Tick += new EventHandler(LayoutWorker_Tick);

}

private void LayoutWorker_Tick(object sender, EventArgs e)
{
    _layoutWorker.Stop();
    this.PerformLayout();
}

protected override void OnResize(EventArgs e)
{
    this.SuspendLayout();
    base.OnResize(e);
    this.ResumeLayout(false);
    _layoutWorker.Start();
}

private Timer _layoutWorker = new Timer { Enabled = false, Interval = 1 };
...