当前位置:编程学习 > C#/ASP.NET >>

WM_NCCALCSIZE消息问题,窗体会不断变小,求救!!!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using gowk.common;
using System.Runtime.InteropServices;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        protected override void WndProc(ref Message m)
        {

            base.WndProc(ref m);
            switch (m.Msg)
            {
                case API.WM_NCCALCSIZE:
                    if (m.WParam != IntPtr.Zero)
                    {
                        NCCALCSIZE_PARAMS par;
                        par = (NCCALCSIZE_PARAMS)m.GetLParam(typeof(NCCALCSIZE_PARAMS));
                        if (par.rgrc[0].top != par.rgrc[0].bottom)
                        {
                            base.WndProc(ref m);
                            System.Diagnostics.Trace.WriteLine(par.ToString() + "\n" + m.ToString() + "\n");
                            par.rgrc[0].top += 20;
                            Marshal.StructureToPtr(par, m.LParam, false);

                        }
                    }


                    break;

            }


        }


        [StructLayout(LayoutKind.Sequential)]
        public struct NCCALCSIZE_PARAMS
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
            public RECT[] rgrc;
            public PWINDOWPOS lppos;
            public override string ToString()
            {

                return string.Format("rgrc[0]={0}\nrgrc[1]={1}\nrgrc[2]={2}\nlppos={3}", rgrc[0].ToString(), rgrc[1].ToString(), rgrc[2].ToString(), lppos.ToString());
            }
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
            public override string ToString()
            {
                return string.Format("[left={0},top={1},right={2},bottom={3})]", left, top, right, bottom);
            }
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct PWINDOWPOS
        {
            public IntPtr hwnd;
            public IntPtr hwndInsertAfter;
            public int x;
            public int y;
            public int cx;
            public int cy;
            public uint flags;
            public override string ToString()
            {
                return string.Format("[ hwnd={0}, hwndInsertAfter={1},x={2},y={3},cx={4},cy={5},flags={6}]", hwnd, hwndInsertAfter, x, y, cx, cy, flags);
            }
        }




    }
}

窗体会在不停的最小化和还原的过程中不停的变小。变小的值为par.rgrc[0].top += 20这里的20,操作过程就是不停的在状态栏点窗体让窗体在最小化和还原之间做切换,不知道大家有没有遇到过这个问题。遇到的请帮助解决。谢谢。
在C++中重写这个消息,代码也是一样的则不存在这个问题。而且我发现现执行两次这个消息。如果不调整。则只会执行一次。谢谢大家帮我处理下。。。 --------------------编程问答-------------------- 看的晕 你这东西是想要窗口不停地最小化---还原? --------------------编程问答-------------------- 你想做什么?
你想做成什么? --------------------编程问答-------------------- 我想调整标题栏的高度。
标题栏的高度太小啦。我绘的时候,不好看。
所以我想重新调整标题栏的高度。但问题是这样做了后,窗体会不停的变小啊。
所以请大家帮忙看下。代码那里有问题。为什么窗体会不停的变小。 --------------------编程问答-------------------- 编译环境为VS2005,XP
--------------------编程问答-------------------- 一个最简单的方法可以解决 屏蔽掉基类的SetBoundsCore方法就不会乱了
这个问题我也遇到过 但是不知道原因在哪
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{                
    //base.SetBoundsCore(x, y, width, height, specified);
} --------------------编程问答-------------------- 窗体花痴了。它本来只带了一朵花,你却让它带了一朵又一朵。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,