经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
转(C# 类似右键菜单弹出窗体)
来源:cnblogs  作者:永恒921  时间:2018/12/14 9:39:17  对本文有异议

文章来自 https://www.cnblogs.com/ahdung/p/FloatLayerBase.html

每天进步一点点

新建类  FloatLayerBase 继承Form,

自己有点小改动public void Show(Control control, Point endPoint) 添加参数 endPoint 避免窗体在最右边或下边时弹出窗体被遮掩。

 

  1. public partial class FloatLayerBase : Form
  2. {
  3. /// <summary>
  4. /// 鼠标消息筛选器
  5. /// </summary>
  6. //由于本窗体为WS_CHILD,所以不会收到在窗体以外点击鼠标的消息
  7. //该消息筛选器的作用就是让本窗体获知鼠标点击情况,进而根据鼠标是否在本窗体以外的区域点击,做出相应处理
  8. readonly AppMouseMessageHandler _mouseMsgFilter;
  9.  
  10. /// <summary>
  11. /// 指示本窗体是否已ShowDialog过
  12. /// </summary>
  13. //由于多次ShowDialog会使OnLoad/OnShown重入,故需设置此标记以供重入时判断
  14. bool _isShowDialogAgain;
  15.  
  16. //边框相关字段
  17. BorderStyle _borderType;
  18. Border3DStyle _border3DStyle;
  19. ButtonBorderStyle _borderSingleStyle;
  20. Color _borderColor;
  21.  
  22. /// <summary>
  23. /// 获取或设置边框类型
  24. /// </summary>
  25. [Description("获取或设置边框类型。")]
  26. [DefaultValue(BorderStyle.Fixed3D)]
  27. public BorderStyle BorderType
  28. {
  29. get { return _borderType; }
  30. set
  31. {
  32. if (_borderType == value) { return; }
  33. _borderType = value;
  34. Invalidate();
  35. }
  36. }
  37.  
  38. /// <summary>
  39. /// 获取或设置三维边框样式
  40. /// </summary>
  41. [Description("获取或设置三维边框样式。")]
  42. [DefaultValue(Border3DStyle.RaisedInner)]
  43. public Border3DStyle Border3DStyle
  44. {
  45. get { return _border3DStyle; }
  46. set
  47. {
  48. if (_border3DStyle == value) { return; }
  49. _border3DStyle = value;
  50. Invalidate();
  51. }
  52. }
  53.  
  54. /// <summary>
  55. /// 获取或设置线型边框样式
  56. /// </summary>
  57. [Description("获取或设置线型边框样式。")]
  58. [DefaultValue(ButtonBorderStyle.Solid)]
  59. public ButtonBorderStyle BorderSingleStyle
  60. {
  61. get { return _borderSingleStyle; }
  62. set
  63. {
  64. if (_borderSingleStyle == value) { return; }
  65. _borderSingleStyle = value;
  66. Invalidate();
  67. }
  68. }
  69.  
  70. /// <summary>
  71. /// 获取或设置边框颜色(仅当边框类型为线型时有效)
  72. /// </summary>
  73. [Description("获取或设置边框颜色(仅当边框类型为线型时有效)。")]
  74. [DefaultValue(typeof(Color), "DarkGray")]
  75. public Color BorderColor
  76. {
  77. get { return _borderColor; }
  78. set
  79. {
  80. if (_borderColor == value) { return; }
  81. _borderColor = value;
  82. Invalidate();
  83. }
  84. }
  85.  
  86. protected override sealed CreateParams CreateParams
  87. {
  88. get
  89. {
  90. CreateParams prms = base.CreateParams;
  91.  
  92. //prms.Style = 0;
  93. //prms.Style |= -2147483648; //WS_POPUP
  94. prms.Style |= 0x40000000; //WS_CHILD 重要,只有CHILD窗体才不会抢父窗体焦点
  95. prms.Style |= 0x4000000; //WS_CLIPSIBLINGS
  96. prms.Style |= 0x10000; //WS_TABSTOP
  97. prms.Style &= ~0x40000; //WS_SIZEBOX 去除
  98. prms.Style &= ~0x800000; //WS_BORDER 去除
  99. prms.Style &= ~0x400000; //WS_DLGFRAME 去除
  100. //prms.Style &= ~0x20000; //WS_MINIMIZEBOX 去除
  101. //prms.Style &= ~0x10000; //WS_MAXIMIZEBOX 去除
  102.  
  103. prms.ExStyle = 0;
  104. //prms.ExStyle |= 0x1; //WS_EX_DLGMODALFRAME 立体边框
  105. //prms.ExStyle |= 0x8; //WS_EX_TOPMOST
  106. prms.ExStyle |= 0x10000; //WS_EX_CONTROLPARENT
  107. //prms.ExStyle |= 0x80; //WS_EX_TOOLWINDOW
  108. //prms.ExStyle |= 0x100; //WS_EX_WINDOWEDGE
  109. //prms.ExStyle |= 0x8000000; //WS_EX_NOACTIVATE
  110. //prms.ExStyle |= 0x4; //WS_EX_NOPARENTNOTIFY
  111.  
  112. return prms;
  113. }
  114. }
  115.  
  116. public FloatLayerBase()
  117. {
  118. //初始化消息筛选器。添加和移除在显示/隐藏时负责
  119. _mouseMsgFilter = new AppMouseMessageHandler(this);
  120. //InitializeComponent();
  121. InitBaseProperties();
  122. //初始化边框相关
  123. _borderType = BorderStyle.Fixed3D;
  124. _border3DStyle = System.Windows.Forms.Border3DStyle.RaisedInner;
  125. _borderSingleStyle = ButtonBorderStyle.Solid;
  126. _borderColor = Color.DarkGray;
  127. }
  128.  
  129.  
  130. protected override void OnLoad(EventArgs e)
  131. {
  132. //防止重入
  133. if (_isShowDialogAgain) { return; }
  134.  
  135. //需得减掉两层边框宽度,运行时尺寸才与设计时完全相符,原因不明
  136. //确定与ControlBox、FormBorderStyle有关,但具体联系不明
  137. if (!DesignMode)
  138. {
  139. Size size = SystemInformation.FrameBorderSize;
  140. this.Size -= size + size;//不可以用ClientSize,后者会根据窗口风格重新调整Size
  141. }
  142. base.OnLoad(e);
  143. }
  144.  
  145. protected override void OnShown(EventArgs e)
  146. {
  147. //防止重入
  148. if (_isShowDialogAgain) { return; }
  149.  
  150. //在OnShown中为首次ShowDialog设标记
  151. if (Modal) { _isShowDialogAgain = true; }
  152.  
  153. if (!DesignMode)
  154. {
  155. //激活首控件
  156. Control firstControl;
  157. if ((firstControl = GetNextControl(this, true)) != null)
  158. {
  159. firstControl.Focus();
  160. }
  161. }
  162. base.OnShown(e);
  163. }
  164.  
  165. protected override void WndProc(ref Message m)
  166. {
  167. //当本窗体作为ShowDialog弹出时,在收到WM_SHOWWINDOW前,Owner会被Disable
  168. //故需在收到该消息后立即Enable它,不然Owner窗体和本窗体都将处于无响应状态
  169. if (m.Msg == 0x18 && m.WParam != IntPtr.Zero && m.LParam == IntPtr.Zero
  170. && Modal && Owner != null && !Owner.IsDisposed)
  171. {
  172. if (Owner.IsMdiChild)
  173. {
  174. //当Owner是MDI子窗体时,被Disable的是MDI主窗体
  175. //并且Parent也会指向MDI主窗体,故需改回为Owner,这样弹出窗体的Location才会相对于Owner而非MDIParent
  176. NativeMethods.EnableWindow(Owner.MdiParent.Handle, true);
  177. NativeMethods.SetParent(this.Handle, Owner.Handle);//只能用API设置Parent,因为模式窗体是TopLevel,.Net拒绝为顶级窗体设置Parent
  178. }
  179. else
  180. {
  181. NativeMethods.EnableWindow(Owner.Handle, true);
  182. }
  183. }
  184. base.WndProc(ref m);
  185. }
  186.  
  187. //画边框
  188. protected override void OnPaintBackground(PaintEventArgs e)
  189. {
  190. base.OnPaintBackground(e);
  191.  
  192. if (_borderType == BorderStyle.Fixed3D)//绘制3D边框
  193. {
  194. ControlPaint.DrawBorder3D(e.Graphics, ClientRectangle, Border3DStyle);
  195. }
  196. else if (_borderType == BorderStyle.FixedSingle)//绘制线型边框
  197. {
  198. ControlPaint.DrawBorder(e.Graphics, ClientRectangle, BorderColor, BorderSingleStyle);
  199. }
  200. }
  201.  
  202. //显示后添加鼠标消息筛选器以开始捕捉,隐藏时则移除筛选器。之所以不放Dispose中是想尽早移除筛选器
  203. protected override void OnVisibleChanged(EventArgs e)
  204. {
  205. if (!DesignMode)
  206. {
  207. if (Visible) { Application.AddMessageFilter(_mouseMsgFilter); }
  208. else { Application.RemoveMessageFilter(_mouseMsgFilter); }
  209. }
  210. base.OnVisibleChanged(e);
  211. }
  212.  
  213. //实现窗体客户区拖动
  214. //在WndProc中实现这个较麻烦,所以放到这里做
  215. protected override void OnMouseDown(MouseEventArgs e)
  216. {
  217. //让鼠标点击客户区时达到与点击标题栏一样的效果,以此实现客户区拖动
  218. NativeMethods.ReleaseCapture();
  219. NativeMethods.SendMessage(Handle, 0xA1/*WM_NCLBUTTONDOWN*/, (IntPtr)2/*CAPTION*/, IntPtr.Zero);
  220.  
  221. base.OnMouseDown(e);
  222. }
  223.  
  224. /// <summary>
  225. /// 显示为模式窗体
  226. /// </summary>
  227. /// <param name="control">显示在该控件下方</param>
  228. public DialogResult ShowDialog(Control control, Point endPoint)
  229. {
  230. return ShowDialog(control, 0, control.Height, endPoint);
  231. }
  232.  
  233. /// <summary>
  234. /// 显示为模式窗体
  235. /// </summary>
  236. /// <param name="control">触发弹出窗体的控件</param>
  237. /// <param name="offsetX">相对control水平偏移</param>
  238. /// <param name="offsetY">相对control垂直偏移</param>
  239. public DialogResult ShowDialog(Control control, int offsetX, int offsetY, Point endPoint)
  240. {
  241. return ShowDialog(control, new Point(offsetX, offsetY), endPoint);
  242. }
  243.  
  244. /// <summary>
  245. /// 显示为模式窗体
  246. /// </summary>
  247. /// <param name="control">触发弹出窗体的控件</param>
  248. /// <param name="offset">相对control偏移</param>
  249. public DialogResult ShowDialog(Control control, Point offset, Point endPoint)
  250. {
  251. return this.ShowDialogInternal(control, offset, endPoint);
  252. }
  253.  
  254. /// <summary>
  255. /// 显示为模式窗体
  256. /// </summary>
  257. /// <param name="item">显示在该工具栏项的下方</param>
  258. public DialogResult ShowDialog(ToolStripItem item, Point endPoint)
  259. {
  260. return ShowDialog(item, 0, item.Height, endPoint);
  261. }
  262.  
  263. /// <summary>
  264. /// 显示为模式窗体
  265. /// </summary>
  266. /// <param name="item">触发弹出窗体的工具栏项</param>
  267. /// <param name="offsetX">相对item水平偏移</param>
  268. /// <param name="offsetY">相对item垂直偏移</param>
  269. public DialogResult ShowDialog(ToolStripItem item, int offsetX, int offsetY, Point endPoint)
  270. {
  271. return ShowDialog(item, new Point(offsetX, offsetY), endPoint);
  272. }
  273.  
  274. /// <summary>
  275. /// 显示为模式窗体
  276. /// </summary>
  277. /// <param name="item">触发弹出窗体的工具栏项</param>
  278. /// <param name="offset">相对item偏移</param>
  279. public DialogResult ShowDialog(ToolStripItem item, Point offset, Point endPoint)
  280. {
  281. return this.ShowDialogInternal(item, offset, endPoint);
  282. }
  283.  
  284. /// <summary>
  285. /// 显示窗体
  286. /// </summary>
  287. /// <param name="control">显示在该控件下方</param>
  288. public void Show(Control control, Point endPoint)
  289. {
  290. Show(control, 0, control.Height,endPoint);
  291. }
  292.  
  293. /// <summary>
  294. /// 显示窗体
  295. /// </summary>
  296. /// <param name="control">触发弹出窗体的控件</param>
  297. /// <param name="offsetX">相对control水平偏移</param>
  298. /// <param name="offsetY">相对control垂直偏移</param>
  299. public void Show(Control control, int offsetX, int offsetY, Point endPoint)
  300. {
  301. Show(control, new Point(offsetX, offsetY), endPoint);
  302. }
  303.  
  304. /// <summary>
  305. /// 显示窗体
  306. /// </summary>
  307. /// <param name="control">触发弹出窗体的控件</param>
  308. /// <param name="offset">相对control偏移</param>
  309. public void Show(Control control, Point offset, Point endPoint)
  310. {
  311. this.ShowInternal(control, offset, endPoint);
  312. }
  313.  
  314. /// <summary>
  315. /// 显示窗体
  316. /// </summary>
  317. /// <param name="item">显示在该工具栏下方</param>
  318. public void Show(ToolStripItem item, Point endPoint)
  319. {
  320. Show(item, 0, item.Height, endPoint);
  321. }
  322.  
  323. /// <summary>
  324. /// 显示窗体
  325. /// </summary>
  326. /// <param name="item">触发弹出窗体的工具栏项</param>
  327. /// <param name="offsetX">相对item水平偏移</param>
  328. /// <param name="offsetY">相对item垂直偏移</param>
  329. public void Show(ToolStripItem item, int offsetX, int offsetY, Point endPoint)
  330. {
  331. Show(item, new Point(offsetX, offsetY),endPoint);
  332. }
  333.  
  334. /// <summary>
  335. /// 显示窗体
  336. /// </summary>
  337. /// <param name="item">触发弹出窗体的工具栏项</param>
  338. /// <param name="offset">相对item偏移</param>
  339. public void Show(ToolStripItem item, Point offset, Point endPoint)
  340. {
  341. this.ShowInternal(item, offset, endPoint);
  342. }
  343.  
  344. /// <summary>
  345. /// ShowDialog内部方法
  346. /// </summary>
  347. private DialogResult ShowDialogInternal(Component controlOrItem, Point offset, Point endPoint)
  348. {
  349. //快速连续弹出本窗体将有可能遇到尚未Hide的情况下再次弹出,这会引发异常,故需做处理
  350. if (this.Visible) { return System.Windows.Forms.DialogResult.None; }
  351.  
  352. this.SetLocationAndOwner(controlOrItem, offset, endPoint);
  353. return base.ShowDialog();
  354. }
  355.  
  356. /// <summary>
  357. /// Show内部方法
  358. /// </summary>
  359. private void ShowInternal(Component controlOrItem, Point offset, Point endPoint)
  360. {
  361. if (this.Visible) { return; }//原因见ShowDialogInternal
  362.  
  363. this.SetLocationAndOwner(controlOrItem, offset, endPoint);
  364. base.Show();
  365. }
  366.  
  367. /// <summary>
  368. /// 设置坐标及所有者
  369. /// </summary>
  370. /// <param name="controlOrItem">控件或工具栏项</param>
  371. /// <param name="offset">相对偏移</param>
  372. private void SetLocationAndOwner(Component controlOrItem, Point offset, Point endPoint)
  373. {
  374. Point pt = Point.Empty;
  375.  
  376. if (controlOrItem is ToolStripItem)
  377. {
  378. ToolStripItem item = (ToolStripItem)controlOrItem;
  379. pt.Offset(item.Bounds.Location);
  380. controlOrItem = item.Owner;
  381. }
  382.  
  383. Control c = (Control)controlOrItem;
  384. pt.Offset(GetControlLocationInForm(c));
  385. pt.Offset(offset);
  386. if (pt.X + this.RestoreBounds.Width > endPoint.X)//右边超出界面
  387. {
  388. pt.X = pt.X + c.Width - this.RestoreBounds.Width;
  389. }
  390.  
  391. this.Location = pt;
  392.  
  393. //设置Owner属性与Show[Dialog](Owner)有不同,当Owner是MDIChild时,后者会改Owner为MDIParent
  394. this.Owner = c.FindForm();
  395. }
  396.  
  397. /// <summary>
  398. /// 获取控件在窗体中的坐标
  399. /// </summary>
  400. private static Point GetControlLocationInForm(Control c)
  401. {
  402. Point pt = c.Location;
  403. //Control c1 = c.Parent;
  404. while (!((c = c.Parent) is Form))
  405. {
  406. pt.Offset(c.Location);
  407. }
  408. return pt;
  409. }
  410.  
  411.  
  412. #region 屏蔽对本类影响重大的基类方法和属性
  413.  
  414. /// <summary>
  415. /// 初始化部分基类属性
  416. /// </summary>
  417. private void InitBaseProperties()
  418. {
  419. base.ControlBox = false; //重要
  420. //必须得是SizableToolWindow才能支持调整大小的同时,不受SystemInformation.MinWindowTrackSize的限制
  421. base.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
  422. base.Text = string.Empty; //重要
  423. base.HelpButton = false;
  424. base.Icon = null;
  425. base.IsMdiContainer = false;
  426. base.MaximizeBox = false;
  427. base.MinimizeBox = false;
  428. base.ShowIcon = false;
  429. base.ShowInTaskbar = false;
  430. base.StartPosition = FormStartPosition.Manual; //重要
  431. base.TopMost = false;
  432. base.WindowState = FormWindowState.Normal;
  433. }
  434.  
  435. //屏蔽原方法
  436. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  437. [Obsolete("请使用别的重载!", true)]
  438. public new DialogResult ShowDialog() { throw new NotImplementedException(); }
  439.  
  440. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  441. [Obsolete("请使用别的重载!", true)]
  442. public new DialogResult ShowDialog(IWin32Window owner) { throw new NotImplementedException(); }
  443.  
  444. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  445. [Obsolete("请使用别的重载!", true)]
  446. public new void Show() { throw new NotImplementedException(); }
  447.  
  448. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  449. [Obsolete("请使用别的重载!", true)]
  450. public new void Show(IWin32Window owner) { throw new NotImplementedException(); }
  451.  
  452. //屏蔽原属性
  453. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  454. [Obsolete("禁用该属性!", true)]
  455. public new bool ControlBox { get { return false; } set { } }
  456.  
  457. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  458. [Obsolete("设置边框请使用Border相关属性!", true)]
  459. public new FormBorderStyle FormBorderStyle { get { return System.Windows.Forms.FormBorderStyle.SizableToolWindow; } set { } }
  460.  
  461. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  462. [Obsolete("禁用该属性!", true)]
  463. public override sealed string Text { get { return string.Empty; } set { } }
  464.  
  465. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  466. [Obsolete("禁用该属性!", true)]
  467. public new bool HelpButton { get { return false; } set { } }
  468.  
  469. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  470. [Obsolete("禁用该属性!", true)]
  471. public new Image Icon { get { return null; } set { } }
  472.  
  473. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  474. [Obsolete("禁用该属性!", true)]
  475. public new bool IsMdiContainer { get { return false; } set { } }
  476.  
  477. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  478. [Obsolete("禁用该属性!", true)]
  479. public new bool MaximizeBox { get { return false; } set { } }
  480.  
  481. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  482. [Obsolete("禁用该属性!", true)]
  483. public new bool MinimizeBox { get { return false; } set { } }
  484.  
  485. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  486. [Obsolete("禁用该属性!", true)]
  487. public new bool ShowIcon { get { return false; } set { } }
  488.  
  489. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  490. [Obsolete("禁用该属性!", true)]
  491. public new bool ShowInTaskbar { get { return false; } set { } }
  492.  
  493. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  494. [Obsolete("禁用该属性!", true)]
  495. public new FormStartPosition StartPosition { get { return FormStartPosition.Manual; } set { } }
  496.  
  497. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  498. [Obsolete("禁用该属性!", true)]
  499. public new bool TopMost { get { return false; } set { } }
  500.  
  501. [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
  502. [Obsolete("禁用该属性!", true)]
  503. public new FormWindowState WindowState { get { return FormWindowState.Normal; } set { } }
  504.  
  505. #endregion
  506.  
  507. /// <summary>
  508. /// 程序鼠标消息筛选器
  509. /// </summary>
  510. private class AppMouseMessageHandler : IMessageFilter
  511. {
  512. readonly FloatLayerBase _layerForm;
  513.  
  514. public AppMouseMessageHandler(FloatLayerBase layerForm)
  515. {
  516. _layerForm = layerForm;
  517. }
  518.  
  519. public bool PreFilterMessage(ref Message m)
  520. {
  521. //如果在本窗体以外点击鼠标,隐藏本窗体
  522. //若想在点击标题栏、滚动条等非客户区也要让本窗体消失,取消0xA1的注释即可
  523. //本例是根据坐标判断,亦可以改为根据句柄,但要考虑子孙控件
  524. //之所以用API而不用Form.DesktopBounds是因为后者不可靠
  525. if ((m.Msg == 0x201/*|| m.Msg==0xA1*/)
  526. && _layerForm.Visible && !NativeMethods.GetWindowRect(_layerForm.Handle).Contains(MousePosition))
  527. {
  528. _layerForm.Hide();//之所以不Close是考虑应该由调用者负责销毁
  529. }
  530.  
  531. return false;
  532. }
  533. }
  534.  
  535.  
  536. /// <summary>
  537. /// API封装类
  538. /// </summary>
  539. private static class NativeMethods
  540. {
  541. [DllImport("user32.dll")]
  542. [return: MarshalAs(UnmanagedType.Bool)]
  543. public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
  544.  
  545. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  546. public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  547.  
  548. [DllImport("user32.dll")]
  549. public static extern bool ReleaseCapture();
  550.  
  551. [DllImport("user32.dll", SetLastError = true)]
  552. public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
  553.  
  554. [DllImport("user32.dll", SetLastError = true)]
  555. private static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
  556.  
  557. [StructLayout(LayoutKind.Sequential)]
  558. private struct RECT
  559. {
  560. public int left;
  561. public int top;
  562. public int right;
  563. public int bottom;
  564.  
  565. public static explicit operator Rectangle(RECT rect)
  566. {
  567. return new Rectangle(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
  568. }
  569. }
  570.  
  571. public static Rectangle GetWindowRect(IntPtr hwnd)
  572. {
  573. RECT rect;
  574. GetWindowRect(hwnd, out rect);
  575. return (Rectangle)rect;
  576. }
  577.  
  578. //[DllImport("user32.dll", ExactSpelling = true)]
  579. //public static extern IntPtr GetAncestor(IntPtr hwnd, uint flags);
  580. }
  581. }

  

1  添加用户控件UserControl1继承FloatLayerBase

 

2 调用代码

  1. public FloatLayerBase CreateLayer(Type type, out bool isShow)
  2. {
  3. //考虑到初始化体验爽滑,不用反射
  4. FloatLayerBase layer = null;
  5. if (type == typeof(UserControl1)) { layer = new UserControl1(); } }
  6.  
  7. LayerFormOption opts = LayerOption;
  8. isShow = opts.IsShow;
  9. layer.BorderType = opts.BorderType;
  10. layer.Border3DStyle = opts.Border3DStyle;
  11. layer.BorderSingleStyle = opts.BorderSingleStyle;
  12. layer.BorderColor = opts.BorderColor;
  13. return layer;
  14. }
  15.  
  16. public void PopupLayer(Type type, object sender)
  17. {
  18. Control c = sender as Control;
  19. ToolStripItem item = sender as ToolStripItem;
  20. Point pt = new Point(this.ClientRectangle.Width, this.ClientRectangle.Height);
  21.  
  22. bool isShow;
  23. FloatLayerBase p = CreateLayer(type, out isShow);
  24. if (isShow)
  25. {
  26. if (c != null) { p.Show(c, pt); }
  27. else { p.Show(item, pt); }
  28. }
  29. else
  30. {
  31. var result = c != null ? p.ShowDialog(c, pt) : p.ShowDialog(item, pt);
  32. //txbResult.AppendText(result + "\r\n");
  33. }
  34. }
  35.  
  36. private void button1_Click(object sender, EventArgs e)
  37. {
  38. PopupLayer(typeof(UserControl1), sender);
  39. }

  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号