在Windows编程中,有时需要限制窗体的大小。那么在C#中如何实现对窗体大小的限制呢?要限制窗体的大小,就必须处理WM_SIZEING消息,而WM_SIZEING消息的lParam参数,是一个指针,它指向RECT结构。这样,C#中又该如何处理指针类型的数据呢?下面的代码仅对窗体的宽度作限制,是根据AOGO的汇编程序改写。看看代码。就知道C#中是如何处理指针类型的数据了。(由此可见C#是多么健壮强劲!)using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; // 注意此命名空间的Marshal类, // 它提供了许多类型转化方法: // Marshal.PtrToStringAnsi(); // Marshal.PtrToStringAuto(); // Marshal.PtrToStringBSTR(); // Marshal.PtrToStringUni(); // Marshal.PtrToStructure(); // Marshal.StringToBSTR(); // Marshal.StringToCoTaskMemAnsi(); // Marshal.StringToCoTaskMemAuto(); // Marshal.StringToCoTaskMemUni(); // Marshal.StringToHGlobalAnsi(); // Marshal.StringToHGlobalAuto(); // Marshal.StringToHGlobalUni(); // Marshal.StructureToPtr(); // 声明Winodws消息常量 private const int WM_SIZEING = 0x0214; // 声明RECT结构 public struct RECT { public int left; public int top; public int right; public int bottom; }// 以下是处理WINDOWS消息的主要代码 protected override void WndProc(ref System.Windows.Forms.Message m ) { switch(m.Msg) { case WM_SIZEING: ///*****以下各种方法,生成代码大小顺序是由小到大
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices; // 注意此命名空间的Marshal类,
// 它提供了许多类型转化方法:
// Marshal.PtrToStringAnsi();
// Marshal.PtrToStringAuto();
// Marshal.PtrToStringBSTR();
// Marshal.PtrToStringUni();
// Marshal.PtrToStructure();
// Marshal.StringToBSTR();
// Marshal.StringToCoTaskMemAnsi();
// Marshal.StringToCoTaskMemAuto();
// Marshal.StringToCoTaskMemUni();
// Marshal.StringToHGlobalAnsi();
// Marshal.StringToHGlobalAuto();
// Marshal.StringToHGlobalUni();
// Marshal.StructureToPtr(); // 声明Winodws消息常量
private const int WM_SIZEING = 0x0214; // 声明RECT结构
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}// 以下是处理WINDOWS消息的主要代码
protected override void WndProc(ref System.Windows.Forms.Message m )
{
switch(m.Msg)
{
case WM_SIZEING: ///*****以下各种方法,生成代码大小顺序是由小到大
// 第一种方法,简洁明了
// RECT rc = (RECT)m.GetLParam(typeof(RECT)); // 第二种方法,普适通用。代码比第一种方法多 5 字节
// RECT rc=(RECT)Marshal.PtrToStructure(m.LParam ,typeof(RECT)); // 第三种方法,易懂稍繁。代码比第二种方法多 4 字节
RECT rc = new RECT();
rc = (RECT)m.GetLParam(rc.GetType());
// 限制窗体宽度不超过600
if (rc.right - rc.left >450)
{
rc.right = rc.left + 450;
}
else if (rc.right - rc.left <200)
{
rc.right = rc.left + 200;
} // 将结构rc各字段的值显示出来
textBox1.Text = rc.left.ToString();
textBox2.Text = rc.top.ToString();
textBox3.Text = rc.right.ToString();
textBox4.Text = rc.bottom.ToString(); // 将结构rc复制到m.LParam指针所指向的RECT结构
Marshal.StructureToPtr(rc,m.LParam,true); break;
default:
base.WndProc(ref m); // 调用基类函数处理其他消息。
break;
}
}
或在窗口的sizechanged事件中:使窗口的宽和高为一个固定的值
2、把窗体的最大尺寸和最小尺寸改成同一值
同时将maxsizeable 设置成false就可以了
试试就知道了 :)
只是路過
FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
MaximizeBox = false;
同时将maxsizeable 设置成false就可以了设置就成
BorderStyle 设为FixedSingle
不能最大化窗口
MaximuzeBox 设为False
不能最小化窗口
MinimizeBox 设为False
窗体右上角没有关闭按钮,不能关闭窗口,需要用alt+F4
ControlBox 设为False
点击Form,更改下面的这些属性就可以了:
边框不可以变大小(这一个属性就是你要求的了)
FormBorderStyle 设为FixedSingle
不能最大化窗口
MaximuzeBox 设为False
不能最小化窗口
MinimizeBox 设为False
窗体右上角没有关闭按钮,不能关闭窗口,需要用alt+F4
ControlBox 设为False