(C #) Windows Forms - O fundo transparente enquanto capturar eventos de mouse?

votos
2

parece haver uma pergunta semelhante a este aqui, mas com o problema 'oposto' (Ele não queria que eventos de mouse capturado).

I têm uma forma com um painel. A janela tem fronteiras e definido para o tamanho exacto do painel (para todas as intenções e propósitos, é como se o painel está 'livre flutuação'). Eu posso definir BackColor do painel para SystemColors.Control e defina TransparencyKey da janela para o mesmo. Isso funciona na medida em que alcança o efeito desejado (transparência), mas o painel já não pode capturar eventos do mouse (que é vital para a funcionalidade)!

Existe outra maneira de contornar isso, ou uma maneira de reativar a captura do mouse?

Eu tentei substituir o OnPaintBackground e fazendo um noop, mas isso não alcançar verdadeira transparência porque não atualizar o fundo após cada tick (assim que o que está por trás do painel no sorteio inicial permanece lá, independentemente de você mover o painel ou não atualizá-lo). Ele fez, no entanto, permitir que o painel para capturar eventos do mouse.

Isso não é tudo o que problemático nesta fase no projeto, mas me deparei com o problema durante um protótipo rápido e está começando a me irritar agora. Se alguém tem qualquer ponteiros eles seriam muito apreciados.

Publicado 19/05/2009 em 14:18
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Se você estivesse usando VC ++, eu diria que você precisava de uma bomba de mensagem para processar mensagens de eventos WM_ rato.

Uma rápida pesquisa revela nesta discussão que podem ser de ajuda para você:

Capturando todos os eventos do mouse

Espero que você já tentou usar o seguinte:

/// <summary>
/// A transparent control.
/// </summary>
public class TransparentPanel : Panel
{
    public TransparentPanel()
    {
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // Do not paint background.
    }
}
Respondeu 19/05/2009 em 15:36
fonte usuário

votos
0

Eu realmente não tenho uma resposta para você, mas eu tenho uma outra maneira (talvez um pouco "hacky") para que você realize o que você está tentando fazer.

Defina a propriedade Formas opacidade para 1% (não mexa com a chave de transparência) e agora ele vai capturar os eventos. O formulário não será visível (pelo menos na minha máquina em 1% eu não podia vê-lo em tudo) e você ainda será capaz de capturar todos os cliques do mouse.

Respondeu 19/05/2009 em 14:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more