Exemplo do DLGCBR32: Demonstra a adição de uma BAR de ferramentas e BAR de status a caixas de diálogo
O exemplo DLGCBR32 demonstra como adicionar um BAR de status e uma BAR de ferramentas a uma caixa de diálogo.Além disso, ele mostra várias técnicas relacionadas ao uso de uma caixa de diálogo sem janela restrita sistema autônomo a janela principal de um aplicativo MFC.
Em um aplicativo MFC, você pode anexar barras de controle, sistema autônomo barras de status e sistema autônomo barras de ferramentas para uma janela de quadro.No entanto, para muitos aplicativos uma interface de usuário baseada em caixa de diálogo simples é suficiente.MFC não fornece suporte interno para adicionar barras de controle a caixas de diálogo.
Observação de segurança: |
---|
Este código de exemplo é fornecido para ilustrar um conceito e não deve ser usado em aplicativos ou sites da Web, pois ele não pode ilustrar sistema autônomo práticas de codificação mais seguras.Microsoft sistema autônomo sumes nenhuma responsabilidade por danos incidentais ou conseqüenciais deve o código de exemplo ser usado para fins diferentes de sistema autônomo se destina. |
Para obter exemplos e instruções para instalá-los:
Sobre o Visual Studio Ajuda menu, clicar Exemplos.
Para obter mais informações, consulte Localizando arquivos de exemplo.
A versão mais recente e a lista completa das Exemplos está disponível online a partir de O Visual Studio 2008 Exemplos página.
Você também pode localizar exemplos no disco rígido do seu computador.Por padrão, exemplos e um arquivo Leiame são copiados para uma pasta sob \programa Files\Visual Studio 9.0\Samples\.Para edições Express do Visual Studio, todos os exemplos estão localizados online.
Criando e executando o exemplo
Para criar e executar a amostra DLGCBR32
Abra a solução Dlgcbr32.sln.
Sobre o Compilação menu, clicar Compilação.
No menu Debug, clique em Start Without Debugging.
Adicionando um BAR de controle para uma caixa de diálogo
Para adicionar um BAR de controle para uma caixa de diálogo, crie o BAR de controle sistema autônomo de costume e verifique o espaço para o BAR de controle dentro da área de cliente da caixa de diálogo.Para o BAR de controle para funcionar corretamente, a caixa de diálogo deverá duplicar algumas das funcionalidades de uma janela de quadro.Se você desejar ON_UPDATE_COMMAND_UI manipuladores para trabalhar para BAR de controle s, você também precisa derivar novo BAR de controle classes e o identificador a WM_IDLEUPDATECMDUI mensagem.Se sua caixa de diálogo não estiver na janela principal de seu aplicativo, você também precisará modificar sua janela de quadro pai para passar o WM_IDLEUPDATECMDUI mensagem para barras de controle da caixa de diálogo.
Para liberar espaço para um BAR de controle dentro da área da caixa de diálogo do cliente, execute essas etapas em OnInitDialog função:
Crie as barras de controle.Descobrir quanto espaço o controle de barras levará usando o reposQuery opção de RepositionBars.
CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);
Mover os controles na sua caixa de diálogo para o espaço usado por barras de controle na parte superior ou esquerda da área de cliente.Se sua caixa de diálogo contém um menu, você também precisará conta para o espaço usado por do menu.
CPoint ptOffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top); CRect rcChild; CWnd* pwndChild = GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild, FALSE); pwndChild = pwndChild->GetNextWindow(); }
Aumente as dimensões de janela de caixa de diálogo pela quantidade de espaço usado por barras de controle.
CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE);
Posicionar as barras de controle usando RepositionBars.
Para atualizar o primeiro painel de um BAR de status com texto de item de menu, você deve manipular WM_MENUSELECT, WM_ENTERIDLE, WM_SETMESSAGESTRING, and WM_POPMESSAGESTRING na sua classe de caixa de diálogo.Você precisará duplicar a funcionalidade do CFrameWnd manipuladores para essas mensagens. Consulte o CModelessMain classe no programa de exemplo para obter exemplos de como esses manipuladores de mensagens.
Para exibir dicas de ferramentas para os botões da barra de ferramentas, é necessário manipular o TTN_NEEDTEXTW and TTN_NEEDTEXTA notificações.
Para permitir que ON_UPDATE_COMMAND_UI manipuladores para trabalhar para outros painéis da BAR de status e botões da BAR de ferramentas, você deve derivar novo BAR de controle classes e implementar um manipulador de mensagens WM_IDLEUPDATECMDUI.Isso é necessário porque o padrão de controle BAR implementações de OnUpdateCmdUI Suponha que a janela pai é uma janela de quadro. No entanto, OnUpdateCmdUI não faz nada, mas passar o ponteiro de janela pai para uma função que requer apenas uma CCmdTarget ponteiro. Portanto, você pode dizer temporariamente OnUpdateCmdUI que o ponteiro de janela pai você está dando a ele é um CFrameWnd ponteiro para atender aos requisitos do compilador. Por exemplo:
LRESULT CDlgToolBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM lParam)
{
if (IsWindowVisible())
{
CFrameWnd* pParent = (CFrameWnd*)GetParent();
if (pParent)
OnUpdateCmdUI(pParent, (BOOL)wParam);
}
return OL;
}
Para passar WM_IDLEUPDATECMDUI mensagens para as caixas de diálogo seja a janela principal, salvar diálogo ponteiros em sua classe de janela de quadro e criar um WM_IDLEUPDATECMDUI manipulador nessa classe.O manipulador deve enviar o WM_IDLEUPDATECMDUI mensagem para as janelas de filho de caixa de diálogo usando CWnd::SendMessageToDescendants. Em seguida, execute o padrão de processamento do mensagem dentro da janela do quadro.
Observação: |
---|
Alguns exemplos, sistema autônomo esta, não foram modificados para refletir sistema autônomo alterações nos assistentes, bibliotecas e compilador Visual C++, mas ainda Demonstre sistema autônomo concluir a tarefa desejada. |