遇到一个需求就是 一个窗口只允许最大化和最小化 并且窗口的下面的状态栏不能被遮住
开始以为很简单的设置几个属性就好了.结果弄了好几个小时才解决这个问题.
首先是 不运行改变窗口大小的问题 需要屏蔽最大化和还原的按钮 只允许最大化和关闭.
通过设置程序已最大化启动 并在Form_Load中获取窗体大小 并设置最大值和最小值来实现不允许改变窗体大小
发现没用. 试了好几种方式都会出现窗口最下面的状态栏被windows菜单栏遮住, 最后采用屏蔽窗体消息来实现这个功能
1: using System;
2: using System.Collections.Generic;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Drawing;
6: 7: using System.Text;
8: using System.Windows.Forms;
9: 10: namespace WinFormDemo
11: {12: public partial class Form1 : Form
13: {14: public Form1()
15: { 16: InitializeComponent(); 17: } 18: 19: private void Form1_Load(object sender, EventArgs e)
20: { 21: this.MaximizeBox = false;
22: IsLoad = true;
23: } 24: 25: public bool IsLoad { get; set; }
26: 27: 28: public const int WM_SYSCOMMAND = 0x112;
29: 30: public const int SC_MINIMIZE = 0xF020;
31: public const int SC_CLOSE = 0xF060;
32: public const int SC_RESTORE = 0xF120;
33: 34: protected override void WndProc(ref Message m)
35: {36: if (m.Msg == WM_SYSCOMMAND)
37: { 38: 39: int wParam = (int)m.WParam;
40: //拦截 除最小化 恢复 关闭 以外的消息
41: if (wParam != SC_MINIMIZE && wParam != SC_CLOSE && wParam != SC_RESTORE)
42: {43: return;
44: } 45: } 46: base.WndProc(ref m);
47: } 48: 49: 50: 51: private void Form1_SizeChanged(object sender, EventArgs e)
52: { 53: 54: 55: if (WindowState == FormWindowState.Maximized)
56: {57: if (IsLoad)
58: {59: //最大化 时禁用 最大化按钮
60: this.MaximizeBox = false;
61: } 62: 63: }64: else if(WindowState == FormWindowState.Minimized)
65: {66: // 最小化时启用 最大化按钮
67: //最大化 禁用时 恢复原始大小 不会最大化
68: this.MaximizeBox = true;
69: } 70: } 71: 72: 73: 74: } 75: }
具体的消息类型的值 http://msdn.microsoft.com/en-us/library/ms646360(v=vs.85).aspx msdn有具体说明
通过屏蔽窗口菜单栏 最小化,恢复,关闭 以外的消息来禁用实现无法改变窗体大小的功能
感觉应该有别的方法解决这个问题, 不知道大家有没遇到这种需求. 如果有好的解决方法 请告诉我.
浙公网安备 33010602011771号