欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WinForm中的几个实用技巧汇总

程序员文章站 2023-12-17 12:30:04
本文汇总了几个winform中常见的实用技巧,对于c#程序开发有着很好的参考借鉴价值。具体分析如下: 一、屏蔽窗体右上角关闭按钮 1.重写onclosing...

本文汇总了几个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);
}

更多方法可以参考:

二、屏蔽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程序设计可以带来很大帮助。

上一篇:

下一篇: