Adicionando clique/clique duas vezes em eventos aos controles de caixa de grupo estáticos

StackOverflow https://stackoverflow.com/questions/2541714

Pergunta

Tendo percebido que minhas próprias razões eram muito duvidosas, agora eu segui isso de uma maneira diferente. Mas ainda estou curioso ...

Por razões de nostalgia, familiaridade e preguiça, estou codificando uma interface do usuário com o MFC. Por razões duvidosas (como se não fossem suficientes), eu queria adicionar um evento (duplo) clique em uma caixa de grupo. Naturalmente, a caixa de grupo contém coisas - na verdade, ela contém outro item estático, ao qual posso adicionar com sucesso um manipulador de eventos (duplo).

Existe alguma razão para que um manipulador de eventos funcione para cliques na caixa de grupo da mesma maneira que posso fazer isso para o item estático de texto simples? Nenhuma quantidade de clicar em, dentro ou perto do controle, dispara o evento.

Nota - eu li http://www.codeproject.com/kb/static/staticctrl_tut.aspx e tentei responder a ambos on_stn _... eventos e on_bn _... mensagens, definindo o estilo notificar (bs_notify aparece no arquivo rc) ... e ainda estou perdendo alguma coisa - o que é? Isso é possível? A maior parte do que eu pesquisei sugere que é ... mas sem respostas claras para C ++/MFC.

Desde que publiquei esta pergunta, encontrei referência a uma mensagem WM_NCHITTEST, e sugere que você precisa criar um manipulador para esta mensagem para substituir o comportamento padrão da caixa de grupo de responder com ht_transparent ... apesar de ter sua propriedade transparente em ClassWizard Set para falso. Hmmm. Alguém pode confirmar que essa é realmente a chave?

Foi útil?

Solução

Eu acho que wm_nchhittest/ht_transparent é realmente a chave aqui.

As caixas de grupo são um tipo estranho de controle: embora pareça que elas contêm outros controles, elas são realmente irmãos desses controles na árvore hwnd. Portanto, uma caixa de grupo que parece contém dois botões é na verdade um irmão desses botões - e pode vir antes ou depois dele na hierarquia HWND.

As caixas de grupo respondem a WM_NCHITTEST com HT_TRANSPARENT, para que os cliques do mouse passe por eles. Um benefício disso é que não importa se a caixa de grupo vem antes ou depois dos controles que ela parece conter na ordem da janela; Os cliques acabarão sendo roteados para esses controles, não para a caixa de grupo.

Para clicar duas vezes (ou simplesmente clicar) na caixa de grupo para funcionar, você precisaria fazer duas coisas:

  • substituir o comportamento padrão wm_ncittest e, em vez disso, retornar ht_client, como um controle regular
  • ; Nesse ponto, deve ser capaz de obter WM_LBUTTONDOWN e eventos relacionados que, de outra forma, teriam ido para outro lugar (para um irmão, ou para a própria caixa de diálogo).
  • Certifique-se de que o conteúdo da caixa de grupo chegue * antes * na ordem Z HWND, para que eles não estejam mais confiando nos cliques que passam 'na caixa de grupo. (Pelo menos eu acho que você quer que eles sejam antes; de qualquer maneira, pode ser necessário brincar com o pedido de pedidos agora que é significativo novamente.)

Observe que esse é um tipo diferente de transparência novamente do WS_EX_TRANSPARENT, que pode ser o que a propriedade Transparent Class Assistente mapeia. Simplificado, HT_Transparent tem a ver com ser transparente para o mouse; WS_EX_TRANSPARENT é mais sobre ser pintado pela última vez para que os irmãos "show através".

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