WinForm中的几个实用技巧汇总

作者:shichen2014 时间:2022-08-12 13:17:02 

本文汇总了几个WinForm中常见的实用技巧,对于C#程序开发有着很好的参考借鉴价值。具体分析如下:

一、屏蔽窗体右上角关闭按钮

1.重写OnClosing


protected override void OnClosing(CancelEventArgs e)
{
 if(this.Visible)
 {
   e.Cancel=true;
//
// WHATE TODO
//
 }
}

2.重写WndProc


protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int) m.WParam == SC_CLOSE)
{
// User clicked close button
this.WindowState = FormWindowState.Minimized;
return;
}
base.WndProc(ref m);
}

更多方法可以参考:
http://topic.csdn.net/u/20091220/21/5228d0d6-26aa-48b8-81aa-293f7c7339f8.html?94449
http://topic.csdn.net/u/20090419/18/970d8ad9-ed9a-4bd9-a623-81d23106545b.html

二、屏蔽CTRL-V

在WinForm中的TextBox控件没有办法屏蔽CTRL-V的剪贴板粘贴动作,如果需要一个输入框,但是不希望用户粘贴剪贴板的内容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V键,例子:


private void richTextBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if(e.Control && e.KeyCode==Keys.V)
e.Handled = true;
}

三、应用程序单例运行


#region 单实例运行
/// <summary>
/// 单实例运行
/// </summary>
/// <param name="frm">所要运行的主窗体</param>
public static void SingleRun(Form frm)
{
 System.Threading.Mutex mutex = new System.Threading.Mutex(false,"SINGLE_INSTANCE_MUTEX");
 if (!mutex.WaitOne(0, false))
 {
mutex.Close();
mutex = null;
 }
 if (mutex != null)
 {
Application.Run(frm);
 }
 else
 {
MessageBox.Show("应用程序已启动","信息提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
 }
}
#endregion

四、将控件转换成圆形


#region 将控件转换为圆形
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr BeginPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int SetBkMode(IntPtr hdc,int nBkMode);
const int TRANSPARENT=1;
[System.Runtime.InteropServices.DllImport("gdi32")]  
private static extern IntPtr EndPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr PathToRegion(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int Ellipse(IntPtr hdc,int x1,int y1,int x2,int y2);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetWindowRgn(IntPtr hwnd,IntPtr hRgn,bool bRedraw);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr GetDC(IntPtr hwnd);
/// <summary>
/// 将控件转为圆形
/// </summary>
/// <param name="control">控件名</param>
public static void MakeControlToCircle(Control[] control)
{
 IntPtr dc;
 IntPtr region;
 for(int i=0;i<control.Length;i++)
 {
 dc=GetDC(control[i].Handle);
 BeginPath(dc);
 SetBkMode(dc,TRANSPARENT);
 Ellipse(dc,0,0,control[i].Width-3,control[i].Height-2);
 EndPath(dc);
 region=PathToRegion(dc);
 SetWindowRgn(control[i].Handle,region,false);
 }  
}
 #endregion

五、在同一应用程序中同一窗体只打开一个


/// <summary>
/// 在同一应用程序中同一窗体只打开一个
/// </summary>
/// <param name="frmOpen">要打开的窗体实例</param>
/// <returns></returns>
public static void OpenSeamForm(Form frmOpen)
{
 foreach (Form frm in Application.OpenForms)
 {
if (frm.Text == frmOpen.Text)
{
  frm.Visible = true;
  frm.WindowState = FormWindowState.Normal;
  frm.Activate();
  return;
}
 }
 frmOpen.Show();
}

相信本文所述实例对大家WinForm程序设计可以带来很大帮助。

标签:WinForm
0
投稿

猜你喜欢

  • 浅谈Mybatis分页插件,自定义分页的坑

    2021-12-15 01:28:20
  • SpringBoot 应用程序测试实现方案

    2021-12-18 04:27:54
  • 基于C#技术实现身份证识别功能

    2023-10-01 14:16:26
  • Android提高之使用NDK把彩图转换灰度图的方法

    2023-07-22 02:00:07
  • 基于SpringBoot多线程@Async的使用体验

    2021-07-15 04:47:04
  • Android 设置应用全屏的两种解决方法

    2023-05-07 01:27:50
  • Mybatis映射文件规则实例详解

    2022-04-22 03:08:14
  • SWT(JFace)体验之ViewForm的使用

    2023-10-20 13:02:01
  • MyBatis Plus插件机制与执行流程原理分析详解

    2021-10-09 20:53:48
  • Gson之toJson和fromJson方法的具体使用

    2021-07-20 16:28:47
  • Android使用Matrix旋转图片模拟碟片加载过程

    2022-08-22 21:07:32
  • C#设计模式实现之迭代器模式

    2023-05-31 19:21:58
  • Android 应用签名的两种方法

    2023-07-29 14:02:04
  • C# WinForm RichTextBox文本动态滚动显示文本方式

    2021-09-12 20:44:31
  • IDEA自定义pom依赖的步骤详解

    2021-11-06 04:14:32
  • Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式

    2021-10-19 21:20:08
  • C#实现图形界面的时钟

    2022-10-03 15:10:50
  • Android实现调用摄像头拍照并存储照片

    2023-05-02 10:48:20
  • Java中使用回调函数的方法实例

    2023-01-28 19:24:21
  • DataGridView控件显示行号的正确代码及分析

    2022-07-26 22:05:50
  • asp之家 软件编程 m.aspxhome.com