本文实例讲述了WinForm限制窗体不能移到屏幕外的方法。分享给大家供大家参考。具体实现方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
namespace AppForm
{
/// <summary>
/// WinForm限制窗体不能移到屏幕外
/// </summary>
public class FrmBase : Form
{
private Point _mouseDownPos;
private bool _move;
protected override void WndProc( ref Message m)
{
RECT nativeRect;
switch (m.Msg)
{
case 0x20:
int lp = m.LParam.ToInt32();
if ((lp & 0xFFFF) == 2 &&
((lp >> 0x10) & 0xFFFF) == 0x201)
{
_mouseDownPos = Control.MousePosition;
_move = true ;
}
break ;
case 0x231:
if (_move)
{
Rectangle rect = Screen.GetWorkingArea( this );
nativeRect = new RECT(
_mouseDownPos.X - Location.X,
_mouseDownPos.Y - Location.Y,
rect.Right - (Bounds.Right - _mouseDownPos.X),
rect.Bottom - (Bounds.Bottom - _mouseDownPos.Y));
ClipCursor( ref nativeRect);
}
break ;
case 0x0232:
if (_move)
{
nativeRect = new RECT(Screen.GetWorkingArea( this ));
ClipCursor( ref nativeRect);
_move = false ;
}
break ;
}
base .WndProc( ref m);
}
[DllImport( "user32.dll" )]
public static extern bool ClipCursor( ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
public RECT( int left, int top, int right, int bottom)
{
Left = left;
Top = top;
Right = right;
Bottom = bottom;
}
public RECT(Rectangle rect)
{
Left = rect.Left;
Top = rect.Top;
Right = rect.Right;
Bottom = rect.Bottom;
}
public Rectangle Rect
{
get
{
return new Rectangle(
Left,
Top,
Right - Left,
Bottom - Top);
}
}
public Size Size
{
get
{
return new Size(Right - Left, Bottom - Top);
}
}
public static RECT FromXYWH( int x, int y, int width, int height)
{
return new RECT(x,
y,
x + width,
y + height);
}
public static RECT FromRectangle(Rectangle rect)
{
return new RECT(rect.Left,
rect.Top,
rect.Right,
rect.Bottom);
}
}
}
}
|
希望本文所述对大家的C#程序设计有所帮助。