lovegis

导航

Winform小技巧

未添加"(静态)"的成员为实例成员

获取程序可执行文件的路径:System.Reflection.Assembly.GetEntryAssembly().Location


获取程序所在文件夹的路径:System.Environment.CurrentDirectory


获取Windows系统特殊文件夹的路径:System.Environment.GetFolderPath( Environment.SpecialFolder  folder )


获取鼠标的屏幕坐标:System.Windows.Forms.Control.MousePosition(静态)


屏幕坐标转换为工作区坐标:System.Windows.Forms.Control.PointToClient(Point p)


获取程序集中的资源:
System.Resources.ResourceManager 类


控件和对象属性双向绑定:对象实需现接口System.ComponentModel.INotifyPropertyChanged接口


向活动应用程序发送击键:System.Windows.Forms.SendKeys.Send (string keys)(静态)


窗体显示后改变窗体的位置:
1.修改Form.StartPosition 为System.Windows.Forms.FormStartPosition.Manual
2.修改Form.Location

查看窗体样式:利用VS自带工具spy++


窗体显示在另一窗体之上:Form1.Owner = Form2。这样Form1就显示在Form2上,并随Form2一起关闭和最小化。


闪烁窗体:
调用Api"FlashWindow"
DllImport("user32.dll")]  
private static extern bool FlashWindow(IntPtr hwnd, bool bInvert);
public static void FlashWindow(System.Windows.Forms.Form window)
{
  FlashWindow(window.Handle, true);
}


窗体没有焦点也触发按键事件:
  Form.KeyPreview设置为true,窗体将接受所有控件的按键事件。要仅在窗体级别处理键盘事件并且不允许控件接收键盘事件,请将窗体的 KeyPress 事件处理程序中的 KeyPressEventArgs.Handled 属性设置为 true。


窗体全屏:
form.WindowState = FormWindowState.Normal;
Rectangle rect = Screen.PrimaryScreen.Bounds;
form.Location = rect.Location;
form.Size =rect.Size;
注意:全屏后如何恢复到之前状态。


在资源管理器中打开文件夹的父文件夹并使该文件夹处于选中状态:System.Diagnostics.Process.Start("explorer.exe", dirPath);


在资源管理器中打开文件的文件夹并使该文件处于选中状态:System.Diagnostics.Process.Start("explorer.exe", "/select," + filePath);


关闭窗体但不出发FormClosing事件:调用Form.Dispose()方法关闭窗体


在主窗体之前显示窗体:
  static   void   Main()    
  {  
    Form  frmMain=new   Form();  
    Form  frmLgn=new   Form();  
    frmLgn.ShowDialog();  
    Application.Run(   frmMain   );   
  }


使控件不显示聚焦框:
如果控件有ShowFocusCues属性则可以通过覆写该属性实现。
protected override bool ShowFocusCues
{
     get
      {
          // 不显示聚焦框
          return false;
      }
}       


过滤Windows消息:System.Windows.Forms.IMessageFilter


NotifyIcon不显示:设置NotifyIcon.Ico属性


PropertyGrid禁止编辑:
在PropertyGrid的ValueChanged事件中添加如下代码
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
        {
            e.ChangedItem.PropertyDescriptor.SetValue(this.propertyGrid1.SelectedObject, e.OldValue);
}


使窗体不显示标题:
重写CreateParams属性,WS_CAPTION是一个常量。
private const int WS_CAPTION = 0XC00000;
protected override CreateParams CreateParams
 {
        get
        {
             CreateParams createParams;
             createParams = base.CreateParams;
             createParams.Style ^= WS_CAPTION;

             return createParams;
        }
 }


移动无标题栏窗体
在窗体的mousemove事件中处理,不能放进mousedown中,否则会无法接受鼠标双击消息
Form_MouseMove()
{
       ReleaseCapture();
       SendMessage(this.FindForm().Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
[DllImport("user32.dll")]
private static extern bool ReleaseCapture();
[DllImport("user32.dll")]
private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MOVE = 0xF010;
private const int HTCAPTION = 0x0002;


强制重新绘制窗体及其内容的两种方法:
1.将 Invalidate 方法的重载之一与 Update 方法一起使用。
2调用 Refresh 方法,此方法强制控件重新绘制其自身及其所有子级。这等效于将 Invalidate 方法设置为 true 并将该方法与 Update 一起使用。
Invalidate 方法控制绘制或重新绘制的内容。Update 方法控制发生绘制或重新绘制的时间。如果将 Invalidate 和 Update 方法一起使用,而不是调用 Refresh,则重新绘制的内容取决于您使用的 Invalidate 的重载。Update 方法仅仅是强制立即绘制控件,而 Invalidate 方法则控制当您调用 Update 方法时所绘制的内容。


自己绘制树节点:
设置TreeView.DrawNode属性为OwnerDrawText或OwnerDrawAll,在TreeViewDrawNode。
在TreeView.DrawNode 事件中进行绘制。只有当节点可见时才绘制,否则可能会在TreeView左上角绘制不可见的节点,使显示出现问题。
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
  if (e.Node.IsVisible)//判断节点是否可见   
  {
    if (e.State == 0)
    {
      //在这里添加未选中节点绘制代码,节点在未选中状态下State为0,System.Windows.Forms.TreeNodeStates枚举中并不包括0,
    }
    else
    {
      //其他状态的绘制代码
    }
  }
}


在IE进程中打开网页:
仅对IE6有效
//在框架"kaka"中打开bing,这时会打开IE,并显示网页http://cn.bing.com/。
WebBrowser.Navigate("http://cn.bing.com/","kaka");
//打开百度也指定同一个框架"kaka",就会更改已打开的IE的Uri为百度。
WebBrowser.Navigate("http://www.baidu.com","kaka",);


创建窗体大小的画布:
重绘窗体边框需要创建和窗体一样大的画布。
以下是重载OnPaintBackground方法,在绘制背景时绘制边框
protected override void OnPaintBackground(PaintEventArgs e)
{
   IntPtr  windowDC = GetWindowDC(this.Handle);
  try
  {
    using (Graphics graphics = Graphics.FromHdc(windowDC))
    {
     //绘制边框
    }
  }
  finally
  {
    ReleaseDC(this.Handle, windowDC);
  }
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MOVE = 0xF010;
private const int HTCAPTION = 0x0002;

为窗体和控件设置双缓冲:
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。


手动呈现双缓冲:
参考以下类型
BufferedGraphics
BufferedGraphicsContext
BufferedGraphicsManager


生成字符串的哈希编码:System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFiles(string content,string format)


获取配置文件的路径:AppDomain.CurrentDomain.SetupInformation.ConfigurationFile


posted on 2009-08-12 09:00  lovegis  阅读(942)  评论(0编辑  收藏  举报