Pergunta

Eu quero criar dicas de ferramentas personalizadas, onde eu posso colocar qualquer tipo de controles. Eu ter derivado de CDialog e usou os estilos WS_POPUP | WS_BORDER. Eu também adicionar o estilo CS_DROPSHADOW na OnInitDialog para obter a sombra dica.

Então eu me gerenciar os eventos WM_MOUSEHOVER e WM_MOUSELEAVE para mostrar / ocultar as dicas de ferramentas.

I exibir a dica de ferramenta usando SetWindowPos e SWP_NOACTIVATE para impedir o pai de se tornar inativo e a nova caixa de diálogo de tornar-se ativo. Mas de qualquer maneira, quando eu criar o diálogo usando o método CDialog::Create ... na janela principal torna-se inativo ... o que faz um efeito muito ruim.

Assim, a minha custion é como eu posso criar um CDialog com o estilo WS_POPUP sem a minha janela principal (ou a janela pai da caixa de diálogo) becomening inativo quando os novos shows de diálogo acima ???

Obrigado por ajudar!

Editado: eu não usar o estilo WS_VISIBLE para criar o diálogo ... isso este recurso:

    IDD_LABEL_TOOLTIP_DLG DIALOGEX 0, 0, 100, 9
    STYLE DS_SETFONT | WS_POPUP | WS_BORDER
    FONT 8, "Tahoma", 0, 0, 0x0
    BEGIN
       LTEXT           "##################",IDC_TOOLTIP_LBL_TEXT,0,0,99,9
   END

O código que exibir a dica é algo assim:

if(!pTooltipDlg)
{
    pTooltipDlg = new MyCustomTooltipDlg();
    pTooltipDlg->Create( MyCustomTooltipDlg::IDD, this);
}
pTooltipDlg->ShowWindow(SW_SHOWNOACTIVATE);

A primeira vez (ou seja, quando a criar está sendo chamada) as principais janelas perder o foco ... o resto deles este efeito feio não está acontecendo ... então eu tenho certeza que é por causa do Criar.

Foi útil?

Solução 4

Ok. Eu finalmente consegui-lo! Eu só tinha que FALSE retorno no método OnInitDialog para evitar o diálogo que está sendo ativado.

Graças a todos vocês!

Outras dicas

Quando você cria sua janela, não defina a bandeira WS_VISIBLE nele. Então você pode usar ShowWindow com SW_SHOWNA ou SW_SHOWNOACTIVATE para tornar visível o diálogo.

Você está chamando CDialog::Create() com o conjunto WS_VISIBLE? Pode ser que até mesmo chamando Create() é suficiente para tirar o foco do pai. Ele também pode valer a pena substituir WM_SETFOCUS em sua classe dica e não de chamar a classe base para torná-lo impossível para o foco para janelas de mudança.

Primeiro, considere usar um CWnd em vez de um CDialog. Isto dá-lhe um controle muito mais fino. E você não está realmente usando quaisquer características do CDialog de qualquer maneira que não seja o modelo de diálogo; não é muito difícil criar dinamicamente os seus controles.

Você também pode querer considerar, nos manipuladores de mensagem, manipulação OnShowWindow e garantir a qualquer show comandos são alterados para SW_SHOWNA como no comentário de Mark Ransom.

Além disso, como uma dica, ele provavelmente deve ter uma janela NULL pai.

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