Você recebe uma exceção "Não é possível obter a janela manipular" quando você exibir um formulário filho que contém controles de usuário do ActiveX

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 814736
Sintomas
Você cria um formulário do Microsoft Windows (como Form1) e, em seguida, você pode definir a propriedade IsMdiContainer do formulário como True . Você cria um controle de usuário do Microsoft Visual Basic 6.0 e, em seguida, você adiciona o controle de usuário a um Windows form (Form1) no Microsoft Visual Studio .NET ou no Microsoft Visual Studio 2005. Se você criar o formulário do Windows como o formulário pai de outro formulário do Windows que contém controles de usuário, você exibir o formulário filho e em seguida, executar o aplicativo em um computador que executa no sistema operacional Microsoft Windows 98, você receberá a seguinte mensagem de erro:
System.InvalidOperationException: Não é possível obter o identificador de janela para o controle 'AxUserControl1'. Não há suporte para controles ActiveX sem janelas.

Observação Este artigo presume que Visual Basic 6.0 e o Microsoft .NET Framework 1.0 está instalado no computador com o Windows 98.
Causa
Quando você cria um formulário do Windows que contém controles de usuário como um formulário filho de interface de documentos múltiplos (MDI), o formulário do Windows sempre destrói o formulário filho e, em seguida, recria o formulário filho. Formulário do Windows destrói todos os controles no formulário filho e, em seguida, recria os controles. No entanto, o primeiro controle de usuário for destruído, mas não será recriado. O segundo controle de usuário não é destruído ou recriado. Portanto, você receberá o erro quando você exibe o formulário filho, porque o primeiro usuário controle hwnd é NULL.
Como Contornar
Para contornar esse problema, coloque os controles de usuário em um controle Panel . Para fazer isso, execute as seguintes etapas:
  1. Da caixa de ferramentas, arraste um controle Panel para Form1.

    Por padrão, Painel1 é criado.
  2. Mova dois controles de usuário para Panel1.
  3. No menu Build , clique em Build Solution .
  4. Na subpasta bin da pasta de projeto WindowsApplication1 , copie o arquivo WindowsApplication1.exe e, em seguida, cole o arquivo na pasta Setup1 no computador que executa no Windows 98.
Situação
Esse comportamento é por design.
Mais Informações

Passos para reproduzir o problema


  1. Para criar um controle ActiveX do Microsoft Visual Basic, execute essas etapas:
    1. Abra o Visual Basic 6.0.
    2. Na caixa de diálogo New Project , clique em Controle ActiveX e, em seguida, clique em Abrir .

      Por padrão, UserControl1 é criado.
    3. Clique com o botão direito do mouse UserControl1 e, em seguida, clique em Propriedades .
    4. Na janela Properties, defina a propriedade BackColor como marcador .
    5. No menu arquivo , clique em tornar Project1.ocx .
    6. Clique para selecionar um local para salvar seu arquivo de controle no e, em seguida, clique em OK .
  2. Para criar um aplicativo do Windows com o controle de usuário que você criou na etapa 1, execute estas etapas:
    1. No Visual Studio .NET ou no Visual Studio 2005, iniciar um novo Windows aplicativo usando Microsoft Visual Basic. NET, Microsoft Visual Basic 2005 ou Microsoft Visual translation from VPE for Csharp .NET.

      Por padrão, é criado o Form1.
    2. No menu Ferramentas , clique em Customize Toolbox .

      anotações
      • No Microsoft Visual Studio .NET 2003, clique em Adicionar ou remover Toolbox Items no menu Ferramentas .
      • No Microsoft Visual Studio 2005, clique em Choose Toolbox Items no menu Ferramentas .
    3. Clique na guia Componentes COM e, em seguida, clique em Procurar .
    4. Localize o arquivo Project1.ocx que você criou na etapa 1, clique em Project1.ocx e, em seguida, clique em Abrir .
    5. Na caixa de diálogo Customize Toolbox , clique em OK .
    6. Da caixa de ferramentas, arraste UserControl1 para Form1.
    7. Repita a etapa 2f para adicionar outro controle de usuário para o formulário.
    8. No menu Project , clique em Add Windows Form e em seguida, clique em Abrir .

      Por padrão, o Form2 é criado
    9. Clique com o botão direito do mouse no Form2 e em seguida, defina a propriedade IsMdiContainer como True .
    10. Na caixa de ferramentas, arraste um botão de controle para Form2.
    11. Adicione o seguinte código ao manipulador de eventos Button1_Click :

      Visual Basic .NET ou Visual Basic 2005
      Dim b As Form1b = New Form1()'Set Form2 as the parent of Form1.b.MdiParent = Me'Display Form1 when the button is clicked.b.Show()
      Visual translation from VPE for Csharp .NET Code
      Form1 b= new Form1();//Set Form2 as the parent of Form1.b.MdiParent=this;//Display Form1 when the button is clicked.b.Show();
      Observação adicionar o código a seguir após Button1_Click manipulador de eventos no Visual translation from VPE for Csharp. NET:
      [STAThread]static void Main() {     Application.Run(new Form2());}
    12. No Solution Explorer, clique com o botão direito do mouse WindowsApplication1 e, em seguida, clique em Propriedades .
    13. Em páginas de propriedade WindowsApplication1 , clique para selecionar Form2 na lista Startup object e, em seguida, clique em OK .
    14. No menu Build , clique em Build Solution .
    15. Crie uma pasta Setup1 no seu computador.
    16. Da subpasta bin na sua pasta de projeto WindowsApplication1 , copie o arquivo AxInterop.Project1.dll, copie o arquivo Interop.Project1.dll e copie o arquivo WindowsApplication1.exe para a pasta de instalação .
    17. Do local você onde você salvou o controle de usuário Visual Basic 6.0 que você criou, copie o arquivo Project1.ocx para a pasta Setup1 .
    18. Copie a pasta Setup1 para um computador que executa no sistema operacional Windows 98.
    19. No computador que executa no sistema operacional Windows 98, clique em Iniciar e, em seguida, clique em Executar .
    20. Digite cmd na caixa de texto Abrir e, em seguida, pressione a tecla ENTER.
    21. Para registrar o controle, execute o seguinte comando no prompt de comando: regsvr32
      regsvr32 <project1.ocx file path on your local computer>
    22. Clique com o botão direito do mouse WindowsApplication1 , clique em Abrir e, em seguida, clique em Button1 .

      Você recebe a exceção mencionada na seção "Sintomas" deste artigo.
Referências
Para obter mais informações, visite o seguinte site da MSDN:

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 814736 - Última Revisão: 12/06/2006 23:18:59 - Revisão: 2.7

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual Basic 4.0 Enterprise Edition, Microsoft Windows 98 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbhotfixserver kbqfe kbsetup kbdeployment kbwindowsforms kbmdi kbctrl kbcontrol kbprb KB814736 KbMtpt
Comentários