winform中对于form设置backgroundimage时会出现窗口无法显示的情况

在对一个已经成型的软件添加一个简单的欢迎界面是,偷懒只用一个不带边框的form来做,在主窗口初始化前显示该欢迎form,代码如下:

public FrameWin()
        {
            WelcomeForm welcome = new WelcomeForm();
            welcome.Show();
            Thread.Sleep(2000);
            welcome.Close();
            InitializeComponent();
}

WelcomeFrom为欢迎界面窗口,当设置backgroundimage属性时,发现第一次引用资源,默认layout如下图,这时欢迎界面正常显示;

但是当设置backgroundimagelayout属性为Zoom或者Stretch时,再打开软件运行,发现主程序界面初始化前的2s延时照常进行,但是这2s内丝毫看不到欢迎界面的影子,无奈改回backgroundimagelayout属性为tile时,仍看不到欢迎界面,邪了!!此时相关属性如下:




为究其原因,就把这个form删掉重新创建,然后对比属性修改前后的Designer文件变化,记录如下,

未设置backgroundimage时,form初始化信息如下,这时欢迎界面可以显示,只是显示一个窗口底色矩形而已:

显示如下:


代码如下:


private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // WelcomeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(570, 427);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "WelcomeForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "WelcomeForm";
            this.ResumeLayout(false);

        }
第一次设置backgroundimage为一张资源时,form初始化信息如下,这时欢迎界面可以正常显示(偷懒自己p了个伪界面):

显示如下:


代码如下:


private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // WelcomeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackgroundImage = global::MDIMonitor_CS.Properties.Resources.welcome;
            this.ClientSize = new System.Drawing.Size(570, 427);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "WelcomeForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "WelcomeForm";
            this.ResumeLayout(false);

        }

当保持backgroundimage不变,修改backgroundimagelayout为Zoom时,form初始化信息如下,这时欢迎界面不再显示:

没显示就截不了图了:

代码如下:


private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // WelcomeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackgroundImage = global::MDIMonitor_CS.Properties.Resources.welcome;
            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
            this.ClientSize = new System.Drawing.Size(589, 426);
            this.DoubleBuffered = true;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "WelcomeForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "WelcomeForm";
            this.ResumeLayout(false);

        }

当保持backgroundimage不变,再修改backgroundimagelayout回Tile时,form初始化信息如下,这时欢迎界面不再显示:

没显示就截不了图了:

代码如下:


private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // WelcomeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackgroundImage = global::MDIMonitor_CS.Properties.Resources.welcome;
            this.ClientSize = new System.Drawing.Size(589, 426);
            this.DoubleBuffered = true;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Name = "WelcomeForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "WelcomeForm";
            this.ResumeLayout(false);

        }


对比以上三个不同内容,很容易看出在改变backgroundimagelayout时,初始化代码中会增加
this.DoubleBuffered = true;
这句话,很明显是打开了双缓冲开关,但是一旦打开了却不再根据backgroundimagelayout的改变为tile而关闭,于是,手动设置
this.DoubleBuffered = false;

这时欢迎界面又正常显示了,卧槽,真的好了,松了口气啊,虽然不能选择backgroundimagelayout为别的选项,但是至少能出来个欢迎了,开心!!显示如下:


就总结了这一问题的出现和解决,这,难道是vs的bug?还是bug中的一个bug?拉倒吧,不求甚解





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在WinForm设置BackgroundImage属性后出现闪烁问题时,可能是由于绘制过程的刷新频率造成的。以下是一些可能的解决方案: 1. 双缓冲技术:通过将双缓冲技术应用于WinForm可以减少闪烁。在Form类的构造函数进行如下设置:this.DoubleBuffered = true。这将启用一个双缓冲机制,从而减少绘制引起的闪烁。 2. 使用双重缓冲绘制控件:对于闪烁问题明显的控件,可以进行自定义绘制,并使用双重缓冲技术对其进行绘制。在进行绘制时,首先在内存完成绘制,然后将绘制结果一次性地绘制到屏幕上,从而减少闪烁。 3. 尽可能缩小绘制区域:如果只需要在特定区域内绘制背景图像,可以通过裁剪绘制区域的方式来减少绘制的内容,从而减少闪烁。可以使用Graphics类的SetClip方法来设置绘制区域。 4. 优化背景图像:如果背景图像文件过大,可以将其进行优化,减少文件大小,从而减少加载和绘制的时间,以及可能的闪烁。 5. 使用其他控件替代BackgroundImage属性:如果上述方法并解决问题,可以考虑使用其他控件来替代BackgroundImage属性的使用,例如Panel控件,以自定义绘制背景图像的方式。 需要注意的是,闪烁问题的解决方案可能因具体情况而异,有时可能需要结合多种方法来达到最佳效果。同时,注意在进行以上的一些更改时,对性能和内存的影响进行评估,以确保其他方面的功能不受影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值