Existem duas maneiras de adicionar uma caixa de diálogo ao seu projeto ATL: usar o Assistente de objeto ATL ou adicioná-lo manualmente.
No Assistente de objeto ATL (menuInserir , comando Novo objeto ATL ), destaque na categoria Miscelânea no painel esquerdo e, em seguida, clique duas vezes no objeto de caixa de diálogo no painel à direita para adicionar uma caixa de diálogo ao seu projeto ATL. Preencha a caixa de diálogo de Propriedades do ATL objeto Assistente conforme apropriado e clique em OK. O Assistente de objeto ATL adiciona uma classe derivada CAxDialogImpl ao seu projeto e abre o editor de recurso com seu modelo de caixa de diálogo.
&Notanbsp; Se sua caixa de diálogo é derivada CAxDialogImpl , ele pode hospedar controles ActiveX e Windows. Se você não quiser a sobrecarga de suporte a controle ActiveX na sua classe de caixa de diálogo, use CSimpleDialog ou CDialogImpl.
Manipuladores de mensagem e eventos podem ser adicionados à sua classe de caixa de diálogo de ClassView da mesma maneira como para uma classe do MFC. No ClassView, botão direito do mouse a classe e escolha Adicionar manipulador de mensagem do Windows para abrir a caixa de diálogo Nova mensagem de Windows e manipuladores de eventos . Para obter mais informações, consulte adicionando um manipulador de mensagem.
Para abrir a caixa de diálogo Nova mensagem de Windows e manipuladores de eventos do modelo de caixa de diálogo, clique com o botão direito um controle no modelo de caixa de diálogo e escolha o comando de eventos no menu de atalho. Em um projeto do ATL, a classe de caixa de diálogo é realçada na caixa classe ou objeto para manipular ; Considerando que, para um projeto MFC, o controle é realçado.
Implementar uma caixa de diálogo é semelhante à implementação de uma janela. Você derivar uma classe de CAxDialogImpl, CDialogImplou CSimpleDialog e declare um Mapa da mensagem para lidar com mensagens. No entanto, você também deve especificar uma identificação de recurso de modelo de diálogo em sua classe derivada. Sua classe deve ter um membro de dados chamado IDD para armazenar esse valor.
&Notanbsp; Quando você cria uma caixa de diálogo usando o Assistente de objeto ATL, o assistente adiciona automaticamente a IDD Membro como um tipo de enum.
CDialogImpl permite que você implemente uma restrita ou uma caixa de diálogo sem janela restrita que hospeda os controles do Windows. CAxDialogImpl permite que você implemente uma restrita ou uma caixa de diálogo sem janela restrita que hospeda os controles ActiveX e Windows.
Para criar uma caixa de diálogo modal, criar uma instância do seu CDialogImpl-derivado (ou CAxDialogImpl-derivado) de classe e, em seguida, chamar o método DoModal . Para fechar uma caixa de diálogo modal, chame o método de EndDialog de um manipulador de mensagem. Para criar uma caixa de diálogo sem janela restrita, chame o método Create em vez de DoModal. Para destruir uma caixa de diálogo sem janela restrita, chame DestroyWindow.
Se o objeto de caixa de diálogo contém controles ActiveX e você é Manipulação eventos a partir desses controles, você precisará avisar e unadvise todas as interfaces de Controlarar ActiveX. Isso pode ser feito adicionando a seguinte linha de código para o InitDialog função:
AtlAdviseSinkMap (pMyDlg, TRUE)
A unadvise quaisquer controles ActiveX, adicionar a seguinte linha de código para o EndDialog função (ou a função chamada após a cessação do seu objeto de caixa de diálogo):
AtlAdviseSinkMap (pMyDlg, FALSE)
Implementar manipuladores de mensagem da caixa de diálogo como faria os manipuladores em um CWindowImpl-classe derivada. Se não houver um valor de retorno de mensagem específicos, devolvê-lo como um LRESULT . O retornado LRESULT valores são mapeados pelo ATL para manipulação apropriada pelo Gerenciador de caixa de diálogo do Windows. Para obter detalhes, consulte o código-fonte para CDialogImplBaseT::DialogProc em atlwin.h.
Exemplo
A seguinte classe implementa uma caixa de diálogo:
classe CMyDialog: CDialogImpllt pública;CMyDialog >,...
{
público:
enum {IDD = IDD_MYDIALOG};
BEGIN_MSG_MAP(CMyDialog)
MESSAGE_HANDLER (WM_INITDIALOG, OnInitDialog)
END_MSG_MAP()
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
/ / Fazer uma inicialização código
retornar 1;
}
}