Pergunta

O meu post anterior sobre esta questão não tem muitas respostas e foi meio específico e difícil de entender. Eu acho que eu consegui entender melhor o problema e agora eu acredito que seja uma questão de Vista ...

As mentiras problemáticas em todos os tipos de estilos de borda fixos, como FixedDialog, Fixed3D, FixedSingle e FixedToolWindow. Isso não acontece nos consideráveis. Este problema, como eu disse, também acontece apenas no Vista.

Vamos dizer que você tem um formulário com qualquer um dos estilos de borda fixa e definir a localização inicial para 0,0. O que você quer aqui é para a forma a ser encaixada no canto superior esquerdo da tela. Isso funciona muito bem se o estilo de borda forma é uma das opções de tamanho considerável, se ele é fixo, assim, a forma será um fora bit pouco de tela da área de trabalho tanto para a esquerda e de cima.

O que é mais estranho nisso é que a localização forma não muda, ele peitoril é 0,0, mas alguns pixels de forma ainda são desenhados fora da área de tela de funcionar.

Eu testei isso no XP e isso não aconteceu, o problema é Vista específica. No XP, a única diferença foi o tamanho da borda que mudar um pouco entre qualquer um dos estilos. Mas a forma foi sempre perfeitamente encaixado na posição 0,0.

Se possível, sem encontrar quantos pixels estão sendo desenhado fora da área de trabalho e, em seguida, acrescentar que para o local forma, existe uma possível maneira de corrigir ou solucionar esse?

Foi útil?

Solução

Se Aero está habilitado, o Windows irá mentir para você sobre o tamanho ea posição das janelas Fixed* FormBorderStyle. Os seguintes mostra o código como obter a altura correta e top-compensado de tal janela um. Uma técnica similar permitirá que você colocar uma janela em (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;
}

Outras dicas

A razão que eu quero fazer isso é permitir que a minha candidatura, que tem uma pele aplicado, para ativar ou desativar essa pele. Toda a aplicação está funcionando bem com a pele e eu estava tentando implementar uma propriedade para ativar e desativar a pele. A questão sobre este tema foi um dos problemas que estou tendo quando a pele está desativado. Então eu percebi que eu também tenho um monte de outros problemas irritantes para lidar com se a pele está desativado. O que significa que eu só vou esquecer esse recurso para agora e deixar a pele sempre no ser tempo. Eu simplesmente não têm tempo para lidar com tantos problemas agora ...

Propor ao fechar esta pergunta ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top