dica personalizada com um diálogo WS_POPUP
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.
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.