Windows在桌面应用程序栏中形成MenuStrip DropDown

时间:2012-11-26 20:25:41

标签: c# winforms winforms-interop

这是我在Windows开发人员中心发布的问题的副本。还在等待回复,所以我想我会在这里试试。如果格式出错,我很抱歉。

目前正在使用Windows 7 Professional,SP1编写和调试。

应用程序位于桌面的顶部,工作区域通过挂钩适当调整大小到SystemParametersInfo函数中。 MenuStrip按预期显示,但MenuStrip的任何下拉列表都显示为与MenuStrip本身分离(就好像它是在新工作区域上绘制的,而不是包含MenuStrip的表单)。例如:

  • 应用程序TopLevel:true
  • 申请身高:150
  • 应用程序位置:桌面上的0,0(工作区域调整大小之前)
  • MenuStrip身高:25
  • MenuStrip位置:父表单中的0,0
  • MenuStrip DropDown位置:x,2(其中x是有效且可接受的值)这是在调整大小的工作区域(即表单下方)上绘制的

我尝试使用自定义渲染器对此进行更正以使其无效。我试图覆盖WndProc(如下所示),以便查看究竟发生了什么,但是在绘制应用程序的过程中,这导致了stackoverflow。

protected override void WndProc(ref Message m)
{
    if (mainForm.Visible)
    {
        MessageBox.Show("ID: " + m.Msg.ToString() + "\n" + m.ToString());
    }
    base.WndProc(ref m);
}

我怀疑我现在已经把它投入了地面,但是如果你需要任何进一步的解释,请告诉我。只是希望有人可以指出我应该在哪个方向找到合适的方向。


希望这将回答有关我使用SystemParametersInfo的原因的问题:

    #region TEMPORARY FIX TO ACHIEVE APPBAR
    public RECT normalWorkingRECT = new RECT();
    public RECT newWorkingRECT = new RECT();

    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    };

    [DllImport("user32.dll", EntryPoint="SystemParametersInfo")]
    public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref RECT pvParam, uint fWinIni);

    //call after scale is set
    private void setAppBar()
    {
        //make the parent = the desktop
        if (!this.GetTopLevel())
        {
            this.SetTopLevel(true);
        }
        this.Width = SystemInformation.PrimaryMonitorSize.Width;

        //set old Working Area
        SystemParametersInfo(0x0030, 0, ref normalWorkingRECT, 0);

        //change work area based on size of main form
        newWorkingRECT.left = normalWorkingRECT.left;
        newWorkingRECT.top = normalWorkingRECT.top + this.DesktopBounds.Height + 4;
        newWorkingRECT.right = normalWorkingRECT.right;
        newWorkingRECT.bottom = normalWorkingRECT.bottom;
        SystemParametersInfo(0x002F, 0, ref newWorkingRECT, 0x0002);
    }

    //called on close
    private void unsetAppBar()
    {
        //get current work area to compare
        RECT testRECT = new RECT();
        SystemParametersInfo(0x0030, 0, ref testRECT, 0);
        //if no change, resize to normal working rect
        if (newWorkingRECT.top == testRECT.top &&
            newWorkingRECT.bottom == testRECT.bottom &&
            newWorkingRECT.left == testRECT.left &&
            newWorkingRECT.right == testRECT.right)
        {
            SystemParametersInfo(0x002F, 0, ref normalWorkingRECT, 0x0002);
        }
        //if there is a change, resize to current working rect - this.height
        else
        {
            testRECT.top -= this.DesktopBounds.Height + 4;
            SystemParametersInfo(0x002F, 0, ref testRECT, 0x0002);
        }

    }
    #endregion

Cropped Screenshot of the issue.

编辑:按要求添加图片和代码以显示SystemParametersInfo的原因。

0 个答案:

没有答案