c# - 如何使用系统菜单创建无边框表单?

标签 c# interop wndproc createparams

我创建了一个无边框表单,我设法使用以下方法为其分配系统菜单:

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams param = base.CreateParams;
            param.Style |= (WS_SYSMENU);

            return param;
        }
    }

但是现在,当我运行它时,它不再显示我通过 WMNCHITTEST 设置的自定义大小调整区域,如下所示:

    protected override void WndProc(ref Message m)
    {
        const int wmNcHitTest = 0x84;
        const int htBottomLeft = 16;
        const int htBottomRight = 17;
        if (m.Msg == wmNcHitTest)
        {
            int x = (int)(m.LParam.ToInt64() & 0xFFFF);
            int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16);
            Point pt = PointToClient(new Point(x, y));
            Size clientSize = ClientSize;
            if (pt.X >= clientSize.Width - 40 && pt.Y >= clientSize.Height - 40 && clientSize.Height >= 40)
            {
                m.Result = (IntPtr)(htBottomRight);
                return;
            }
        }
        base.WndProc(ref m);

    }

那么,如何克服这个问题呢?是否可以使用系统菜单的无边框形式同时也遵守 WMNCHITTEST?

最佳答案

这个 CreateParams 重写应该可以解决问题:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.Style = WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_SYSMENU;
        cp.ClassStyle = CS_DBLCLKS;
        return cp;
    }
}

const int WS_CLIPCHILDREN = 0x2000000;
const int WS_MINIMIZEBOX = 0x20000;
const int WS_MAXIMIZEBOX = 0x10000;
const int WS_SYSMENU = 0x80000;
const int CS_DBLCLKS = 0x8;

关于c# - 如何使用系统菜单创建无边框表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25517888/

相关文章:

c# - 为什么不能从 Excel 互操作设置转换对象?

c# - 通过 .NET 确定现有的本地 Windows 帐户

c# - 在模式进度对话框启动时调用 "Application.DoEvents"是否可以?

c# - EF 数据库首先如何更新数据库更改的模型?

c# - 我在哪里可以找到 System.Web.HttpContext.Current.Server dll?

c# - 如何将消息从托管应用程序的一个实例发送到另一个实例?

c++ - WndProc 作为类(class)成员,无法退出

c - WM_PAINT 的帧率

c# - 递归函数调用抛出 StackOverFlowException

c# - Backgroundworker ReportProgress事件不会触发