C#编写Windows窗体程序最大化引起的闪烁总结
来源:互联网 发布:淘宝店面装修 编辑:程序博客网 时间:2024/05/21 11:28
1:窗体最大化前,窗体最好没有任何控件在显示,并且控件不要有背景图,等窗体最大化后才显示控件以及加载背景图。
2:最大化源码(从网上搜回来的:)
using System;using System.Windows.Forms;using System.Drawing;using System.Runtime.InteropServices;namespace XXXX.Definition{ public class WinApi { [DllImport("user32.dll", EntryPoint = "GetSystemMetrics")] public static extern int GetSystemMetrics(int which); [DllImport("user32.dll")] public static extern void SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int X, int Y, int width, int height, uint flags); private const int SM_CXSCREEN = 0; private const int SM_CYSCREEN = 1; private static IntPtr HWND_TOP = IntPtr.Zero; private const int SWP_SHOWWINDOW = 64; // 0x0040 public static int ScreenX { get { return GetSystemMetrics(SM_CXSCREEN); } } public static int ScreenY { get { return GetSystemMetrics(SM_CYSCREEN); } } public static void SetWinFullScreen(IntPtr hwnd) { SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX, ScreenY, SWP_SHOWWINDOW); } } /// <summary> /// Class used to preserve / restore state of the form /// </summary> public class FormState { private FormWindowState winState; private FormBorderStyle brdStyle; private bool topMost; private Rectangle bounds; private bool isMaximized = false; public bool IsMaximized { get { return isMaximized; } } public void Maximize(Form targetForm) { if (!isMaximized) { targetForm.SuspendLayout(); isMaximized = true; Save(targetForm); targetForm.WindowState = FormWindowState.Maximized; targetForm.FormBorderStyle = FormBorderStyle.None; targetForm.TopMost = false; WinApi.SetWinFullScreen(targetForm.Handle); targetForm.ResumeLayout(true); } } public void Save(Form targetForm) { targetForm.SuspendLayout(); winState = targetForm.WindowState; brdStyle = targetForm.FormBorderStyle; topMost = targetForm.TopMost; bounds = targetForm.Bounds; targetForm.ResumeLayout(true); } public void Restore(Form targetForm) { targetForm.WindowState = winState; targetForm.FormBorderStyle = brdStyle; targetForm.TopMost = topMost; targetForm.Bounds = bounds; isMaximized = false; } }}
下面是使用的代码:
/// <summary> /// 正常的窗体状态 /// </summary> public FormState FrmState=new FormState();//窗体点击esc时切换 private void MaxForm_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) if (FrmState.IsMaximized) FrmState.Restore(this); else FrmState.Maximize(this); }
下面要留意的,就是闪烁问题的,大家留意下:
窗体的Shown事件:
private void frm_Main_Shown(object sender, EventArgs e) { this.Visible = false; FrmState.Maximize(this); this.Visible = true; //加载背景图 AutoLoadBackImage(); }其实,窗体闪烁严重的在于窗体有很多控件或者是存在背景图。因此,在最大化前必须让窗体处于控件量最小,没有背景图的情况。在最大化后再对控件以及背景图进行加载。
- C#编写Windows窗体程序最大化引起的闪烁总结
- C#关于Windows窗体最大化所引起的闪烁问题的处理经验
- C#程序实现窗体的最大化/最小化
- 关于c# winForm窗体最大化的设置
- C# 窗体最大化,最小化,还原 的代码
- 关于c# winForm窗体最大化的设置
- 关于c# winForm窗体最大化的设置
- 最大化多文档程序的子窗体
- windows API 最大化窗体
- C# 实现窗体最大化
- C#窗体最大化
- C# 窗体自动最大化
- C#0008--制作闪烁的窗体
- C# 解决窗体闪烁
- C# windows frist 窗体程序
- C#编写windows服务程序方法与总结
- c# MDI子窗体最大化
- C#禁用窗体最大化按钮
- java反射经典实例 Java Reflection Cookbook
- 迭代器简介
- 半自动密码输入技术
- Java中关于i++与++i的问题
- rt2870 usb wifi在mx53 android平台上的移植
- C#编写Windows窗体程序最大化引起的闪烁总结
- js获取当前网页地址,自动刷新当前页
- 参考别人写的编码转码
- 2012-12-13集结号【创赢操盘】周四股市策略
- design pattern notes [1] - Bridge and composite
- EXTJS的xtype的类型
- 解决在MyEclipse下DEBUG模式启动Tomcat慢的问题 .
- ubuntu下如何安装NFS服务用于文件共享
- mysql服务器的优化