c# MDI容器,与最大化的子窗体之间的3d边框效果,怎么去掉

ijunxiong 2016-07-05 03:20:26


参照 www.myexception.cn/c-sharp/1683098.html 的方法,用控件的Controls来包含,
但 这也会产生其他问题,
1。如窗体切换,按键ctrl+tab,
2。如主窗体的标题,(一般mdi是 主窗体text - [子窗体text])
3。最大化窗体,虽然都设置了dock,还是有尺寸不发生改变的问题
4。工具栏,菜单没办法合并的问题,,,


综上,是否还有别的办法????
比如重绘之类的
(重绘的不是很清楚能不能实现,我只测了OnPaint,好像不行,进行重绘,在非mdi容器有效果的
,在mdi容器就不行,)

谢谢
...全文
511 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
龍过鸡年 2016-07-06
  • 打赏
  • 举报
回复
http://codego.net/366493/
ijunxiong 2016-07-06
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace MDITest { public static class MDIClientSupport { [DllImport("user32.dll")] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll", ExactSpelling = true)] private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); private const int GWL_EXSTYLE = -20; private const int WS_EX_CLIENTEDGE = 0x200; private const uint SWP_NOSIZE = 0x0001; private const uint SWP_NOMOVE = 0x0002; private const uint SWP_NOZORDER = 0x0004; private const uint SWP_NOREDRAW = 0x0008; private const uint SWP_NOACTIVATE = 0x0010; private const uint SWP_FRAMECHANGED = 0x0020; private const uint SWP_SHOWWINDOW = 0x0040; private const uint SWP_HIDEWINDOW = 0x0080; private const uint SWP_NOCOPYBITS = 0x0100; private const uint SWP_NOOWNERZORDER = 0x0200; private const uint SWP_NOSENDCHANGING = 0x0400; public static bool SetBevel(this Form form, bool show) { foreach (Control c in form.Controls) { MdiClient client = c as MdiClient; if (client != null) { int windowLong = GetWindowLong(c.Handle, GWL_EXSTYLE); if (show) { windowLong |= WS_EX_CLIENTEDGE; } else { windowLong &= ~WS_EX_CLIENTEDGE; } SetWindowLong(c.Handle, GWL_EXSTYLE, windowLong); // Update the non-client area. SetWindowPos(client.Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED); return true; } } return false; } } } 调用,form_load MDIClientSupport.SetBevel(this, false);
ijunxiong 2016-07-06
  • 打赏
  • 举报
回复
引用 5 楼 qqamoon 的回复:
http://codego.net/366493/
谢谢,你说的方法试了,可以!
ijunxiong 2016-07-06
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
[quote=引用 4 楼 ijunxiong 的回复:] [quote=引用 1 楼 shingoscar 的回复:] 拖个panel进去,dock设置为fill即可
我有说了,用这种方法测过了, 即控件的controls包含的方法了, 和会出现的问题。。。。。(问题不少,所以才想有没有不用这种方法处理的其他方法) (控件其实就是panel容器) 另外,你3楼给的代码,的用处是??   我测了没变化[/quote] 没变化说明Load事件没注册[/quote] ,,,, 注册了,断点也进从break出来了,,, 没变化
Poopaye 2016-07-06
  • 打赏
  • 举报
回复
引用 4 楼 ijunxiong 的回复:
[quote=引用 1 楼 shingoscar 的回复:] 拖个panel进去,dock设置为fill即可
我有说了,用这种方法测过了, 即控件的controls包含的方法了, 和会出现的问题。。。。。(问题不少,所以才想有没有不用这种方法处理的其他方法) (控件其实就是panel容器) 另外,你3楼给的代码,的用处是??   我测了没变化[/quote] 没变化说明Load事件没注册
ijunxiong 2016-07-05
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
拖个panel进去,dock设置为fill即可
我有说了,用这种方法测过了, 即控件的controls包含的方法了, 和会出现的问题。。。。。(问题不少,所以才想有没有不用这种方法处理的其他方法) (控件其实就是panel容器) 另外,你3楼给的代码,的用处是??   我测了没变化
tcmakebest 2016-07-05
  • 打赏
  • 举报
回复
一定是新建的时候操作不正确, 正常情况下边框比这个窄
Poopaye 2016-07-05
  • 打赏
  • 举报
回复
换一个方法
		[DllImport("user32.dll")]
		static extern long GetWindowLong(IntPtr hWnd, int nIndex);

		[DllImport("user32.dll")]
		static extern long SetWindowLong(IntPtr hWnd, int nIndex, long value);

		private void Form1_Load(object sender, EventArgs e)
		{
			foreach (Control c in this.Controls)
			{
				if (c is MdiClient)
				{
					IntPtr h = c.Handle;
					SetWindowLong(h, -16, GetWindowLong(h, -16) & ~0x00800000L);
					SetWindowLong(h, -20, GetWindowLong(h, -20) & ~0x00000200L);
					break;
				}
			}
		}
Poopaye 2016-07-05
  • 打赏
  • 举报
回复
拖个panel进去,dock设置为fill即可

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧