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
投稿
猜你喜欢
java调用Restful接口的三种方法
2021-09-07 16:49:04
Mybatis 动态SQL的几种实现方法
2023-11-10 12:15:15
SpringCloud Feign配置应用详细介绍
2023-07-14 04:23:03
带你了解Java中Static关键字的用法
2021-11-07 15:04:32
Java面试基础之TCP连接以及其优化
2023-10-02 17:43:51
mybatis-plus排除非表中字段的操作
2022-04-22 03:48:41
java实现截取PDF指定页并进行图片格式转换功能
2023-08-24 02:58:56
聊一聊SpringBoot服务监控机制
2023-02-09 02:47:48
浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)
2022-06-13 01:30:40
springboot如何读取自定义properties并注入到bean中
2022-12-16 22:22:09
本地jvm执行flink程序带web ui的操作
2022-09-03 20:49:00
最新IntelliJ IDEA2017.3 激活方式
2023-08-12 00:47:24
IntelliJ IDEA Project窗口的一些设置详解
2023-11-09 04:54:44
Java实现读取resources目录下的文件路径的九种方式
2023-11-23 11:47:02
Android中获取资源 id 及资源 id 的动态获取
2023-06-30 04:38:06
MyBatis中的JdbcType映射使用详解
2023-09-07 20:05:38
spring boot实现过滤器和拦截器demo
2023-08-24 07:15:01
springboot v2.0.3版本多数据源配置方法
2023-07-27 06:37:57
ShardingSphere jdbc集成多数据源的实现步骤
2023-11-25 07:54:56
springboot中validator数据校验功能的实现
2021-07-31 17:43:50