0

我之前关于这个问题的帖子没有得到太多答案,而且有点具体且难以理解。我想我已经设法更好地理解了这个问题,我现在认为这是一个 Vista 问题......

问题在于所有类型的固定边框样式,例如 FixedDialog、Fixed3D、FixedSingle 和 FixedToolWindow。它不会发生在相当大的人身上。这个问题,就像我说的,它也只发生在 Vista 上。

假设您有一个具有任何固定边框样式的表单,并将起始位置设置为 0,0。您在这里想要的是将表单捕捉到屏幕的左上角。如果表单边框样式是相当大的选项之一,这很好用,如果它是固定的,那么表单将在左侧和顶部的屏幕工作区域之外一点点。

更奇怪的是,表单位置并没有改变,仍然是 0,0,但是表单的几个像素仍然绘制在工作屏幕区域之外。

我在 XP 上对此进行了测试,但没有发生,问题是 Vista 特有的。在 XP 上,唯一的区别是任何样式之间的边框大小都会发生一些变化。但表格总是完美地捕捉到位置 0,0。

如果可能,如果没有找到在工作区域之外绘制了多少像素然后将其添加到表单位置,是否有可能的方法来解决或解决这个问题?

4

2 回答 2

1

如果启用了 Aero,Windows 会在窗口大小和位置方面对您撒谎Fixed* FormBorderStyle。以下代码显示了如何获取此类 Window 的正确高度和顶部偏移。类似的技术将允许您在 (0,0) 处放置一个窗口。

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();

// When Aero is enabled, and our FormBorderStyle is FixedToolWindow,
//    Windows will lie to us about our size and position.
public bool AeroIsMessingWithUs()
{
    bool ret = false;
    try
    {
        // check for other Fixed styles here if needed
        if (FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedToolWindow)
        {
            if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
            {
                // Aero is enabled
                ret = true;
            }
        }
    }
    catch
    {
    }
    return ret;
}

public int MyWindowHeight()
{
    int height = Height;
    if (AeroIsMessingWithUs())
    {
        // there are actually 5 more pixels on the top and bottom
        height += 10;
    }
    return height;
}

public int MyWindowY()
{
    int y = Location.Y;
    if (AeroIsMessingWithUs())
    {
        // I'm actually 5 pixels higher than Windows says I am
        y -= 5;
    }
    return y;
}
于 2013-11-21T23:27:11.390 回答
0

我想这样做的原因是允许我应用了皮肤的应用程序启用或禁用该皮肤。整个应用程序在皮肤上运行良好,我试图实现一个属性来启用和禁用皮肤。这个主题的问题是我在禁用皮肤时遇到的问题之一。然后我意识到,如果皮肤被禁用,我还有很多其他烦人的问题需要处理。这意味着我现在会忘记这个功能,暂时让皮肤保持打开状态。我只是现在没有时间处理这么多问题......

提议结束这个问题...

于 2009-05-14T23:34:43.820 回答