求指导,关于窗体中控件具有窗体标题栏同样功能的做法(最大、最小、移动窗体)

菜鸟飞飞 2012-03-08 01:58:39
如题 ,在窗体里面放一个Panel,然后我想在双击Panel 区域的时候可以放大缩小窗体,也可以移动窗体,就是panel区域的功能和窗体的标题栏功能一样,我是这样写的:

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case Win32Methods.WM_NCHITTEST:
if ((int)m.Result == Win32Methods.HTCLIENT)
{
Point pt = new Point((int)m.LParam);
pt = PointToClient(pt);
Control control = GetChildAtPoint(pt);
if (control is Panel)
{
m.Result = (IntPtr)Win32Methods.HTCAPTION;
}
}
break;
}
}

我重写了窗体的上面这个方法,但是当鼠标移到Panel区域的时候,根本木有激发这个事件,所以我就不知道怎么弄了 求高手指导?不要说用Panel的MouseDown MouseMove MouseDoubleClick MouseUp事件计算位移的方法哦 这个我知道的,求另外简单方法!
...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐大法师 2012-03-08
  • 打赏
  • 举报
回复
研究一下dockpanel吧 开源项目 就和VS那个 界面一样 能拖动 放大 缩小
菜鸟飞飞 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 win32fanex 的回复:]
我猜你是想自绘窗体边框外形吧?

自绘窗体边框有两种方法,你采用的显然是将窗体设为无边框,然后再用控件仿造一个窗口边框出来包括标题栏。

我猜是不是因为WM_NC系列消息是出自窗口非客户区的,就是边框和标题栏。你把窗口边框设为none后,非客户区没了,所以这些消息当然就收不到了?

重绘窗体边框一般不用上面方法,因为上面方法不仅要进行绘制,还要模仿事件。后者很难做到和原生态窗口边框完全……
[/Quote] 一楼说的是无边框情况,我这里是想在有边框的情况下,添加一个控件,在这个控件区域可以有标题栏的功能.....
菜鸟飞飞 2012-03-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangsunjun 的回复:]
WndProc(ref Message m)
鼠标移到panel上这个父类的重载貌似做不到
[/Quote]

是啊 就是我在尝试的时候发现做不到 所以就问下该怎么解决! 不会真的只能用Panel的MouseDown MouseMove MouseDoubleClick MouseUp事件计算位移的方法吧?
  • 打赏
  • 举报
回复
WndProc(ref Message m)
鼠标移到panel上这个父类的重载貌似做不到
assky124 2012-03-08
  • 打赏
  • 举报
回复
直接用MDI窗体得了
大狗狗 2012-03-08
  • 打赏
  • 举报
回复
我猜你是想自绘窗体边框外形吧?

自绘窗体边框有两种方法,你采用的显然是将窗体设为无边框,然后再用控件仿造一个窗口边框出来包括标题栏。

我猜是不是因为WM_NC系列消息是出自窗口非客户区的,就是边框和标题栏。你把窗口边框设为none后,非客户区没了,所以这些消息当然就收不到了?

重绘窗体边框一般不用上面方法,因为上面方法不仅要进行绘制,还要模仿事件。后者很难做到和原生态窗口边框完全一致。

一般采用的方法是,不将窗口边框类型设为none,而是在WM_NCPAINT等消息中去重绘窗体的标题栏、边框等。这种方法绘制起来比较麻烦,但好处是完全兼容原生窗体功能。目前应用程序基本采用这种方法,比如QQ。
不过这种方法有个小小bug:就是在绘制标题栏时,系统会先绘上基本样式再执行你的自绘代码。基本样式就是一个纯蓝色的标题栏。你在最大化、最小化窗体时,你会发现标题栏这个原始蓝色的闪烁。不信你现在就拿你的QQ试一下。







110,572

社区成员

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

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

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