Winform"窗体加载闪烁处理、无边框窗体的移动" 之 配餐系统的开发

本文分享了在开发配餐系统过程中遇到的两个典型问题及解决方案:一是窗体加载时的闪烁现象,通过调整窗体透明度配合定时器解决;二是无边框窗体的移动问题,提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      本文主要跟大家分享在 ‘配餐系统’开发中 遇到的问题和处理,并且会在以后的时间里,写此项目的经验总结,希望能对你有所帮助!

      1.窗体加载闪烁处理 ——这个问题可能大家在做winform应用程序开发中会经常碰到的问题,只是有些窗体闪烁的问题比较明显和严重 ——这时我们可以采取优化方法,比如:压缩窗体中图片的大小(如果窗体中有使用图片)...,但是可能我们尝试着去优化,发现问题并没有得到较大的改善,下面就此项目中的这种问题的处理方法的说明:

      2011010821435590.jpg ——图1

     2011010821444614.jpg——图2

        上面两个图分别对应的是:登录(FrmLogin)和主窗体(使用的是MDI,主窗体实际是:FrmMain(MDI容器)+FrmIndex),由FrmLogin切换到主窗体,如是直接切换,主窗体显示加载时会闪烁的比较明显——因为相当于要同时加载显示 FrmMain(MDI容器)+FrmIndex 这两个窗体,且FrmIndex 窗体中使用了一个大的背景图片。 【处理方法:在FrmLogin中要切换到主窗体时,用timer控制——先设置 主窗体为完全透明,1s(timer时间间隔(在这时间间隔 内 即可完成主窗体的加载))后,再设置 主窗体为不透明】,具体实现代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
private FrmMain frm = null ;

private void picLoginBox_Click( object sender, EventArgs e)
{
IsShowLoading(
true );
this .picLoginBox.Enabled = false ;
this .lblLoading.Text = " 系统正在加载中,请稍候... " ;
timer_load.Start();
}

private void timer_load_Tick( object sender, EventArgs e)
{
try
{
if (frm != null )
{
timer_load.Stop();
this .Hide();
frm.Opacity
= 1 ; // 设置窗体正常显示
IsShowLoading( false );
}
else
{
frm
= new FrmMain();
frm.Opacity
= 0 ; // 设置窗体为完全透明
frm.Show();
this .TopMost = true ;
}
}
catch (Exception ex)
{
HandleError(ex);
}
}

   

    2.无边框窗体的移动  ——直接贴出代码,Demo可从优快云上下载:http://hutao123654.download.youkuaiyun.com/

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
using System;
using System.Collections.Generic;
using System.Text;

namespace ZhiyiForm.CodeFile
{
using System.Windows.Forms;
internal class FormMove
{
private bool isMouseDown = false ;
private System.Drawing.Point FormLocation; // form的location
private System.Drawing.Point mouseOffset; // 鼠标的按下位置
private Form movedForm = null ;
private Control conObj = null ;

private FormMove()
{ }

/// <summary>
///
/// </summary>
/// <param name="movedForm"> 要移动的窗体 </param>
/// <param name="conObj"> 控制窗体移动的控件,为null,则是窗体本身 </param>
public FormMove(Form movedForm, Control conObj)
{
this .movedForm = movedForm;
this .conObj = (conObj == null ) ? movedForm:conObj;
this .conObj.MouseDown += new MouseEventHandler(ConObj_MouseDown);
this .conObj.MouseMove += new MouseEventHandler(ConObj_MouseMove);
this .conObj.MouseUp += new MouseEventHandler(ConObj_MouseUp);
}


private void ConObj_MouseDown( object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown
= true ;
FormLocation
= movedForm.Location;
mouseOffset
= Control.MousePosition;
this .conObj.Cursor = System.Windows.Forms.Cursors.SizeAll;
}
}

private void ConObj_MouseUp( object sender, MouseEventArgs e)
{
this .conObj.Cursor = System.Windows.Forms.Cursors.Default;
isMouseDown
= false ;
}

private void ConObj_MouseMove( object sender, MouseEventArgs e)
{
if (isMouseDown)
{
int _x = 0 ;
int _y = 0 ;
System.Drawing.Point pt
= Control.MousePosition;
_x
= mouseOffset.X - pt.X;
_y
= mouseOffset.Y - pt.Y;

movedForm.Location
= new System.Drawing.Point(FormLocation.X - _x, FormLocation.Y - _y);
}
}
}
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值