这是我在Windows开发人员中心发布的问题的副本。还在等待回复,所以我想我会在这里试试。如果格式出错,我很抱歉。
目前正在使用Windows 7 Professional,SP1编写和调试。
应用程序位于桌面的顶部,工作区域通过挂钩适当调整大小到SystemParametersInfo函数中。 MenuStrip按预期显示,但MenuStrip的任何下拉列表都显示为与MenuStrip本身分离(就好像它是在新工作区域上绘制的,而不是包含MenuStrip的表单)。例如:
我尝试使用自定义渲染器对此进行更正以使其无效。我试图覆盖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
编辑:按要求添加图片和代码以显示SystemParametersInfo的原因。