Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Vista中固定形式边框样式的奇怪问题_C#_.net_Forms_Coding Style_Border - Fatal编程技术网

C# Vista中固定形式边框样式的奇怪问题

C# Vista中固定形式边框样式的奇怪问题,c#,.net,forms,coding-style,border,C#,.net,Forms,Coding Style,Border,我之前关于这个问题的帖子没有得到太多的答案,而且有点具体,很难理解。我想我已经设法更好地理解了这个问题,现在我相信这是一个前景问题 问题在于所有类型的固定边框样式,如FixedDialog、Fixed3D、FixedSingle和FixedToolWindow。这种情况不会发生在规模较大的项目上。正如我所说,这个问题也只发生在Vista上 假设您有一个具有任何固定边框样式的表单,并将起始位置设置为0,0。这里需要的是将表单捕捉到屏幕的左上角。如果窗体边框样式是一个相当大的选项,那么它就可以正常工

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

问题在于所有类型的固定边框样式,如FixedDialog、Fixed3D、FixedSingle和FixedToolWindow。这种情况不会发生在规模较大的项目上。正如我所说,这个问题也只发生在Vista上

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

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

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


如果可能,在不查找工作区域外绘制了多少像素,然后将其添加到表单位置的情况下,是否有可能修复或解决此问题?

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


建议关闭此问题…

如果启用Aero,Windows将向您谎报
Fixed*
FormBorderStyle
窗口的大小和位置。下面的代码显示了如何获得此类窗口的正确高度和顶部偏移。类似的技术将允许您在(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;
}