遇到一个需求就是 一个窗口只允许最大化和最小化 并且窗口的下面的状态栏不能被遮住
开始以为很简单的设置几个属性就好了.结果弄了好几个小时才解决这个问题.
首先是 不运行改变窗口大小的问题 需要屏蔽最大化和还原的按钮 只允许最大化和关闭.
通过设置程序已最大化启动 并在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有具体说明
通过屏蔽窗口菜单栏 最小化,恢复,关闭 以外的消息来禁用实现无法改变窗体大小的功能
感觉应该有别的方法解决这个问题, 不知道大家有没遇到这种需求. 如果有好的解决方法 请告诉我.