日期:2014-05-18  浏览次数:20839 次

求指导,关于窗体中控件具有窗体标题栏同样功能的做法(最大、最小、移动窗体)
如题 ,在窗体里面放一个Panel,然后我想在双击Panel 区域的时候可以放大缩小窗体,也可以移动窗体,就是panel区域的功能和窗体的标题栏功能一样,我是这样写的:
C# code

        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事件计算位移的方法哦 这个我知道的,求另外简单方法!

------解决方案--------------------
我猜你是想自绘窗体边框外形吧?

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

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

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

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








------解决方案--------------------
WndProc(ref Message m)
鼠标移到panel上这个父类的重载貌似做不到