WinForm限制窗体不能移到屏幕外的方法

本文实例讲述了WinForm限制窗体不能移到屏幕外的方法。分享给大家供大家参考。具体实现方法如下:

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#程序设计有所帮助。

(0)

相关推荐

  • WinForm实现同时让两个窗体有激活效果的特效实例

    本文实例讲述了WinForm实现同时让两个窗体有激活效果的特效.主要采用windows api实现一个窗体激活的时候给另外一个发消息.分享给大家供大家参考. 具体实现方法如下: using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication43 { public partial class Form1 : Form { Form frm =nu

  • Winform窗体效果实例分析

    本文实例分析了Winform窗体效果.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication4 { public partial cl

  • C# WINFORM 强制让窗体获得焦点的方法代码

    复制代码 代码如下: //调用API [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); //获得本窗体的句柄 [System.Runtime.InteropService

  • winform实现创建最前端窗体的方法

    本文实例讲述了winform实现创建最前端窗体的方法.分享给大家供大家参考.具体实现方法如下: 一.需求: 1).需要这个窗体始终处于前端而且可用 2).在主窗体打开其他模态窗体的时候,这个Form也要处于活动状态. 注意: 设置了Form的 TopMost 属性 但是在 主窗体打开模态窗体的时候无效 二.解决方案: 复制代码 代码如下: Thread th = new Thread(() => { Application.Run(new FormA()); }); th.Start(); 或者

  • winform创建不规则窗体的方法

    本文实例讲述了winform创建不规则窗体的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Win32; using System.Drawing

  • C#中Winform窗体Form的关闭按钮变灰色的方法

    本文实例讲述了C#中Winform窗体Form的关闭按钮变灰色的方法,对C#程序设计有一定的借鉴价值,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: [ DllImport ( "USER32.DLL" ) ] public static extern int GetSystemMenu(int hwnd, int bRevert); [ DllImport ( "USER32.DLL" ) ] public static extern int Rem

  • WinForm窗体间传值的方法

    本文实例讲述了WinForm窗体间传值的方法.分享给大家供大家参考.具体实现方法如下: 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:   1.公共静态变量: 2.使用共有属性: 3.使用委托与事件: 4.通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双向的,实现简单   实现代码如下: 在一个app类中定义一个静态成员value 复制代码 代码如下: public class app { public static string value

  • WinForm实现窗体最大化并遮盖任务栏的方法

    本文实例讲述了WinForm实现窗体最大化并遮盖任务栏的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Windows.Forms; using System.Drawing; namespace CSImageFullScreenSlideShow { public class FullScreen { private FormWindowState winState; private FormBorderStyle brdStyle; p

  • WinForm限制窗体不能移到屏幕外的方法

    本文实例讲述了WinForm限制窗体不能移到屏幕外的方法.分享给大家供大家参考.具体实现方法如下: 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 { /// <s

  • C# WinForm实现窗体上控件自由拖动功能示例

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能.分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

  • 在类库或winform项目中打开另一个winform项目窗体的方法

    本文实例讲述了在类库或winform项目中打开另一个winform项目窗体的方法.分享给大家供大家参考.具体如下: 一.问题: 假设类库或winform项目为A,另一个winform项目为B.那麽在A中添加一个接口,里面有一个Show方法,然后在B中写一个类b继承这个接口,并重写这个方法,具体内容为弹出某个窗体.然后在A中另一个类a中实例化B中的b类,并把它赋给A中的接口,然后调用接口的Show方法就可以弹出B中指定的窗体. 需要注意的是项目A和项目B需要互相引入对方的EXE或DLL文件. 二.

  • WinForm遍历窗体所有子控件的方法

    本文实例讲述了WinForm遍历窗体所有子控件的方法.分享给大家供大家参考,具体如下: /// <summary> /// C# 只遍历控件子控件,不遍历孙控件 ///当控件有子控件时,需要用递归的方法遍历,才能全部列出控件上的控件 /// </summary> /// <typeparam name="T">控件类型</typeparam> /// <param name="control">要遍历的控件

  • visual studio 2019使用net core3.0创建winform无法使用窗体设计器

    微软发布正式版net core3.0后,迫不及待的想体验一下用visual studio 2019在net core3.0下创建winform程序.创建方法很简单,和以前visual studio版本步骤差不多. 创建完成之后,尴尬的事情发生了,无法使用窗体设计器,双击Form1.cs文件不行,使用快捷键shift+F7也不行,在网上找了很久,发现好多人都遇到过这种问题,目前有两种解决方案 方案1 项目中创建多目标框架,包含net framework和net core. 打开csproj文件,将

  • C# WinForm遍历窗体控件的3种方法

    目录 1.循环遍历 2.递归遍历 3.使用反射 1.循环遍历 private void GetControls(Control fatherControl) { Control.ControlCollection sonControls = fatherControl.Controls; foreach (Control control in sonControls) { listBox1.Items.Add(control.Name); } } 结果:能获取到Panel.GroupBox.Ta

  • C#开发Winform实现窗体间相互传值

    目录 一.前言 二.公共属性 三.公共方法 四.委托 1.定义一个委托 2.实例化一个此委托类型的事件 3.定义要执行的方法 4.将方法绑定到事件 5.触发委托 一.前言 我们在做Winform窗体程序开发的时候,会经常遇到窗体之间相互传值.假设有下面的一个场景:一个主窗体和一个子窗体,点击主窗体上面的按钮给子窗体传值,并在子窗体上面显示出来,一般会有如下几种方式实现. 二.公共属性 我们可以在子窗体里面定义一个公共的属性,然后在父窗体里面给公共属性赋值,这样可以实现窗体之间传值,子窗体代码如下

  • winform关闭窗体FormClosing事件用法介绍

    在窗体中有FormClosing这个事件,这个事件是在窗体关闭时候运行的.如果要取消某个事件的操作,那么就在该事件中写上e.Cancel=true就能取消该事件,也就是不执行该事件.所以,你要在窗体关闭时候,跳出一个窗口提示是否关闭窗体,如果选择不关闭,那么写上e.Cancel=true就可以了,如果选择关闭,那么写上e.Cancel=false. 示例代码: using System; using System.Collections.Generic; using System.Compone

随机推荐