zoukankan      html  css  js  c++  java
  • .Net Winform开发笔记(三) 谈谈自制控件

    末日这天写篇博客吧,既然没来,那就纪念一下。

    这次谈谈自制控件,也就是自定义控件,先上图,再说

    1.扩展OpenFileDialog,在OpenFileDialog中添加各种文件(.txt,.jpg,.excel等等)的预览功能

    2.重写ListBox,增加折叠、鼠标背影、分类等功能

    -----------------------------分割线--------------------------------------------------------------

    一、扩展OpenFileDialog

    许多软件的打开对话框都有预览功能,最常见的就是图片预览,用鼠标选择一个图片文件后,右侧或者下侧就会有该图片的缩略图(photoshop中属于后者)。在winform编程中,有专门的打开文件对话框的类OpenFileDialog,但是他不提供文件预览功能,封装得实在太好。看看它公开那些接口

    提到扩展,很多人可能想到继承它就可以扩展它,可惜OpenFileDialog声明为sealed,不允许从他继承。稍微底层一点的,想到可以通过Win32 API来修改它的显示方式,只可惜,如你所见,它根本没提供Handle属性,更别说HandleCreated、HandleDestroyed等事件了。那么怎么样子搞呢?其实答案还是通过Win32 API,只是我们取得它的句柄的方式要复杂一点而且调用API的时机隐晦了一点。

    提示:

    1.Win32 API操作窗体需要知道窗体的句柄;

    2.不熟悉Win32编程的同学可以先上网查查资料,特别是不知道SetParent、SetWindowPos等API是干嘛的,我觉得以下的看不懂。

    为什么说取得它的句柄复杂了一点?难道不是用“FindWindow”、“FindWindowEx”、“ EnumChildWindows”等获取OpenFileDialog的句柄,再用“SetParent”、“SetWindowPos”等API将.net控件(本例中是DataGridView控件,当然可以使其他任何一种)添加到OpenFileDialog中去?没错,以上列举出来的API都是基本要用到的,“只是用在什么地方、什么时候用”是个比较麻烦的问题,原因如下:

    1)我们知道OpenfileDialog显示的是模式对话框,也就是说,一旦它ShowDialog(),它以下的代码是不会再执行的,具体原因是什么(我以后的博客会专门讲为什么),你现在可以理解为OpenFileDialog()方法会阻塞调用线程,既然阻塞了调用线程,那么我们再无法控制程序了(直到它返回),根本谈不上再调用API获取OpenFileDialog的句柄然后去操作它。如果有人会说,“我可以另开辟线程去取OpenFileDialog得句柄再操作它”,恩,我不否定这个方法,只是我想说,如果你真的按照这个方法去试,那么肯定会陷入泥潭。因为你不仅要取它的句柄,你还要监视OpenFIleDialog的一举一动,移动、缩放、用户鼠标点击选择文件、更改目录等,然后再操作.net控件(本例中是DataGridView控件,下同),让.net控件去适应OpenFileDialog的大小等等,你会发现你忙死了,甚至有的你根本监视不了,比如用户点击选择文件、更改目录。

    2)就算我们能够在OpenFIleDialog显示之后,取得它的句柄,那么什么时候再调用其他API呢?比如什么时候调用SetWindowPos,让.net控件适应OpenFileDialog的大小变化?什么时候知道用户选择文件发生了变化?

    所以,API方法什么时候用?用在什么地方?就是接下来要讨论的东西。

    我不知道各位在使用各种框架的时候,对“框架”的理解到什么程度,我觉得可以总结成一句话“跟个2b似地注册一些事件,然后苦逼地去写好每一个回调方法,我们却不知道为啥要这样写”,不是么?既然这样,那么我们的API方法只要写在了正确的回调方法中,我们就能到达想要的目的了。考虑几个问题:

    1)OpenFileDialog显示,我们向其中添加.net控件。我们什么时候知道它显示?

    2)OpenFileDialog大小发生变化时,我们要更新.net控件以适应新的大小。我们什么时候知道OpenFileDialog的大小发生了变化?

    3)OpenFileDialog中用户选择的文件发生了变化,我们需要知道新选择的文件路径,用来显示在.net控件中。我们怎么知道选择了什么文件?(这里选择文件指用户用鼠标在OpenFileDialog中单击选取,不是点击“确定”后。)

    以上所有的问题,其实在一个地方都可以知道,那就是监听OpenFileDialog窗体的Windows消息,因为一个窗体的任何一个动作都伴随着一系列的Windows消息(这个可以用Spy++查看)。既然这样,那么我们可以在窗体处理Windows消息的回调方法中调用API方法了,也就是窗体的Control.WndProc方法中。之前已经说过了,OpenFileDialog声明为Sealed,提供的接口少之又少,我们几乎根本不可能接触到OpenFileDialog的WndProc,更谈不上监听Windows消息,然后调用API去操作它。这时候,NativeWindow该出场了,先来引用一下MSDN上对NativeWindow的解释:

    “提供窗口句柄和窗口过程的低级封装。”

    说了像没说一样,其实就是说,将一个窗口句柄与NativeWindow对象绑定后,该NativeWindow对象就能接收到这个窗体的所有消息。说到Windows消息,我想说一下Windows桌面应用程序的运行流程,其实如果看了我前一篇博客的同学应该有些了解,.Net Winform开发笔记(二)中基本提到了一些。为了配合本次讲解,我再次画了一张图

    上图中,虚线框可以看做是一个.net中的Control类对象(或者其派生类,下同,控件即窗体、窗体即控件),正常情况下,Winform程序会按照1->2->3的步骤运行,当我们将Control类对象的Handle(就是我们常说的窗口句柄,做了一下封装)与一个NativeWIndow对象绑定后,程序不再按照1->2->3这样的顺序运行了,他会按照1->2-1->2-2->3这样运行,也就是说,NativeWindow对象可以拦截Control类对象的WIndows消息,我们完全可以在NativeWIndow中重写他的WndProc方法,像处理自己的Windows消息一样去处理Control类对象的消息。所以,我们就可以在NativeWindow对象的WndProc中调用我们的API方法。

    接下来,上代码(代码只提供大概思路)

    1.扩展对话框

    View Code
     1     public class MultiOpenFileDialog
     2     {
     3         #region fields
     4         private const SetWindowPosFlags UFLAGSHIDE =
     5         SetWindowPosFlags.SWP_NOACTIVATE |
     6         SetWindowPosFlags.SWP_NOOWNERZORDER |
     7         SetWindowPosFlags.SWP_NOMOVE |
     8         SetWindowPosFlags.SWP_NOSIZE |
     9         SetWindowPosFlags.SWP_HIDEWINDOW;
    10         #endregion
    11         public string FileName;
    12         #region public methods
    13         public DialogResult ShowDialog()
    14         {
    15             return ShowDialog(null);
    16         }
    17         public DialogResult ShowDialog(IWin32Window owner)
    18         {
    19             using (OpenFileDialog open = new OpenFileDialog())
    20             {
    21                 MedianForm median = new MedianForm(open);
    22                 median.Show(owner);
    23                 Win32.SetWindowPos(median.Handle, IntPtr.Zero, 0, 0, 0, 0, UFLAGSHIDE); //隐藏中间窗体
    24                 DialogResult dialogresult = open.ShowDialog(median); //将median作为openfileDialog的owner
    25                 median.Close();
    26                 if (dialogresult == DialogResult.OK)
    27                 {
    28                     FileName = open.FileName;
    29                 }
    30                 return dialogresult;
    31             }
    32         }
    33         #endregion
    34     }

    2.监听Dialog的NativeWindow

    View Code
      1     class DialogNativeWindow : NativeWindow,IDisposable
      2     {
      3         IntPtr handle; //待扩展OpenFileDialog的句柄
      4         OpenFileDialog openfiledialog; //待扩展OpenFileDialog
      5         DataGridView addControl; //向窗体中添加新的控件
      6         ChildControlNativeWindow childNative;
      7         bool init = false;
      8 
      9         public DialogNativeWindow(IntPtr handle, OpenFileDialog openfiledialog)
     10         {
     11             this.handle = handle;
     12             this.openfiledialog = openfiledialog;
     13             AssignHandle(handle);
     14 
     15             //设置控件信息
     16             addControl = new DataGridView();
     17             addControl.Width = 600;
     18             addControl.Height = 200;
     19             addControl.DataSource = null;
     20         }
     21 
     22         #region override methods
     23         protected override void WndProc(ref Message m)
     24         {
     25             switch (m.Msg)
     26             {
     27                 case (int)Msg.WM_SHOWWINDOW: //窗体显示
     28                     {
     29                         NativeChild(); 
     30                         AddControl();
     31                         break;
     32                     }
     33                 case (int)Msg.WM_SIZING: //窗体大小改变
     34                     {
     35                         UpdateSize();
     36                         break;
     37                     }
     38                 case (int)Msg.WM_WINDOWPOSCHANGING: //窗体位置变化
     39                     {
     40                         UpdateLocation(m);
     41                         break;
     42                     }
     43             }
     44             base.WndProc(ref m);
     45         }
     46         #endregion
     47 
     48         #region event handlers
     49         void childNative_SelectPathChanged(StringBuilder path)
     50         {
     51             //处理选择目录变化事件
     52             //...
     53         }
     54 
     55         void childNative_SelectFileChanged(StringBuilder file)
     56         {
     57             //处理选择文件变化事件
     58             //如果是xls文件,将其显示在datagridview控件中
     59             string str = file.ToString();
     60             if (str.ToLower().EndsWith(".xls"))
     61             {
     62                 OledbManager manager = new OledbManager();
     63                 if (manager.Connect("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=\'" + str + "\'; Extended Properties='Excel 8.0;'"))
     64                 {
     65                     DataTable tb = manager.SearchTable();
     66                     if (tb != null)
     67                     {
     68                         addControl.Rows.Clear();
     69                         addControl.Columns.Clear();
     70                         foreach (DataColumn col in tb.Columns)
     71                         {
     72                             addControl.Columns.Add(col.ColumnName, col.Caption);
     73                         }
     74                         foreach (DataRow row in tb.Rows)
     75                         {
     76                             object[] objs = new object[tb.Columns.Count];
     77                             for (int i = 0; i < tb.Columns.Count; ++i)
     78                             {
     79                                 objs[i] = row[i];
     80                             }
     81                             addControl.Rows.Add(objs);
     82                         }
     83                     }
     84                 }
     85             }
     86             else
     87             {
     88                 addControl.Rows.Clear();
     89                 addControl.Columns.Clear();
     90             }
     91         }
     92         #endregion
     93 
     94         #region private methods
     95         private void NativeChild()
     96         {
     97             //查找openfileDialog中的子控件
     98             Win32.EnumChildWindows(handle, new Win32.EnumWindowsCallBack(WindowCallBack), 0);
     99         }
    100         private void AddControl()
    101         {
    102             //添加控件到OpenFileDialog界面
    103             Win32.SetParent(addControl.Handle, handle);
    104             RECT currentSize = new RECT();
    105             Win32.GetClientRect(handle, ref currentSize);
    106             addControl.Height = (int)currentSize.Height;
    107             addControl.Location = new Point((int)(currentSize.Width - addControl.Width), 0);
    108 
    109             init = true;
    110         }
    111         private void UpdateLocation(Message m)
    112         {
    113             if (!init) //只初始化openfileDialog的大小一次
    114             {
    115                 WINDOWPOS pos = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
    116                 if (pos.flags != 0 && ((pos.flags & (int)SWP_Flags.SWP_NOSIZE) != (int)SWP_Flags.SWP_NOSIZE))
    117                 {
    118                     pos.cx += addControl.Width; //修改OpenfileDialog的宽度
    119                     Marshal.StructureToPtr(pos, m.LParam, true);
    120 
    121                     RECT currentSize = new RECT();
    122                     Win32.GetClientRect(handle, ref currentSize);
    123                     addControl.Height = (int)currentSize.Height;
    124                 }
    125             }
    126         }
    127         private void UpdateSize()
    128         {
    129             RECT currentSize = new RECT();
    130             Win32.GetClientRect(handle, ref currentSize);       
    131             Win32.SetWindowPos(addControl.Handle, (IntPtr)ZOrderPos.HWND_BOTTOM, 0, 0, (int)addControl.Width, (int)currentSize.Height, UFLAGSSIZEEX); //新添加的控件与openfileDialog大小一致
    132         }
    133         private bool WindowCallBack(IntPtr handle, int lparam)
    134         {
    135             StringBuilder wndClass = new StringBuilder(256);
    136             Win32.GetClassName(handle, wndClass, wndClass.Capacity);//获取控件类名
    137 
    138             if (wndClass.ToString().StartsWith("#32770")) //找到目标控件
    139             {
    140                 childNative = new ChildControlNativeWindow(handle);
    141                 childNative.SelectFileChanged += new ChildControlNativeWindow.SelectFileChangedEventHandler(childNative_SelectFileChanged);
    142                 childNative.SelectPathChanged += new ChildControlNativeWindow.SelectPathChangedEventHandler(childNative_SelectPathChanged);
    143                 return true;
    144             }
    145             return true;
    146         }
    147         #endregion
    148 
    149         #region enums
    150         private const SetWindowPosFlags UFLAGSSIZEEX =
    151             SetWindowPosFlags.SWP_NOACTIVATE |
    152             SetWindowPosFlags.SWP_NOOWNERZORDER |
    153             SetWindowPosFlags.SWP_NOMOVE |
    154             SetWindowPosFlags.SWP_ASYNCWINDOWPOS |
    155             SetWindowPosFlags.SWP_DEFERERASE;
    156         private const SetWindowPosFlags UFLAGSSIZE =
    157             SetWindowPosFlags.SWP_NOACTIVATE |
    158             SetWindowPosFlags.SWP_NOOWNERZORDER |
    159             SetWindowPosFlags.SWP_NOMOVE;
    160         private const SetWindowPosFlags UFLAGSHIDE =
    161             SetWindowPosFlags.SWP_NOACTIVATE |
    162             SetWindowPosFlags.SWP_NOOWNERZORDER |
    163             SetWindowPosFlags.SWP_NOMOVE |
    164             SetWindowPosFlags.SWP_NOSIZE |
    165             SetWindowPosFlags.SWP_HIDEWINDOW;
    166         #endregion
    167 
    168         #region IDisposable 成员
    169 
    170         public void Dispose()
    171         {
    172             ReleaseHandle(); //释放与openfileDialog的句柄关联
    173             if (childNative != null)
    174             {
    175                 childNative.SelectFileChanged -= new ChildControlNativeWindow.SelectFileChangedEventHandler(childNative_SelectFileChanged);
    176                 childNative.SelectPathChanged -= new ChildControlNativeWindow.SelectPathChangedEventHandler(childNative_SelectPathChanged);
    177                 childNative.Dispose(); 
    178             }
    179 
    180         }
    181 
    182         #endregion
    183     }

    3.监听子控件的NativeWindow

    View Code
     1     class ChildControlNativeWindow : NativeWindow,IDisposable
     2     {
     3         IntPtr handle; //需要被监听消息的子控件句柄
     4         public ChildControlNativeWindow(IntPtr handle)
     5         {
     6             this.handle = handle;
     7             AssignHandle(handle);
     8         }
     9 
    10         #region override methods
    11         protected override void WndProc(ref Message m)
    12         {
    13             switch (m.Msg)
    14             {
    15                 case (int)Msg.WM_NOTIFY:
    16                     OFNOTIFY ofNotify = (OFNOTIFY)Marshal.PtrToStructure(m.LParam, typeof(OFNOTIFY));
    17                     if (ofNotify.hdr.code == (uint)DialogChangeStatus.CDN_SELCHANGE) //openfileDialog选择文件发生变化
    18                     {
    19                         StringBuilder file = new StringBuilder(256);
    20                         Win32.SendMessage(Win32.GetParent(handle), (int)DialogChangeProperties.CDM_GETFILEPATH, (int)256, file);
    21                         if (SelectFileChanged != null)
    22                             SelectFileChanged(file); //通知注册者
    23                     }
    24                     else if (ofNotify.hdr.code == (uint)DialogChangeStatus.CDN_FOLDERCHANGE) //openfileDialog选择目录发生变化
    25                     {
    26                         StringBuilder path = new StringBuilder(256);
    27                         Win32.SendMessage(Win32.GetParent(handle), (int)DialogChangeProperties.CDM_GETFOLDERPATH, (int)256, path);
    28                         if (SelectPathChanged != null)
    29                             SelectPathChanged(path); //通知注册者
    30                     }
    31                     break;
    32             }
    33             base.WndProc(ref m);
    34         }
    35         #endregion
    36 
    37         #region delegate
    38         public delegate void SelectFileChangedEventHandler(StringBuilder file); 
    39         public delegate void SelectPathChangedEventHandler(StringBuilder path);
    40         #endregion
    41 
    42         #region events
    43         public event SelectFileChangedEventHandler SelectFileChanged; //当openfileDialog的选择文件发生变化时发生
    44         public event SelectPathChangedEventHandler SelectPathChanged; //当openfileDialog的选择目录发生变化时发生
    45         #endregion
    46 
    47         #region IDisposable 成员
    48 
    49         public void Dispose()
    50         {
    51             ReleaseHandle(); //终止与子控件句柄的关联
    52         }
    53 
    54         #endregion
    55     }

    4.中间过渡窗体,用来获取OpenFileDialog的句柄

    View Code
     1     class MedianForm : Form
     2     {
     3         OpenFileDialog open = null; 
     4         DialogNativeWindow dialognative;
     5 
     6         public MedianForm(OpenFileDialog open)
     7         {
     8             this.open = open;
     9             StartPosition = FormStartPosition.Manual;
    10             Location = new System.Drawing.Point(-1000, -1000); //避免界面闪烁
    11         }
    12         protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
    13         {
    14             if (dialognative != null)
    15             {
    16                 dialognative.Dispose(); //释放资源
    17             }
    18             base.OnClosing(e);
    19         }
    20         protected override void WndProc(ref Message m)
    21         {
    22             if (m.Msg == (int) Msg.WM_ACTIVATE)
    23             {
    24                 dialognative = new DialogNativeWindow(m.LParam, open); //m.LParam为要打开的窗口句柄,开始监听OpenFileDialog的Windows消息
    25             }
    26             base.WndProc(ref m);
    27         }
    28     }

    5.访问Excel文件的类

    View Code
     1     class OledbManager
     2     {
     3         OleDbConnection conn;
     4         /// <summary>
     5         /// 连接excel文件
     6         /// </summary>
     7         /// <param name="connstr"></param>
     8         /// <returns></returns>
     9         public bool Connect(string connstr)
    10         {
    11             try
    12             {
    13                 conn = new OleDbConnection(connstr);
    14                 conn.Open();
    15                 return true;
    16             }
    17             catch
    18             {
    19                 return false;
    20             }
    21         }
    22         /// <summary>
    23         /// 查找第一张表中的数据
    24         /// </summary>
    25         /// <returns></returns>
    26         public DataTable SearchTable()
    27         {
    28             try
    29             {
    30                 DataTable tb = new DataTable();
    31                 string sql = "select * from [Sheet1$]";
    32                 OleDbCommand com = new OleDbCommand(sql, conn);
    33                 OleDbDataAdapter adp = new OleDbDataAdapter(com);
    34                 adp.Fill(tb);
    35                 return tb;
    36             }
    37             catch
    38             {
    39                 return null;
    40             }
    41         }
    42     }

    6.几个Win32结构体、枚举类型以及API声明(本代码参考CodeProject上的一篇文章)

    View Code
      1     public static class Win32
      2     {
      3         #region Delegates
      4         public delegate bool EnumWindowsCallBack(IntPtr hWnd, int lParam);
      5         #endregion
      6 
      7         #region USER32
      8         [DllImport("user32.dll", CharSet = CharSet.Auto)]
      9         public static extern IntPtr GetParent(IntPtr hWnd);
     10         [DllImport("User32.Dll")]
     11         public static extern int GetDlgCtrlID(IntPtr hWndCtl);
     12         [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
     13         public static extern int MapWindowPoints(IntPtr hWnd, IntPtr hWndTo, ref POINT pt, int cPoints);
     14         [DllImport("user32.dll", SetLastError = true)]
     15         public static extern bool GetWindowInfo(IntPtr hwnd, out WINDOWINFO pwi);
     16         [DllImport("User32.Dll")]
     17         public static extern void GetWindowText(IntPtr hWnd, StringBuilder param, int length);
     18         [DllImport("User32.Dll")]
     19         public static extern void GetClassName(IntPtr hWnd, StringBuilder param, int length);
     20         [DllImport("user32.Dll")]
     21         public static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsCallBack lpEnumFunc, int lParam);
     22         [DllImport("user32.Dll")]
     23         public static extern bool EnumWindows(EnumWindowsCallBack lpEnumFunc, int lParam);
     24         [DllImport("User32.dll", CharSet = CharSet.Auto)]
     25         public static extern bool ReleaseCapture();
     26         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     27         public static extern IntPtr SetCapture(IntPtr hWnd);
     28         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     29         public static extern IntPtr ChildWindowFromPointEx(IntPtr hParent, POINT pt, ChildFromPointFlags flags);
     30         [DllImport("user32.dll", EntryPoint = "FindWindowExA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
     31         public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
     32         [DllImport("user32.dll")]
     33         public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     34         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     35         public static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
     36         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     37         public static extern int PostMessage(IntPtr hWnd, int msg, int wParam, int lParam);
     38         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     39         public static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
     40         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     41         public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
     42         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     43         public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder param);
     44         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     45         public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, char[] chars);
     46         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     47         public static extern IntPtr BeginDeferWindowPos(int nNumWindows);
     48         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     49         public static extern IntPtr DeferWindowPos(IntPtr hWinPosInfo, IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, SetWindowPosFlags flags);
     50         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     51         public static extern bool EndDeferWindowPos(IntPtr hWinPosInfo);
     52         [DllImport("user32.dll", CharSet = CharSet.Auto)]
     53         public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, SetWindowPosFlags flags);
     54         [DllImport("user32.dll")]
     55         public static extern bool GetWindowRect(IntPtr hwnd, ref RECT rect);
     56         [DllImport("user32.dll")]
     57         public static extern bool GetClientRect(IntPtr hwnd, ref RECT rect);
     58         #endregion
     59     }
     60 
     61     #region SWP_Flags
     62     [Flags]
     63     public enum SWP_Flags
     64     {
     65         SWP_NOSIZE = 0x0001,
     66         SWP_NOMOVE = 0x0002,
     67         SWP_NOZORDER = 0x0004,
     68         SWP_NOACTIVATE = 0x0010,
     69         SWP_FRAMECHANGED = 0x0020, /* The frame changed: send WM_NCCALCSIZE */
     70         SWP_SHOWWINDOW = 0x0040,
     71         SWP_HIDEWINDOW = 0x0080,
     72         SWP_NOOWNERZORDER = 0x0200, /* Don't do owner Z ordering */
     73 
     74         SWP_DRAWFRAME = SWP_FRAMECHANGED,
     75         SWP_NOREPOSITION = SWP_NOOWNERZORDER
     76     }
     77     #endregion
     78 
     79     #region DialogChangeStatus
     80     public enum DialogChangeStatus : long
     81     {
     82         CDN_FIRST = 0xFFFFFDA7,
     83         CDN_INITDONE = (CDN_FIRST - 0x0000),
     84         CDN_SELCHANGE = (CDN_FIRST - 0x0001),
     85         CDN_FOLDERCHANGE = (CDN_FIRST - 0x0002),
     86         CDN_SHAREVIOLATION = (CDN_FIRST - 0x0003),
     87         CDN_HELP = (CDN_FIRST - 0x0004),
     88         CDN_FILEOK = (CDN_FIRST - 0x0005),
     89         CDN_TYPECHANGE = (CDN_FIRST - 0x0006),
     90     }
     91     #endregion
     92 
     93     #region DialogChangeProperties
     94     public enum DialogChangeProperties
     95     {
     96         CDM_FIRST = (0x400 + 100),
     97         CDM_GETSPEC = (CDM_FIRST + 0x0000),
     98         CDM_GETFILEPATH = (CDM_FIRST + 0x0001),
     99         CDM_GETFOLDERPATH = (CDM_FIRST + 0x0002),
    100         CDM_GETFOLDERIDLIST = (CDM_FIRST + 0x0003),
    101         CDM_SETCONTROLTEXT = (CDM_FIRST + 0x0004),
    102         CDM_HIDECONTROL = (CDM_FIRST + 0x0005),
    103         CDM_SETDEFEXT = (CDM_FIRST + 0x0006)
    104     }
    105     #endregion
    106 
    107     #region ImeNotify
    108     public enum ImeNotify
    109     {
    110         IMN_CLOSESTATUSWINDOW = 0x0001,
    111         IMN_OPENSTATUSWINDOW = 0x0002,
    112         IMN_CHANGECANDIDATE = 0x0003,
    113         IMN_CLOSECANDIDATE = 0x0004,
    114         IMN_OPENCANDIDATE = 0x0005,
    115         IMN_SETCONVERSIONMODE = 0x0006,
    116         IMN_SETSENTENCEMODE = 0x0007,
    117         IMN_SETOPENSTATUS = 0x0008,
    118         IMN_SETCANDIDATEPOS = 0x0009,
    119         IMN_SETCOMPOSITIONFONT = 0x000A,
    120         IMN_SETCOMPOSITIONWINDOW = 0x000B,
    121         IMN_SETSTATUSWINDOWPOS = 0x000C,
    122         IMN_GUIDELINE = 0x000D,
    123         IMN_PRIVATE = 0x000E
    124     }
    125     #endregion
    126 
    127     #region FolderViewMode
    128     public enum FolderViewMode
    129     {
    130         Default = 0x7028,
    131         Icon = Default + 1,
    132         SmallIcon = Default + 2,
    133         List = Default + 3,
    134         Details = Default + 4,
    135         Thumbnails = Default + 5,
    136         Title = Default + 6,
    137         Thumbstrip = Default + 7,
    138     }
    139     #endregion
    140 
    141     #region Enum DialogViewProperty
    142     public enum DefaultViewType
    143     {
    144         Icons = 0x7029,
    145         List = 0x702b,
    146         Details = 0x702c,
    147         Thumbnails = 0x702d,
    148         Tiles = 0x702e,
    149     }
    150     #endregion
    151 
    152     #region ButtonStyle
    153     public enum ButtonStyle : long
    154     {
    155         BS_PUSHBUTTON = 0x00000000,
    156         BS_DEFPUSHBUTTON = 0x00000001,
    157         BS_CHECKBOX = 0x00000002,
    158         BS_AUTOCHECKBOX = 0x00000003,
    159         BS_RADIOBUTTON = 0x00000004,
    160         BS_3STATE = 0x00000005,
    161         BS_AUTO3STATE = 0x00000006,
    162         BS_GROUPBOX = 0x00000007,
    163         BS_USERBUTTON = 0x00000008,
    164         BS_AUTORADIOBUTTON = 0x00000009,
    165         BS_PUSHBOX = 0x0000000A,
    166         BS_OWNERDRAW = 0x0000000B,
    167         BS_TYPEMASK = 0x0000000F,
    168         BS_LEFTTEXT = 0x00000020,
    169         BS_TEXT = 0x00000000,
    170         BS_ICON = 0x00000040,
    171         BS_BITMAP = 0x00000080,
    172         BS_LEFT = 0x00000100,
    173         BS_RIGHT = 0x00000200,
    174         BS_CENTER = 0x00000300,
    175         BS_TOP = 0x00000400,
    176         BS_BOTTOM = 0x00000800,
    177         BS_VCENTER = 0x00000C00,
    178         BS_PUSHLIKE = 0x00001000,
    179         BS_MULTILINE = 0x00002000,
    180         BS_NOTIFY = 0x00004000,
    181         BS_FLAT = 0x00008000,
    182         BS_RIGHTBUTTON = BS_LEFTTEXT
    183     }
    184     #endregion
    185 
    186     #region ZOrderPos
    187     public enum ZOrderPos
    188     {
    189         HWND_TOP = 0,
    190         HWND_BOTTOM = 1,
    191         HWND_TOPMOST = -1,
    192         HWND_NOTOPMOST = -2
    193     }
    194     #endregion
    195 
    196     #region Static Control Styles
    197     public enum StaticControlStyles : long
    198     {
    199         SS_LEFT = 0x00000000,
    200         SS_CENTER = 0x00000001,
    201         SS_RIGHT = 0x00000002,
    202         SS_ICON = 0x00000003,
    203         SS_BLACKRECT = 0x00000004,
    204         SS_GRAYRECT = 0x00000005,
    205         SS_WHITERECT = 0x00000006,
    206         SS_BLACKFRAME = 0x00000007,
    207         SS_GRAYFRAME = 0x00000008,
    208         SS_WHITEFRAME = 0x00000009,
    209         SS_USERITEM = 0x0000000A,
    210         SS_SIMPLE = 0x0000000B,
    211         SS_LEFTNOWORDWRAP = 0x0000000C,
    212         SS_OWNERDRAW = 0x0000000D,
    213         SS_BITMAP = 0x0000000E,
    214         SS_ENHMETAFILE = 0x0000000F,
    215         SS_ETCHEDHORZ = 0x00000010,
    216         SS_ETCHEDVERT = 0x00000011,
    217         SS_ETCHEDFRAME = 0x00000012,
    218         SS_TYPEMASK = 0x0000001F,
    219         SS_REALSIZECONTROL = 0x00000040,
    220         SS_NOPREFIX = 0x00000080, /* Don't do "&" character translation */
    221         SS_NOTIFY = 0x00000100,
    222         SS_CENTERIMAGE = 0x00000200,
    223         SS_RIGHTJUST = 0x00000400,
    224         SS_REALSIZEIMAGE = 0x00000800,
    225         SS_SUNKEN = 0x00001000,
    226         SS_EDITCONTROL = 0x00002000,
    227         SS_ENDELLIPSIS = 0x00004000,
    228         SS_PATHELLIPSIS = 0x00008000,
    229         SS_WORDELLIPSIS = 0x0000C000,
    230         SS_ELLIPSISMASK = 0x0000C000
    231     }
    232     #endregion
    233 
    234     #region Combo Box styles
    235     public enum ComboBoxStyles : long
    236     {
    237         CBS_SIMPLE = 0x0001,
    238         CBS_DROPDOWN = 0x0002,
    239         CBS_DROPDOWNLIST = 0x0003,
    240         CBS_OWNERDRAWFIXED = 0x0010,
    241         CBS_OWNERDRAWVARIABLE = 0x0020,
    242         CBS_AUTOHSCROLL = 0x0040,
    243         CBS_OEMCONVERT = 0x0080,
    244         CBS_SORT = 0x0100,
    245         CBS_HASSTRINGS = 0x0200,
    246         CBS_NOINTEGRALHEIGHT = 0x0400,
    247         CBS_DISABLENOSCROLL = 0x0800,
    248         CBS_UPPERCASE = 0x2000,
    249         CBS_LOWERCASE = 0x4000
    250     }
    251     #endregion
    252 
    253     #region Window Styles
    254     public enum WindowStyles : long
    255     {
    256         WS_OVERLAPPED = 0x00000000,
    257         WS_POPUP = 0x80000000,
    258         WS_CHILD = 0x40000000,
    259         WS_MINIMIZE = 0x20000000,
    260         WS_VISIBLE = 0x10000000,
    261         WS_DISABLED = 0x08000000,
    262         WS_CLIPSIBLINGS = 0x04000000,
    263         WS_CLIPCHILDREN = 0x02000000,
    264         WS_MAXIMIZE = 0x01000000,
    265         WS_CAPTION = 0x00C00000,
    266         WS_BORDER = 0x00800000,
    267         WS_DLGFRAME = 0x00400000,
    268         WS_VSCROLL = 0x00200000,
    269         WS_HSCROLL = 0x00100000,
    270         WS_SYSMENU = 0x00080000,
    271         WS_THICKFRAME = 0x00040000,
    272         WS_GROUP = 0x00020000,
    273         WS_TABSTOP = 0x00010000,
    274         WS_MINIMIZEBOX = 0x00020000,
    275         WS_MAXIMIZEBOX = 0x00010000,
    276         WS_TILED = 0x00000000,
    277         WS_ICONIC = 0x20000000,
    278         WS_SIZEBOX = 0x00040000,
    279         WS_POPUPWINDOW = 0x80880000,
    280         WS_OVERLAPPEDWINDOW = 0x00CF0000,
    281         WS_TILEDWINDOW = 0x00CF0000,
    282         WS_CHILDWINDOW = 0x40000000
    283     }
    284     #endregion
    285 
    286     #region Window Extended Styles
    287     public enum WindowExStyles
    288     {
    289         WS_EX_DLGMODALFRAME = 0x00000001,
    290         WS_EX_NOPARENTNOTIFY = 0x00000004,
    291         WS_EX_TOPMOST = 0x00000008,
    292         WS_EX_ACCEPTFILES = 0x00000010,
    293         WS_EX_TRANSPARENT = 0x00000020,
    294         WS_EX_MDICHILD = 0x00000040,
    295         WS_EX_TOOLWINDOW = 0x00000080,
    296         WS_EX_WINDOWEDGE = 0x00000100,
    297         WS_EX_CLIENTEDGE = 0x00000200,
    298         WS_EX_CONTEXTHELP = 0x00000400,
    299         WS_EX_RIGHT = 0x00001000,
    300         WS_EX_LEFT = 0x00000000,
    301         WS_EX_RTLREADING = 0x00002000,
    302         WS_EX_LTRREADING = 0x00000000,
    303         WS_EX_LEFTSCROLLBAR = 0x00004000,
    304         WS_EX_RIGHTSCROLLBAR = 0x00000000,
    305         WS_EX_CONTROLPARENT = 0x00010000,
    306         WS_EX_STATICEDGE = 0x00020000,
    307         WS_EX_APPWINDOW = 0x00040000,
    308         WS_EX_OVERLAPPEDWINDOW = 0x00000300,
    309         WS_EX_PALETTEWINDOW = 0x00000188,
    310         WS_EX_LAYERED = 0x00080000
    311     }
    312     #endregion
    313 
    314     #region ChildFromPointFlags
    315     public enum ChildFromPointFlags
    316     {
    317         CWP_ALL = 0x0000,
    318         CWP_SKIPINVISIBLE = 0x0001,
    319         CWP_SKIPDISABLED = 0x0002,
    320         CWP_SKIPTRANSPARENT = 0x0004
    321     }
    322     #endregion
    323 
    324     #region HitTest
    325     public enum HitTest
    326     {
    327         HTERROR = (-2),
    328         HTTRANSPARENT = (-1),
    329         HTNOWHERE = 0,
    330         HTCLIENT = 1,
    331         HTCAPTION = 2,
    332         HTSYSMENU = 3,
    333         HTGROWBOX = 4,
    334         HTSIZE = HTGROWBOX,
    335         HTMENU = 5,
    336         HTHSCROLL = 6,
    337         HTVSCROLL = 7,
    338         HTMINBUTTON = 8,
    339         HTMAXBUTTON = 9,
    340         HTLEFT = 10,
    341         HTRIGHT = 11,
    342         HTTOP = 12,
    343         HTTOPLEFT = 13,
    344         HTTOPRIGHT = 14,
    345         HTBOTTOM = 15,
    346         HTBOTTOMLEFT = 16,
    347         HTBOTTOMRIGHT = 17,
    348         HTBORDER = 18,
    349         HTREDUCE = HTMINBUTTON,
    350         HTZOOM = HTMAXBUTTON,
    351         HTSIZEFIRST = HTLEFT,
    352         HTSIZELAST = HTBOTTOMRIGHT,
    353         HTOBJECT = 19,
    354         HTCLOSE = 20,
    355         HTHELP = 21
    356     }
    357     #endregion
    358 
    359     #region Windows Messages
    360     public enum Msg
    361     {
    362         WM_NULL = 0x0000,
    363         WM_CREATE = 0x0001,
    364         WM_DESTROY = 0x0002,
    365         WM_MOVE = 0x0003,
    366         WM_SIZE = 0x0005,
    367         WM_ACTIVATE = 0x0006,
    368         WM_SETFOCUS = 0x0007,
    369         WM_KILLFOCUS = 0x0008,
    370         WM_ENABLE = 0x000A,
    371         WM_SETREDRAW = 0x000B,
    372         WM_SETTEXT = 0x000C,
    373         WM_GETTEXT = 0x000D,
    374         WM_GETTEXTLENGTH = 0x000E,
    375         WM_PAINT = 0x000F,
    376         WM_CLOSE = 0x0010,
    377         WM_QUERYENDSESSION = 0x0011,
    378         WM_QUIT = 0x0012,
    379         WM_QUERYOPEN = 0x0013,
    380         WM_ERASEBKGND = 0x0014,
    381         WM_SYSCOLORCHANGE = 0x0015,
    382         WM_ENDSESSION = 0x0016,
    383         WM_SHOWWINDOW = 0x0018,
    384         WM_CTLCOLOR = 0x0019,
    385         WM_WININICHANGE = 0x001A,
    386         WM_SETTINGCHANGE = 0x001A,
    387         WM_DEVMODECHANGE = 0x001B,
    388         WM_ACTIVATEAPP = 0x001C,
    389         WM_FONTCHANGE = 0x001D,
    390         WM_TIMECHANGE = 0x001E,
    391         WM_CANCELMODE = 0x001F,
    392         WM_SETCURSOR = 0x0020,
    393         WM_MOUSEACTIVATE = 0x0021,
    394         WM_CHILDACTIVATE = 0x0022,
    395         WM_QUEUESYNC = 0x0023,
    396         WM_GETMINMAXINFO = 0x0024,
    397         WM_PAINTICON = 0x0026,
    398         WM_ICONERASEBKGND = 0x0027,
    399         WM_NEXTDLGCTL = 0x0028,
    400         WM_SPOOLERSTATUS = 0x002A,
    401         WM_DRAWITEM = 0x002B,
    402         WM_MEASUREITEM = 0x002C,
    403         WM_DELETEITEM = 0x002D,
    404         WM_VKEYTOITEM = 0x002E,
    405         WM_CHARTOITEM = 0x002F,
    406         WM_SETFONT = 0x0030,
    407         WM_GETFONT = 0x0031,
    408         WM_SETHOTKEY = 0x0032,
    409         WM_GETHOTKEY = 0x0033,
    410         WM_QUERYDRAGICON = 0x0037,
    411         WM_COMPAREITEM = 0x0039,
    412         WM_GETOBJECT = 0x003D,
    413         WM_COMPACTING = 0x0041,
    414         WM_COMMNOTIFY = 0x0044,
    415         WM_WINDOWPOSCHANGING = 0x0046,
    416         WM_WINDOWPOSCHANGED = 0x0047,
    417         WM_POWER = 0x0048,
    418         WM_COPYDATA = 0x004A,
    419         WM_CANCELJOURNAL = 0x004B,
    420         WM_NOTIFY = 0x004E,
    421         WM_INPUTLANGCHANGEREQUEST = 0x0050,
    422         WM_INPUTLANGCHANGE = 0x0051,
    423         WM_TCARD = 0x0052,
    424         WM_HELP = 0x0053,
    425         WM_USERCHANGED = 0x0054,
    426         WM_NOTIFYFORMAT = 0x0055,
    427         WM_CONTEXTMENU = 0x007B,
    428         WM_STYLECHANGING = 0x007C,
    429         WM_STYLECHANGED = 0x007D,
    430         WM_DISPLAYCHANGE = 0x007E,
    431         WM_GETICON = 0x007F,
    432         WM_SETICON = 0x0080,
    433         WM_NCCREATE = 0x0081,
    434         WM_NCDESTROY = 0x0082,
    435         WM_NCCALCSIZE = 0x0083,
    436         WM_NCHITTEST = 0x0084,
    437         WM_NCPAINT = 0x0085,
    438         WM_NCACTIVATE = 0x0086,
    439         WM_GETDLGCODE = 0x0087,
    440         WM_SYNCPAINT = 0x0088,
    441         WM_NCMOUSEMOVE = 0x00A0,
    442         WM_NCLBUTTONDOWN = 0x00A1,
    443         WM_NCLBUTTONUP = 0x00A2,
    444         WM_NCLBUTTONDBLCLK = 0x00A3,
    445         WM_NCRBUTTONDOWN = 0x00A4,
    446         WM_NCRBUTTONUP = 0x00A5,
    447         WM_NCRBUTTONDBLCLK = 0x00A6,
    448         WM_NCMBUTTONDOWN = 0x00A7,
    449         WM_NCMBUTTONUP = 0x00A8,
    450         WM_NCMBUTTONDBLCLK = 0x00A9,
    451         WM_NCXBUTTONDOWN = 0x00AB,
    452         WM_NCXBUTTONUP = 0x00AC,
    453         WM_NCXBUTTONDBLCLK = 0x00AD,
    454         WM_KEYDOWN = 0x0100,
    455         WM_KEYUP = 0x0101,
    456         WM_CHAR = 0x0102,
    457         WM_DEADCHAR = 0x0103,
    458         WM_SYSKEYDOWN = 0x0104,
    459         WM_SYSKEYUP = 0x0105,
    460         WM_SYSCHAR = 0x0106,
    461         WM_SYSDEADCHAR = 0x0107,
    462         WM_KEYLAST = 0x0108,
    463         WM_IME_STARTCOMPOSITION = 0x010D,
    464         WM_IME_ENDCOMPOSITION = 0x010E,
    465         WM_IME_COMPOSITION = 0x010F,
    466         WM_IME_KEYLAST = 0x010F,
    467         WM_INITDIALOG = 0x0110,
    468         WM_COMMAND = 0x0111,
    469         WM_SYSCOMMAND = 0x0112,
    470         WM_TIMER = 0x0113,
    471         WM_HSCROLL = 0x0114,
    472         WM_VSCROLL = 0x0115,
    473         WM_INITMENU = 0x0116,
    474         WM_INITMENUPOPUP = 0x0117,
    475         WM_MENUSELECT = 0x011F,
    476         WM_MENUCHAR = 0x0120,
    477         WM_ENTERIDLE = 0x0121,
    478         WM_MENURBUTTONUP = 0x0122,
    479         WM_MENUDRAG = 0x0123,
    480         WM_MENUGETOBJECT = 0x0124,
    481         WM_UNINITMENUPOPUP = 0x0125,
    482         WM_MENUCOMMAND = 0x0126,
    483         WM_CTLCOLORMSGBOX = 0x0132,
    484         WM_CTLCOLOREDIT = 0x0133,
    485         WM_CTLCOLORLISTBOX = 0x0134,
    486         WM_CTLCOLORBTN = 0x0135,
    487         WM_CTLCOLORDLG = 0x0136,
    488         WM_CTLCOLORSCROLLBAR = 0x0137,
    489         WM_CTLCOLORSTATIC = 0x0138,
    490         WM_MOUSEMOVE = 0x0200,
    491         WM_LBUTTONDOWN = 0x0201,
    492         WM_LBUTTONUP = 0x0202,
    493         WM_LBUTTONDBLCLK = 0x0203,
    494         WM_RBUTTONDOWN = 0x0204,
    495         WM_RBUTTONUP = 0x0205,
    496         WM_RBUTTONDBLCLK = 0x0206,
    497         WM_MBUTTONDOWN = 0x0207,
    498         WM_MBUTTONUP = 0x0208,
    499         WM_MBUTTONDBLCLK = 0x0209,
    500         WM_MOUSEWHEEL = 0x020A,
    501         WM_XBUTTONDOWN = 0x020B,
    502         WM_XBUTTONUP = 0x020C,
    503         WM_XBUTTONDBLCLK = 0x020D,
    504         WM_PARENTNOTIFY = 0x0210,
    505         WM_ENTERMENULOOP = 0x0211,
    506         WM_EXITMENULOOP = 0x0212,
    507         WM_NEXTMENU = 0x0213,
    508         WM_SIZING = 0x0214,
    509         WM_CAPTURECHANGED = 0x0215,
    510         WM_MOVING = 0x0216,
    511         WM_DEVICECHANGE = 0x0219,
    512         WM_MDICREATE = 0x0220,
    513         WM_MDIDESTROY = 0x0221,
    514         WM_MDIACTIVATE = 0x0222,
    515         WM_MDIRESTORE = 0x0223,
    516         WM_MDINEXT = 0x0224,
    517         WM_MDIMAXIMIZE = 0x0225,
    518         WM_MDITILE = 0x0226,
    519         WM_MDICASCADE = 0x0227,
    520         WM_MDIICONARRANGE = 0x0228,
    521         WM_MDIGETACTIVE = 0x0229,
    522         WM_MDISETMENU = 0x0230,
    523         WM_ENTERSIZEMOVE = 0x0231,
    524         WM_EXITSIZEMOVE = 0x0232,
    525         WM_DROPFILES = 0x0233,
    526         WM_MDIREFRESHMENU = 0x0234,
    527         WM_IME_SETCONTEXT = 0x0281,
    528         WM_IME_NOTIFY = 0x0282,
    529         WM_IME_CONTROL = 0x0283,
    530         WM_IME_COMPOSITIONFULL = 0x0284,
    531         WM_IME_SELECT = 0x0285,
    532         WM_IME_CHAR = 0x0286,
    533         WM_IME_REQUEST = 0x0288,
    534         WM_IME_KEYDOWN = 0x0290,
    535         WM_IME_KEYUP = 0x0291,
    536         WM_MOUSEHOVER = 0x02A1,
    537         WM_MOUSELEAVE = 0x02A3,
    538         WM_CUT = 0x0300,
    539         WM_COPY = 0x0301,
    540         WM_PASTE = 0x0302,
    541         WM_CLEAR = 0x0303,
    542         WM_UNDO = 0x0304,
    543         WM_RENDERFORMAT = 0x0305,
    544         WM_RENDERALLFORMATS = 0x0306,
    545         WM_DESTROYCLIPBOARD = 0x0307,
    546         WM_DRAWCLIPBOARD = 0x0308,
    547         WM_PAINTCLIPBOARD = 0x0309,
    548         WM_VSCROLLCLIPBOARD = 0x030A,
    549         WM_SIZECLIPBOARD = 0x030B,
    550         WM_ASKCBFORMATNAME = 0x030C,
    551         WM_CHANGECBCHAIN = 0x030D,
    552         WM_HSCROLLCLIPBOARD = 0x030E,
    553         WM_QUERYNEWPALETTE = 0x030F,
    554         WM_PALETTEISCHANGING = 0x0310,
    555         WM_PALETTECHANGED = 0x0311,
    556         WM_HOTKEY = 0x0312,
    557         WM_PRINT = 0x0317,
    558         WM_PRINTCLIENT = 0x0318,
    559         WM_THEME_CHANGED = 0x031A,
    560         WM_HANDHELDFIRST = 0x0358,
    561         WM_HANDHELDLAST = 0x035F,
    562         WM_AFXFIRST = 0x0360,
    563         WM_AFXLAST = 0x037F,
    564         WM_PENWINFIRST = 0x0380,
    565         WM_PENWINLAST = 0x038F,
    566         WM_APP = 0x8000,
    567         WM_USER = 0x0400,
    568         WM_REFLECT = WM_USER + 0x1c00
    569     }
    570     #endregion
    571 
    572     #region SetWindowPosFlags
    573     public enum SetWindowPosFlags
    574     {
    575         SWP_NOSIZE = 0x0001,
    576         SWP_NOMOVE = 0x0002,
    577         SWP_NOZORDER = 0x0004,
    578         SWP_NOREDRAW = 0x0008,
    579         SWP_NOACTIVATE = 0x0010,
    580         SWP_FRAMECHANGED = 0x0020,
    581         SWP_SHOWWINDOW = 0x0040,
    582         SWP_HIDEWINDOW = 0x0080,
    583         SWP_NOCOPYBITS = 0x0100,
    584         SWP_NOOWNERZORDER = 0x0200,
    585         SWP_NOSENDCHANGING = 0x0400,
    586         SWP_DRAWFRAME = 0x0020,
    587         SWP_NOREPOSITION = 0x0200,
    588         SWP_DEFERERASE = 0x2000,
    589         SWP_ASYNCWINDOWPOS = 0x4000
    590     }
    591     #endregion
    592 }
    593 
    594     #region WINDOWINFO
    595     [StructLayout(LayoutKind.Sequential)]
    596     public struct WINDOWINFO
    597     {
    598         public UInt32 cbSize;
    599         public RECT rcWindow;
    600         public RECT rcClient;
    601         public UInt32 dwStyle;
    602         public UInt32 dwExStyle;
    603         public UInt32 dwWindowStatus;
    604         public UInt32 cxWindowBorders;
    605         public UInt32 cyWindowBorders;
    606         public UInt16 atomWindowType;
    607         public UInt16 wCreatorVersion;
    608     }
    609     #endregion
    610 
    611     #region POINT
    612     [StructLayout(LayoutKind.Sequential)]
    613     public struct POINT
    614     {
    615         public int x;
    616         public int y;
    617 
    618         #region Constructors
    619         public POINT(int x, int y)
    620         {
    621             this.x = x;
    622             this.y = y;
    623         }
    624 
    625         public POINT(Point point)
    626         {
    627             x = point.X;
    628             y = point.Y;
    629         }
    630         #endregion
    631     }
    632     #endregion
    633 
    634     #region RECT
    635     [StructLayout(LayoutKind.Sequential)]
    636     public struct RECT
    637     {
    638         public uint left;
    639         public uint top;
    640         public uint right;
    641         public uint bottom;
    642 
    643         #region Properties
    644         public POINT Location
    645         {
    646             get { return new POINT((int)left, (int)top); }
    647             set
    648             {
    649                 right -= (left - (uint)value.x);
    650                 bottom -= (bottom - (uint)value.y);
    651                 left = (uint)value.x;
    652                 top = (uint)value.y;
    653             }
    654         }
    655 
    656         public uint Width
    657         {
    658             get { return right - left; }
    659             set { right = left + value; }
    660         }
    661 
    662         public uint Height
    663         {
    664             get { return bottom - top; }
    665             set { bottom = top + value; }
    666         }
    667         #endregion
    668 
    669         #region Overrides
    670         public override string ToString()
    671         {
    672             return left + ":" + top + ":" + right + ":" + bottom;
    673         }
    674         #endregion
    675     }
    676     #endregion
    677 
    678     #region WINDOWPOS
    679     [StructLayout(LayoutKind.Sequential)]
    680     public struct WINDOWPOS
    681     {
    682         public IntPtr hwnd;
    683         public IntPtr hwndAfter;
    684         public int x;
    685         public int y;
    686         public int cx;
    687         public int cy;
    688         public uint flags;
    689 
    690         #region Overrides
    691         public override string ToString()
    692         {
    693             return x + ":" + y + ":" + cx + ":" + cy + ":" + ((SWP_Flags)flags).ToString();
    694         }
    695         #endregion
    696     }
    697     #endregion
    698 
    699     #region NCCALCSIZE_PARAMS
    700     [StructLayout(LayoutKind.Sequential)]
    701     public struct NCCALCSIZE_PARAMS
    702     {
    703         public RECT rgrc1;
    704         public RECT rgrc2;
    705         public RECT rgrc3;
    706         public IntPtr lppos;
    707     }
    708     #endregion
    709 
    710     #region NMHDR
    711     [StructLayout(LayoutKind.Sequential)]
    712     public struct NMHDR
    713     {
    714         public IntPtr hwndFrom;
    715         public uint idFrom;
    716         public uint code;
    717     }
    718     #endregion
    719 
    720     #region OFNOTIFY
    721     [StructLayout(LayoutKind.Sequential)]
    722     public struct OFNOTIFY
    723     {
    724         public NMHDR hdr;
    725         public IntPtr OPENFILENAME;
    726         public IntPtr fileNameShareViolation;
    727     }
    728     #endregion

    补充一下

    1.代码只提供思路,不能拿来继承一下,就能实现自己想要的功能。

    2.可以自己将代码中DialogNativeWindow类的addControl替换为其他控件,比如PictureBox用来预览图片、TextBox用来预览txt文件、RichTextBox用来预览代码文件等等,还可自由组合。

    3.可以自己将代码中DialogNativeWindow类的两个事件(SelectedFileChanged、SelectPathChanged)移到MultiOpenFileDialog中,并使其对外开放,外部程序可以监听该事件。

    4.如果想做成通用类,拿过来继承一下就可以实现自己想要的效果,建议使MultiOpenFileDialog从UserControl,并将addControl设为自己。也就是说将自己添加到OpenFileDialog中去,MultiOpenFileDialog的派生类就可以在VS中设计自己想要的效果。

    5.一个窗体新建显示时,它的拥有者会接收许多消息,包括WM_ACTIVATE、WM_IDLE等等,并且Lparam参数为新建窗体的句柄。

    View Code
     1 class Form1:Form
     2 {
     3       private void Form1_Load(Object sender,EventArgs e)
     4       {
     5              using(OpenFileDialog dia = new OpenFileDialog())
     6              {
     7                     dia.ShowDialog(this);
     8              }
     9       }
    10       protected override void WndProc(ref Message m)
    11      {
    12              //当dia显示时,它的拥有者即为this,这里会接受一连串的Window消息,并且它的Lparam参数为dia的句柄
    13             base.WndProc(ref m);
    14      }
    15 }

    6.Windows中窗体和所谓的控件(button、textbox)本质上没有区别,任务栏与QQ聊天框或者Chrome浏览器的地址栏对我们程序员来讲,是同一个东西。

    7.与窗体有关的Win32 API基本都需要窗体句柄,其实任何一个API几乎都需要知道操作对象的句柄(不一定是窗体)。

    8.Windows中任何一个窗体(控件)理论上都是平级的,不管是否同一进程,也就是说,我的winform应用程序只要知道了Chrome浏览器窗体的句柄,就可以控制Chrome浏览器,监听Chrome窗体的Windows消息(除非Chrome程序本身禁止了此操作)。

    9.Windows桌面应用程序开发中,(部分平台、语言)理解四个东西,即进程、线程 、窗体(已经说了,是广义上的窗体)、消息。

    10.查看系统中以上四个东西,可以使用Spy++工具。

    完了,剩下那个下次再写了,太多了。希望有帮助~

  • 相关阅读:
    加油 ^_^
    ES6 小记
    Angular2 初学小记
    Round 4
    react中iconfont字体图标不显示问题
    react 实现组件嵌套以及子组件与父组件之间的通信
    wamp&花生壳 在本地搭建自己的网站
    深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
    深入浅出CSS(一):line-height与vertical-align的性质
    十进制字符编号
  • 原文地址:https://www.cnblogs.com/xiaozhi_5638/p/2828376.html
Copyright © 2011-2022 走看看