Escolar Documentos
Profissional Documentos
Cultura Documentos
Windows Forms
Guia de introdução ao Windows Forms
Visão geral dos Windows Forms
Criando um novo formulário do Windows Forms
Como: criar um aplicativo do Windows Forms na linha de comando
Coordenadas do Windows Forms
Criando manipuladores de eventos no Windows Forms
Visão geral sobre eventos
Visão geral de manipuladores de eventos
Como: criar manipuladores de eventos em tempo de execução para o Windows
Forms
Como: conectar vários eventos a um único manipulador de eventos no Windows
Forms
Ordem dos eventos em formulários do Windows Forms
Ajustar o tamanho e a escala do Windows Forms
Como: redimensionar o Windows Forms
Dimensionamento automático no Windows Forms
Como: responder a alterações no esquema de fontes em um aplicativo do
Windows Forms
Suporte a alto a DPI no Windows Forms
Alterando a aparência do Windows Forms
Como: alterar as bordas do Windows Forms
Controles de Windows Forms
Entrada do usuário no Windows Forms
Entrada do usuário em um aplicativo do Windows Forms
Entrada do teclado em um aplicativo do Windows Forms
Como a entrada do teclado funciona
Usando eventos do teclado
Como: modificar a entrada do teclado para um controle padrão
Como: determinar qual tecla modificadora foi pressionada
Como: manipular a entrada do teclado no nível do formulário
Entrada do mouse em um aplicativo do Windows Forms
Como a entrada do mouse funciona no Windows Forms
Eventos do mouse no Windows Forms
Como: distinguir entre cliques e cliques duplos
Ponteiros do mouse no Windows Forms
Captura do mouse no Windows Forms
Funcionalidade de arrastar e soltar no Windows Forms
Como: simular eventos de mouse e teclado no código
Como: manipular eventos de entrada do usuário em controles do Windows Forms
Validação da entrada do usuário no Windows Forms
Caixas de diálogo no Windows Forms
Como: exibir caixas de diálogo para o Windows Forms
Associação de dados do Windows Forms
Associação de dados e o Windows Forms
Fontes de dados com suporte do Windows Forms
Interfaces relacionadas à associação de dados
Notificação de alteração na associação de dados do Windows Forms
Como: aplicar o padrão PropertyNameChanged
Como: criar um controle associado e formatar os dados exibidos
Como: criar um controle associado simples em um Windows Form
Como: assegurar que vários controles associados à mesma fonte de dados
permaneçam sincronizados
Como: assegurar que a linha selecionada em uma tabela filho permaneça na posição
correta
Como: implementar a interface IListSource
Como: implementar a interface INotifyPropertyChanged
Como: implementar a interface ITypedList
Como: navegar por dados nos Windows Forms
Segurança do Windows Forms
Visão geral da Segurança do Windows Forms
Acesso mais seguro a arquivos e dados no Windows Forms
Impressão mais segura no Windows Forms
Considerações adicionais sobre Segurança do Windows Forms
Implantação do ClickOnce para o Windows Forms
Aprimoramentos de acessibilidade com o .NET Core 3.0
Como: acessar coleções indexadas por chave no Windows Forms
Aprimorando aplicativos do Windows Forms
Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
Como os formulários são a unidade base do seu aplicativo, é essencial dedicar certo planejamento às suas funções
e design. Um formulário é basicamente uma tela em branco que você, como desenvolvedor, aprimora com
controles para criar uma interface do usuário e com código para manipular os dados. Para esse fim, o Visual Studio
fornece um ambiente de desenvolvimento integrado (IDE) para auxiliar na escrita de código, bem como um
conjunto de controle rico escrito com o .NET Framework. Complementando a funcionalidade desses controles com
seu código, você poderá desenvolver as soluções que precisa com rapidez e facilidade.
Nesta seção
Introdução ao Windows Forms
Fornece links para tópicos sobre como aproveitar a capacidade dos Windows Forms para exibir dados, manipular
entradas do usuário e implantar seus aplicativos com facilidade e com uma segurança mais robusta.
Aprimorando aplicativos do Windows Forms
Fornece links para tópicos sobre como aprimorar seu Windows Forms com uma variedade de recursos.
Seções Relacionadas
Controles dos Windows Forms
Contém links para tópicos que descrevem os controles de Windows Forms e mostram como implementá-los.
Associação de dados do Windows Forms
Contém links para tópicos que descrevem a arquitetura de associação de dados dos Windows Forms.
Visão geral de elementos gráficos
Discute como criar elementos gráficos, desenhar texto e manipular imagens gráficas como objetos usando a
implementação avançada da interface de design gráfico do Windows.
Segurança e implantação do ClickOnce
Discute os princípios da implantação do ClickOnce.
Diferenças de programação entre o Windows Forms e o MFC
Discute as diferenças entre aplicativos MFC e o Windows Forms.
Acessando dados no Visual Studio
Discute os aspectos da incorporação da funcionalidade de acesso a dados nos seus aplicativos.
Aplicativos dos Windows Forms
Discute o processo de depuração para aplicativos criados com o modelo de projeto de Aplicativos do Windows,
bem como alterar as configurações de Depuração e Versão.
Primeira olhada na implantação no Visual Studio
Descreve o processo pelo qual você distribui um componente ou aplicativo concluído para ser instalado em outros
computadores.
Compilando aplicativos de console
Descreve as noções básicas de criação de um aplicativo de console usando a classe Console.
Guia de introdução ao Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
Com o Windows Forms você pode criar aplicativos potentes baseados em Windows. Os tópicos a seguir mostram
a fundo como aproveitar a capacidade dos Windows Forms para exibir dados, manipular entradas do usuário e
implantar seus aplicativos com facilidade e maior segurança.
Nesta seção
Visão geral dos Windows Forms
Contém uma visão geral dos aplicativos Windows Forms e smart client.
Criando um novo Windows Form
Contém links para tópicos que descrevem conceitos básicos para criar aplicativos nos Windows Forms.
Criando manipuladores de eventos no Windows Forms
Contém links para tópicos que descrevem como criar manipuladores de eventos nos Windows Forms.
Ajustando o tamanho e a escala dos Windows Forms
Contém links para tópicos que descrevem como ajustar o tamanho e a escala dos Windows Forms.
Alterando a aparência dos Windows Forms
Contém links para tópicos que mostram como mudar a aparência dos aplicativos dos Windows Forms.
Controles dos Windows Forms
Contém links para tópicos que descrevem e mostram como usar Windows Forms controles e componentes do.
Entrada do usuário no Windows Forms
Contém links para tópicos que descrevem e mostram como administrar entradas do usuário nos aplicativos dos
Windows Forms.
Caixas de diálogo nos Windows Forms
Contém links para tópicos que descrevem as diferentes caixas de diálogos para uso nos Windows Forms.
Associação de dados do Windows Forms
Contém links para tópicos que descrevem a arquitetura de vinculação de dados dos Windows Forms e como usá-
la nos aplicativos dos Windows Forms.
Segurança do Windows Forms
Contém links para tópicos que descrevem como compilar aplicativos para Windows Forms com segurança
reforçada.
Implantação do ClickOnce para Windows Forms
Contém links para tópicos que descrevem como implantar facilmente aplicativos para Windows Forms.
Como acessar coleções indexadas por chave nos Windows Forms
Demonstra como acessar coleções com chaves ao invés de índices.
Seções Relacionadas
Aprimorando aplicativos do Windows Forms
Contém links para tópicos que descrevem conceitos mais avançados para criar aplicativos para Windows Forms.
Visão geral de Windows Forms
03/02/2020 • 14 minutes to read • Edit Online
A visão geral a seguir descreve as vantagens dos aplicativos cliente inteligentes, os principais recursos de
programação dos Windows Forms e como você pode usar o Windows Forms para criar clientes inteligentes que
atendem às necessidades de empresas e usuários finais de hoje.
Usando o controle de ToolStrip Como criar um ToolStrip básico com itens padrão usando o
designer
Usando o componente BindingSource Como associar controles dos Windows Forms ao componente
BindingSource usando o designer
Trabalhando com fontes de dados ADO.NET Como classificar e filtrar dados ADO.NET com o componente
BindingSource dos Windows Forms
Usando a janela de Fontes de Dados Associando controles do Windows Forms a dados no Visual
Studio
Implantando um aplicativo usando o ClickOnce Como publicar um aplicativo ClickOnce usando o Assistente
de Publicação
Atualizando uma implantação do ClickOnce Como gerenciar atualizações para um aplicativo ClickOnce
Imprimindo o conteúdo de um formulário Como Imprimir Elementos Gráficos nos Windows Forms
Saiba mais sobre a segurança dos Windows Forms Visão geral da segurança dos Windows Forms
Consulte também
Introdução ao Windows Forms
Criando um novo Windows Form
Visão geral do controle ToolStrip
Visão geral do controle DataGridView
Visão geral do componente BindingSource
Visão Geral das Configurações do Aplicativo
Segurança e implantação do ClickOnce
Criando um novo formulário do Windows Forms
23/10/2019 • 2 minutes to read • Edit Online
Este tópico contém links para tópicos que descrevem como criar seu primeiro aplicativo de formulários do
Windows. Além disso, os tópicos nesta seção apresentam algumas das vocabulário básico e diretrizes que você
deve compreender quando você começa a criar um aplicativo Windows Forms. Para saber mais sobre aplicativos
do Windows Forms, os controles que você pode usar neles, eventos e manipulação de eventos e como lidar com a
entrada do usuário, consulte a lista de tópicos relacionados.
Nesta seção
Coordenadas dos formulários do Windows.
Descreve as coordenadas de cliente e da tela.
Como: Criar um aplicativo de formulários do Windows da linha de comando
Descreve como criar um formulário básico do Windows e compilá-lo na linha de comando.
Referência
Form
Descreve essa classe e contém links para todos os seus membros.
Control
Descreve essa classe e contém links para todos os seus membros.
Seções relacionadas
Manipulando a entrada do usuário
Contém links para tópicos que discutem a entrada do usuário e como tratá-la em aplicativos de formulários do
Windows.
Criando manipuladores de eventos no Windows Forms
Contém links para tópicos que descrevem como manipular eventos em aplicativos do Windows Forms.
Alterando a aparência dos Windows Forms
Contém links para tópicos que mostram como mudar a aparência dos aplicativos dos Windows Forms.
Controles dos Windows Forms por função
Contém links para tópicos que descrevem os controles que você pode usar em aplicativos do Windows Forms.
Como: Criar um aplicativo do Windows Forms a
partir da linha de comando
20/03/2020 • 6 minutes to read • Edit Online
Os procedimentos a seguir descrevem as etapas básicas que devem ser concluídas para criar e executar um
aplicativo do Windows Forms na linha de comando. Há um suporte abrangente para esses procedimentos no
Visual Studio. Veja também o Passo a Passo: Hospedando um controle de formulários do Windows no WPF.
Procedimento
Criar o formulário
1. Em um arquivo de código Imports using vazio, digite as seguintes declarações ou instruções:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
public Form1() {}
End Sub
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
End Sub
End Class
-or-
End Sub
Exemplo
O exemplo de código a seguir é o exemplo completo dos procedimentos anteriores:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace FormWithButton
{
public class Form1 : Form
{
public Button button1;
public Form1()
{
button1 = new Button();
button1.Size = new Size(40, 40);
button1.Location = new Point(30, 30);
button1.Text = "Click me";
this.Controls.Add(button1);
button1.Click += new EventHandler(button1_Click);
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Hello World");
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
}
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
End Sub
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
End Class
Confira também
Form
Control
Alterando a aparência dos Windows Forms
Aprimorando aplicativos do Windows Forms
Introdução ao Windows Forms
Coordenadas do Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
O sistema de coordenadas para um Windows Form é baseado nas coordenadas de dispositivo e a unidade básica
de medida de desenho no Windows Forms é a unidade do dispositivo (normalmente, o pixel). Pontos na tela são
descritos por pares de coordenadas x e y, com as coordenadas x aumentando para a direita e coordenadas y
aumentando de cima para baixo. O local de origem, em relação à tela, variará dependendo se você está
especificando as coordenadas de tela ou de cliente.
Coordenadas de tela
Um Aplicativo do Windows Forms especifica a posição de uma janela na tela em coordenadas de tela. Para
coordenadas de tela, a origem é o canto superior esquerdo da tela. A posição completa de uma janela geralmente
é descrita por uma estrutura de Rectangle que contém as coordenadas de tela de dois pontos que definem os
cantos superior esquerdo e inferior direito da janela.
Coordenadas de cliente
Um Aplicativo do Windows Forms especifica a posição dos pontos em um formulário ou controle usando
coordenadas de cliente. A origem das coordenadas de cliente é o canto superior esquerdo da área de cliente do
controle ou formulário. Coordenadas de cliente garantem que um aplicativo pode usar valores de coordenadas
consistentes ao desenhar em um formulário ou controle, independentemente da posição do formulário ou
controle na tela.
As dimensões da área do cliente também são descritas por uma estrutura de Rectangle que contém as
coordenadas do cliente para a área. Em todos os casos, a coordenada superior esquerda do retângulo está incluída
na área de cliente, enquanto a coordenada inferior direita é excluída. Operações de elementos gráficos não incluem
bordas direita e inferiores de uma área de cliente. Por exemplo, o método FillRectangle preencherá a borda direita
e inferior do retângulo especificado, mas não incluirá essas bordas.
Consulte também
PointToClient
PointToScreen
Criando manipuladores de eventos no Windows
Forms
03/02/2020 • 2 minutes to read • Edit Online
Um manipulador de eventos é um procedimento no seu código que determina quais ações são executadas
quando ocorre um evento, por exemplo, quando o usuário clica em um botão ou uma fila de mensagens recebe
uma mensagem. Quando um evento é gerado, o manipulador ou manipuladores de eventos que receberão o
evento são executados. Os eventos podem ser atribuídos a vários manipuladores e os métodos que manipulam
os eventos particulares podem ser alterados dinamicamente. Você também pode usar o Designer de Formulários
do Windows no Visual Studio para criar manipuladores de eventos.
Nesta seção
Visão geral de eventos
Explica o modelo de evento e a função das classes delegate.
Visão geral do manipulador de eventos
Descreve como manipular eventos.
Como criar manipuladores de eventos em tempo de execução para Windows Forms
Fornece instruções para responder a eventos de sistema ou de usuário de forma dinâmica.
Como: conectar vários eventos a um único manipulador de eventos no Windows Forms
Fornece instruções para atribuir a mesma funcionalidade a vários controles por meio de eventos.
Ordem de eventos em Windows Forms
Descreve a ordem em que os eventos são gerados em controles Windows Forms.
Como criar manipuladores de eventos usando o designer Descreve como usar o Designer de Formulários do
Windows para criar manipuladores de eventos.
Seções Relacionadas
Eventos
Fornece links para tópicos sobre como manipular e gerar eventos usando o .NET Framework.
Solucionando problemas de manipuladores de eventos herdados no Visual Basic
Lista problemas comuns que ocorrem com os manipuladores de eventos em componentes herdados.
Visão geral sobre eventos (Windows Forms)
03/02/2020 • 6 minutes to read • Edit Online
Um evento é uma ação a qual você pode responder ou "manipular", no código. Os eventos podem ser gerados
por uma ação do usuário, como o clicar do mouse ou pressionar de uma tecla, pelo código de programa ou pelo
sistema.
Os aplicativos controlados por eventos executam código em resposta a um evento. Cada formulário e controle
expõe um conjunto predefinido de eventos com base nos quais você pode programar. Se um desses eventos
ocorre e não há código no manipulador de evento associado, esse código é invocado.
Os tipos de eventos gerados por um objeto variam, mas muitos tipos são comuns à maioria dos controles. Por
exemplo, a maioria dos objetos lidará com um evento Click. Se um usuário clicar em um formulário, o código no
manipulador de eventos Click do formulário é executado.
NOTE
Muitos eventos ocorrem com outros eventos. Por exemplo, enquanto o evento DoubleClick ocorre, os eventos
MouseDown, MouseUp e Click ocorrem.
Para obter informações sobre como gerar e consumir um evento, consulte eventos.
Consulte também
Criando manipuladores de eventos no Windows Forms
Visão geral de manipuladores de eventos
Visão geral de manipuladores de eventos (Windows
Forms)
20/03/2020 • 2 minutes to read • Edit Online
Um manipulador de eventos é um método que está associado a um evento. Quando o evento é gerado, o código
no manipulador de eventos é executado. Cada manipulador de eventos fornece dois parâmetros que permitem
manipular o evento corretamente. O exemplo a seguir mostra Button um Click manipulador de eventos para um
evento de controle.
End Sub
private:
void button1_Click(System::Object ^ sender,
System::EventArgs ^ e)
{
No primeiro parâmetro, sender , fornece uma referência ao objeto que gerou o evento. No exemplo acima, o
segundo parâmetro, e , passa um objeto específico para o evento que está sendo manipulado. Consultando as
propriedades do objeto (e, às vezes, seus métodos), é possível obter informações como o local do mouse para
eventos de mouse ou dados que estão sendo transferidos em eventos do tipo "arrastar e soltar".
Normalmente, cada evento produz um manipulador de eventos com um tipo de objeto de evento diferente para
o segundo parâmetro. Alguns manipuladores de eventos, MouseDown MouseUp como aqueles para os eventos e
eventos, têm o mesmo tipo de objeto para o segundo parâmetro. Para esses tipos de eventos, você pode usar o
mesmo manipulador de eventos para manipular ambos os eventos.
Você também pode usar o mesmo manipulador de eventos para manipular o mesmo evento em controles
diferentes. Por exemplo, se você RadioButton tiver um grupo de controles em um formulário, você pode criar um
único manipulador de eventos para o evento e ter o Click evento de Click cada controle vinculado ao
manipulador de eventos único. Para obter mais informações, consulte Como conectar vários eventos a um único
manipulador de eventos nos Windows Forms.
Confira também
Criando manipuladores de eventos no Windows Forms
Visão geral de eventos
Como criar manipuladores de eventos em tempo de
execução para formulários do Windows Forms
03/02/2020 • 2 minutes to read • Edit Online
Além de criar eventos usando o Designer de Formulários do Windows no Visual Studio, você também pode criar
um manipulador de eventos em tempo de execução. Essa ação permite que você conecte manipuladores de
eventos com base em condições no código no tempo de execução em vez de conectá-los quando o programa
inicia.
private:
void button1_Click(System::Object ^ sender,
System::EventArgs ^ e)
{
// Add event handler code here.
}
Consulte também
Criando manipuladores de eventos no Windows Forms
Visão geral de manipuladores de eventos
Solucionando problemas de manipuladores de eventos herdados no Visual Basic
Como conectar vários eventos a um único
manipulador de eventos no Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
No projeto do seu aplicativo, talvez seja necessário usar um único manipulador de eventos para vários eventos ou
fazer com que vários eventos executem o mesmo procedimento. Por exemplo, fazer um comando de menu gerar
o mesmo evento que um botão no seu formulário geralmente representará uma grande economia de tempo se
eles expuserem a mesma funcionalidade. Você pode fazer isso usando a exibição Eventos da janela Propriedades
em C# ou usando a palavra-chave Handles e as caixas suspensas Nome de Classe e Nome do Método no
Editor de Código do Visual Basic.
Conectar vários eventos a um único manipulador de eventos no Visual Basic
1. Clique com o botão direito do mouse do formulário e escolha Exibir código .
2. Na caixa suspensa Nome de Classe , selecione um dos controles que você deseja que o manipulador de
eventos trate.
3. Na caixa suspensa Nome de Método , selecione um dos eventos que você deseja que o manipulador de
eventos trate.
4. O Editor de Código insere o manipulador de eventos apropriado e posiciona o ponto de inserção dentro do
método. No exemplo a seguir, é o evento Click para o controle Button.
5. Acrescente os outros eventos que você deseja que sejam tratados à cláusula Handles .
A ordem na qual os eventos são gerados em aplicativos do Windows Forms é de interesse específico para os
desenvolvedores preocupados com tratamento de cada um desses eventos sucessivamente. Quando uma situação
exigir tratamento meticuloso de eventos, como quando você estiver redesenhando partes do formulário, será
necessário um reconhecimento da ordem exata na qual os eventos são gerados em tempo de execução. Este tópico
fornece alguns detalhes sobre a ordem dos eventos durante vários estágios importantes no tempo de vida de
aplicativos e controles. Para obter detalhes específicos sobre a ordem de eventos de entrada do mouse, consulte
Eventos de mouse no Windows Forms. Para obter uma visão geral de eventos no Windows Forms, consulte Visão
geral de eventos. Para obter detalhes sobre a composição de manipuladores de eventos, consulte Visão geral de
manipuladores de eventos.
NOTE
Visual Basic 2005 inclui eventos de aplicativo adicionais, como WindowsFormsApplicationBase.Startup e
WindowsFormsApplicationBase.Shutdown.
Eventos de foco e validação
Quando você altera o foco usando o teclado (guia, SHIFT + TAB e assim por diante), chamando os métodos Select
ou SelectNextControl ou definindo a propriedade ActiveControl como o formulário atual, os eventos de foco da
classe Control ocorrem na seguinte ordem:
Enter
GotFocus
Leave
Validating
Validated
LostFocus
Quando você altera o foco usando o mouse ou chamando o método Focus, os eventos de foco da classe Control
ocorrem na seguinte ordem:
Enter
GotFocus
LostFocus
Leave
Validating
Validated
Consulte também
Criando manipuladores de eventos no Windows Forms
Ajustando o tamanho e a escala dos Formulários do
Windows
20/03/2020 • 2 minutes to read • Edit Online
Este tópico fornece links para informações sobre o redimensionamento de Formulários do Windows.
Nesta seção
Como redimensionar o Windows Forms
Fornece instruções para especificar o tamanho dos Formulários do Windows.
Dimensionamento automático em formulários do Windows
Discute como o dimensionamento automático permite que um formulário e seus controles sejam exibidos
adequadamente entre as máquinas.
Suporte a DPI alto em formulários windows Discute o suporte do Windows Forms para Alto DPI e
dimensionamento dinâmico.
Referência
Size
Descreve essa classe e tem links para todos os seus membros.
TableLayoutPanel
Descreve essa classe e tem links para todos os seus membros.
FlowLayoutPanel
Descreve essa classe e tem links para todos os seus membros.
Seções relacionadas
Alterando a aparência dos Formulários do Windows
Fornece links para tópicos descrevendo outras maneiras de alterar a aparência dos Formulários do Windows.
Como redimensionar formulários do Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
Você pode especificar o tamanho do seu Windows Forms de várias maneiras. Você pode alterar a altura e a largura
do formulário programaticamente definindo um novo valor para a propriedade Size ou ajustar as propriedades
Height ou Width individualmente. Se você estiver usando o Visual Studio, poderá alterar o tamanho usando o
Designer de Formulários do Windows. Consulte também Como redimensionar Windows Forms usando o
Designer.
Form1.Width = 300
Form1.Width = 300;
Form1->Width = 300;
-ou-
Altere Width ou Height definindo a propriedade Size.
No entanto, como mostra o exemplo de código a seguir, essa abordagem é mais complicada do que apenas definir
Width ou Height Propriedades.
Form1.Width += 200
Form1.Width += 200;
Form1->Width += 200;
Cau t i on
Sempre use a propriedade Height ou Width para alterar uma dimensão de um formulário, a menos que você esteja
definindo dimensões de altura e largura ao mesmo tempo definindo a propriedade Size como uma nova estrutura
de Size. A propriedade Size retorna uma estrutura de Size, que é um tipo de valor. Não é possível atribuir um novo
valor para a propriedade de um tipo de valor. Portanto, o código a seguir não será compilado.
Consulte também
Introdução ao Windows Forms
Aprimorando aplicativos do Windows Forms
Dimensionamento automático no Windows Forms
03/02/2020 • 13 minutes to read • Edit Online
O dimensionamento automático permite que um formulário e seus controles, projetados em um computador com
determinada resolução de vídeo ou fonte do sistema, sejam exibidos adequadamente em outra máquina com uma
resolução de vídeo diferente ou fonte do sistema. Garante que o formulário e seus controles sejam
redimensionados de forma inteligente para serem consistentes com o Windows nativo e outros aplicativos nas
máquinas dos usuários e de outros desenvolvedores. O suporte do .NET Framework para dimensionamento
automático e estilos visuais permite que .NET Framework aplicativos mantenham uma aparência consistente em
comparação com os aplicativos nativos do Windows na máquina de cada usuário.
Na maior parte, o dimensionamento automático funciona conforme o esperado no .NET Framework versão 2,0 e
posterior. No entanto, as alterações no esquema de fontes podem ser problemáticas. Para obter um exemplo de
como resolver isso, consulte como responder a alterações de esquema de fonte em um aplicativo Windows Forms.
NOTE
Você pode excluir com segurança as referências a esses membros ao atualizar seu código herdado para a versão .NET
Framework 2,0.
Não há suporte para mesclagens arbitrárias de DPI e modos de dimensionamento de fonte. Embora você possa
dimensionar um controle de usuário usando um modo (por exemplo, DPI) e colocá-lo em um formulário usando
outro modo (fonte) sem problemas, mas misturar um formulário base em um modo e um formulário derivado em
outro pode levar a resultados inesperados.
Dimensionamento automático em ação
O Windows Forms agora usa a seguinte lógica para dimensionar automaticamente os formulários e seus
conteúdos:
1. Em tempo de design, cada ContainerControl registra o modo de dimensionamento e a resolução atual no
AutoScaleMode e AutoScaleDimensions, respectivamente.
2. Em tempo de execução, a resolução real é armazenada na propriedade CurrentAutoScaleDimensions. A
propriedade AutoScaleFactor calcula dinamicamente a taxa entre a resolução de escala de tempo de
execução e de design.
3. Quando o formulário for carregado, se os valores de CurrentAutoScaleDimensions e AutoScaleDimensions
forem diferentes, o método PerformAutoScale será chamado para dimensionar o controle e seus filhos. Esse
método suspende o layout e chama o método Scale para executar o dimensionamento real. Posteriormente,
o valor de AutoScaleDimensions é atualizado para evitar o dimensionamento progressivo.
4. PerformAutoScale também é invocada automaticamente nas seguintes situações:
Em resposta ao evento OnFontChanged se o modo de dimensionamento for Font.
Quando o layout do controle de contêiner é retomado e uma alteração é detectada nas propriedades
AutoScaleDimensions ou AutoScaleMode.
Como implícito acima, quando um ContainerControl pai está sendo dimensionado. Cada controle de
contêiner é responsável por dimensionar seus filhos usando seus próprios fatores de
dimensionamento e não aquele de seu contêiner pai.
5. Os controles filho podem modificar seu comportamento de dimensionamento por vários meios:
A propriedade ScaleChildren pode ser substituída para determinar se os controles filho devem ser
dimensionados ou não.
O método GetScaledBounds pode ser substituído para ajustar os limites para os quais o controle é
dimensionado, mas não a lógica de dimensionamento.
O método ScaleControl pode ser substituído para alterar a lógica de dimensionamento do controle
atual.
Consulte também
AutoScaleMode
Scale
PerformAutoScale
AutoScaleDimensions
Renderizando controles com estilos visuais
Como Melhorar o Desempenho Evitando a Colocação em Escala Automática
Como responder a alterações no esquema de fontes
em um aplicativo do Windows Forms
03/02/2020 • 5 minutes to read • Edit Online
Nos sistemas operacionais Windows, um usuário pode alterar as configurações de fonte de todo o sistema para
tornar a fonte padrão maior ou menor. A alteração dessas configurações de fonte é essencial para usuários com
deficiência visual, que requerem letras maiores para ler o texto em suas telas. É possível ajustar seu aplicativo do
Windows Forms para reagir a essas alterações aumentando ou diminuindo o tamanho do formulário e todo o
texto contido nele sempre que o esquema de fontes for alterado. Se desejar que seu formulário acomode as
alterações em tamanhos de fonte dinamicamente, será possível adicionar código a ele.
Normalmente, a fonte padrão usada pelo Windows Forms é a fonte retornada pela chamada de namespace de
Microsoft.Win32 para GetStockObject(DEFAULT_GUI_FONT) . A fonte retornada por essa chamada muda apenas
quando a resolução da tela é alterada. Conforme mostrado no procedimento a seguir, seu código deve alterar a
fonte padrão para IconTitleFont para responder às alterações no tamanho da fonte.
Utilizar a fonte da área de trabalho e responder a alterações no esquema de fontes
1. Crie seu formulário e adicione os controles desejados a ele. Para obter mais informações, consulte Como
criar um aplicativo do Windows Forms na linha de comando e Controles para Uso no Windows Forms.
2. Adicione uma referência ao namespace Microsoft.Win32 ao seu código.
using Microsoft.Win32;
Imports Microsoft.Win32
3. Adicione o seguinte código ao construtor do formulário para ligar manipuladores de eventos necessários e
para alterar a fonte padrão em uso do formulário.
this.Font = SystemFonts.IconTitleFont;
SystemEvents.UserPreferenceChanged += new
UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
4. Implemente um manipulador para o evento UserPreferenceChanged que faz com que o formulário seja
dimensionado automaticamente quando a categoria de Window é alterada.
void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category == UserPreferenceCategory.Window)
{
this.Font = SystemFonts.IconTitleFont;
}
}
5. Por fim, implemente um manipulador para o evento FormClosing que desanexa o manipulador de eventos
UserPreferenceChanged.
IMPORTANT
Uma falha na inclusão desse código fará com que ocorra vazamento de memória no aplicativo.
{1>Exemplo<1}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
namespace WinFormsAutoScaling
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Font = SystemFonts.IconTitleFont;
SystemEvents.UserPreferenceChanged += new
UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}
Imports Microsoft.Win32
Consulte também
PerformAutoScale
Dimensionamento automático no Windows Forms
Suporte a alto DPI no Windows Forms
03/02/2020 • 7 minutes to read • Edit Online
A partir do .NET Framework 4,7, Windows Forms inclui aprimoramentos para cenários comuns de dpi e DPI
dinâmicos. Elas incluem:
Melhorias no dimensionamento e layout de vários controles de Windows Forms, como o controle de
MonthCalendar e o controle de CheckedListBox.
Escala de passagem única. No .NET Framework 4,6 e versões anteriores, o dimensionamento foi realizado
por meio de várias passagens, o que fazia com que alguns controles fosse escalado mais do que o
necessário.
Suporte para cenários de DPI dinâmico em que o usuário altera o fator de escala ou DPI depois que um
aplicativo de Windows Forms foi iniciado.
Nas versões do .NET Framework a partir do .NET Framework 4,7, o suporte a alto DPI avançado é um recurso
opcional. Você deve configurar seu aplicativo para tirar proveito dele.
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
IMPORTANT
Nas versões anteriores do .NET Framework, você usou o manifesto para adicionar suporte a DPI alto. Essa
abordagem não é mais recomendada, já que ela substitui as configurações definidas no arquivo app. config.
Chame o método de EnableVisualStyles estático.
Deve ser a primeira chamada de método no ponto de entrada do aplicativo. Por exemplo:
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
</System.Windows.Forms.ApplicationConfigurationSection>
Para obter uma lista de chaves individuais e seus valores, consulte Windows Forms adicionar elemento de
configuração.
Observe que seu aplicativo não detectará com êxito o Windows 10 se ele não estiver listado como um sistema
operacional com suporte no manifesto do aplicativo.
Você também pode verificar a versão do .NET Framework em que o aplicativo foi criado:
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName);
Consulte também
Windows Forms adicionar elemento de configuração
Ajustando o tamanho e a escala dos Windows Forms
Alterando a aparência do Windows Forms
29/01/2020 • 2 minutes to read • Edit Online
Você pode personalizar a aparência de seus aplicativos de Windows Forms de várias maneiras diferentes, como
alterar a borda, a opacidade, a forma, o estilo ou definir uma imagem de plano de fundo para seu aplicativo
Windows Forms.
Nesta seção
Como alterar as bordas de Windows Forms
Mostra como alterar o estilo de borda de um formulário.
Referência
Form
Descreve essa classe e tem links para todos os seus membros.
FormBorderStyle
Descreve essa enumeração e contém descrições de todos os seus membros.
VisualStyleRenderer
Descreve essa classe e tem links para todos os seus membros.
Image
Descreve essa classe e tem links para todos os seus membros.
Region
Descreve essa classe e tem links para todos os seus membros.
Color
Descreve essa classe e tem links para todos os seus membros.
Seções Relacionadas
Ajustando o tamanho e a escala dos Windows Forms
Contém links para tópicos que mostram como alterar o tamanho e a escala de um formulário.
Elementos Gráficos e Desenho nos Windows Forms
Contém links para tópicos que descrevem como executar um desenho personalizado no Windows Forms.
Controles com suporte para desenho do proprietário interno
Lista o suporte de desenho proprietário em controles de Windows Forms.
Como alterar as bordas de formulários do Windows
Forms
03/02/2020 • 2 minutes to read • Edit Online
Você tem vários estilos de borda para escolher quando estiver determinando a aparência e comportamento dos
Windows Forms. Ao alterar a propriedade FormBorderStyle, você pode controlar o comportamento de
redimensionamento do formulário. Além disso, definir a FormBorderStyle afeta como a barra de legenda é exibida,
bem como quais botões podem aparecer nela. Para obter mais informações, consulte FormBorderStyle.
Há um suporte abrangente para esta tarefa no Visual Studio.
Consulte também Como alterar as bordas dos Windows Forms usando o designer.
Para definir o estilo de borda dos Windows Forms de maneira programática
Defina a propriedade FormBorderStyle como o estilo desejado. O exemplo de código a seguir define o estilo
de borda do formulário DlgBx1 como FixedDialog.
DlgBx1.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
DlgBx1.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
DlgBx1->FormBorderStyle =
System::Windows::Forms::FormBorderStyle::FixedDialog;
Consulte também
FormBorderStyle
FixedDialog
Introdução ao Windows Forms
Controles de formulários do Windows
03/02/2020 • 2 minutes to read • Edit Online
À medida que você cria e modifica a interface do usuário de seus aplicativos dos Windows Forms, será necessário
adicionar, alinhar e posicionar controles. Os controles são objetos que estão contidos em objetos de formulário.
Cada tipo de controle tem seu próprio conjunto de propriedades, métodos e eventos que o tornam adequado para
uma finalidade específica. Você pode manipular os controles no designer e escrever o código para adicionar
controles dinamicamente em tempo de execução.
Nesta seção
Colocando controles em Windows Forms
Fornece links relacionados à colocação de controles em formulários.
Organizando controles no Windows Forms
Artigos relacionados à organização de controles em formulários.
Rotulando controles individuais do Windows Forms e fornecendo atalhos para eles
Descreve os usos dos atalhos de teclado, rótulos de texto em controles e teclas modificadoras.
Controles a serem usados nos Windows Forms
Lista os controles que funcionam com o Windows Forms e tarefas básicas que você pode realizar com cada
controle.
Desenvolvendo controles do Windows Forms personalizados com o .NET Framework
Fornece informações básicas e exemplos para ajudar os usuários a desenvolver controles personalizados dos
Windows Forms.
Desenvolvendo controles dos Windows Forms em tempo de design
Descreve técnicas para criar controles personalizados por meio de herança e design.
Seções relacionadas
\ aplicativos cliente
Entrada do usuário no Windows Forms
03/02/2020 • 2 minutes to read • Edit Online
O Windows Forms inclui um modelo de entrada do usuário com base em eventos que são gerados durante o
processamento de mensagens do Windows relacionadas. Os tópicos nesta seção fornecem informações sobre
entrada do usuário com mouse e teclado, incluindo exemplos de código que demonstram como realizar tarefas
específicas.
Nesta seção
Entrada do usuário em um aplicativo dos Windows Forms
Fornece uma visão geral dos eventos de entrada do usuário e os métodos que processam mensagens do
Windows.
Entrada do teclado em um aplicativo dos Windows Forms
Fornece informações sobre a manipulação de mensagens do teclado, os diferentes tipos de teclas e os eventos de
teclado.
Entrada do mouse em um Aplicativo do Windows Forms
Fornece informações sobre os eventos do mouse e outros recursos relacionados ao mouse, incluindo cursores e
captura do mouse.
Como simular eventos de mouse e teclado no código
Demonstra várias maneiras diferentes de simular programaticamente entrada do mouse e do teclado.
Como manipular eventos de entrada do usuário em controles dos Windows Forms
Apresenta um exemplo de código que manipula a maioria dos eventos de entrada do usuário e relata informações
sobre cada evento.
Validação da entrada do usuário nos Windows Forms
Descreve os métodos para validar a entrada do usuário em aplicativos dos Windows Forms.
Seções Relacionadas
Veja também Criando manipuladores de eventos nos Windows Forms.
Entrada do usuário em um aplicativo do Windows
Forms
03/02/2020 • 4 minutes to read • Edit Online
No Windows Forms, a entrada do usuário é enviada para aplicativos na forma de mensagens do Windows. Uma
série de métodos substituíveis processam essas mensagens no nível do aplicativo, formulário e controle. Quando
esses métodos recebem mensagens de mouse e teclado, eles geram eventos que podem ser manipulados para
obter informações sobre a entrada de mouse ou de teclado. Em muitos casos, os aplicativos do Windows Forms
serão capazes de processar todas as entradas do usuário simplesmente manipulando esses eventos. Em outros
casos, um aplicativo pode precisar substituir um dos métodos que processam mensagens para interceptar uma
mensagem específica antes de ela ser recebida pelo aplicativo, formulário ou controle.
Mensagens de teclado e mouse também são processadas por um conjunto adicional de métodos substituíveis
específicos para esses tipos de mensagens. Para obter mais informações, consulte Como a Entrada do Teclado
Funciona e Como a Entrada do Mouse Funciona no Windows Forms.
Consulte também
Entrada do usuário no Windows Forms
Entrada do teclado em um aplicativo dos Windows Forms
Entrada do mouse em um Aplicativo do Windows Forms
Entrada do teclado em um aplicativo do Windows
Forms
03/02/2020 • 2 minutes to read • Edit Online
O Windows Forms inclui eventos de teclado padrão que permitem que você responda a pressionamentos de tecla
específicos e também fornece maneiras de interceptar, modificar e consumir pressionamentos de tecla no nível de
aplicativo, formulário e controle.
Nesta seção
Como a entrada do teclado funciona
Descreve como as mensagens do teclado são processadas e transformadas em eventos de teclado.
Usando eventos do teclado
Fornece informações sobre os tipos de eventos de teclado e as informações que são recebidas pelos
manipuladores de eventos de teclado.
Como modificar a entrada do teclado para um controle padrão
Apresenta um exemplo de código que mostra como modificar valores de chave antes que eles cheguem a um
controle.
Como determinar qual tecla modificadora foi pressionada
Demonstra como descobrir se SHIFT, ALT ou CTRL foi pressionada além de outra chave.
Como manipular a entrada do teclado no nível do formulário
Apresenta um exemplo de código que mostra como interceptar chaves antes que elas cheguem a um controle.
Como a entrada do teclado funciona
23/10/2019 • 11 minutes to read • Edit Online
O Windows Forms processa a entrada do teclado ao gerar eventos de teclado em resposta às mensagens do
Windows. A maioria dos aplicativos Windows Forms processa a entrada do teclado exclusivamente ao manipular
eventos de teclado. No entanto, você precisa entender como as mensagens do teclado funcionam para que você
possa implementar cenários mais avançados de entrada do teclado, como interceptar teclas antes que elas
atinjam um controle. Este tópico descreve os tipos de dados da chave que o Windows Forms reconhece e fornece
uma visão geral de como as mensagens do teclado são roteadas. Para obter informações sobre eventos de
teclado, consulte Usando eventos do teclado.
Tipos de teclas
Windows Forms identifica a entrada de teclado como códigos de chave virtual que são representados Keys pela
enumeração bit-de bits. Com a Keys enumeração, você pode combinar uma série de teclas pressionadas para
resultar em um único valor. Esses valores correspondem aos valores que acompanham as mensagens
WM_KEYDOWN e WM_SYSKEYDOWN do Windows. Você pode detectar a maioria dos pressionamentos de chave
física KeyDown manipulando os eventos ou KeyUp . As chaves de caractere são um subconjunto da Keys
enumeração e correspondem aos valores que acompanham as mensagens WM_CHAR e WM_SYSCHAR do
Windows. Se a combinação de teclas pressionadas resultar em um caractere, você poderá detectar o caractere
manipulando KeyPress o evento. Como alternativa, você pode usar Keyboard, exposto por Visual Basic interface
de programação, para descobrir quais chaves foram pressionadas e enviar chaves. Para obter mais informações,
consulte Acessando o teclado.
Verifique se há uma chave de comando ProcessCmdKey Este método processa uma chave de
como um acelerador ou um atalho de comando, que tem precedência sobre
menu. teclas regulares. Se esse método
retornar true , a mensagem principal
não será enviada e um evento de tecla
não ocorrerá. Se retornar false ,
IsInputKey será chamado .
Verifique se há uma chave especial que IsInputKey Se o método retornar true , significa
requer pré-processamento ou uma que o controle é um caractere regular e
chave de caractere normal que deva um KeyDown evento é gerado. Se
gerar um KeyDown evento e ser false ,ProcessDialogKey for
expedido para um controle. chamado. Obser vação: Para garantir
que um controle obtenha uma chave
ou uma combinação de chaves, você
pode PreviewKeyDown manipular o
evento IsInputKey e o
PreviewKeyDownEventArgs conjunto
true de para para a chave ou as
chaves desejadas.
Verifique se há uma tecla de navegação ProcessDialogKey Este método processa uma tecla física
(teclas ESC, TAB, Enter ou teclas de que utiliza uma funcionalidade especial
seta). dentro do controle, como alternar o
foco entre o controle e seu pai. Se o
controle imediato não tratar a chave, o
ProcessDialogKey será chamado no
controle pai e assim por diante para o
controle de nível superior na hierarquia.
Se esse método retornar true , o pré-
processamento estará completo e um
evento de tecla não será gerado. Se ele
retornar false , ocorrerá um
KeyDown evento.
M ÉTO DO O B SERVA Ç Õ ES
TA REFA M ÉTO DO
Interceptar uma chave de navegação e KeyDown gerar um Substitua IsInputKey. Obser vação: Como alternativa, você
evento. Por exemplo, você deseja que as teclas TAB e Enter pode manipular o PreviewKeyDown evento e o IsInputKey
sejam identificadas em uma caixa de texto. conjunto de PreviewKeyDownEventArgs para true para a
chave ou as chaves desejadas.
Consulte também
Keys
WndProc
PreProcessMessage
Objeto My.Computer.Keyboard
Acessando o Teclado
Usando eventos do teclado
Usando eventos do teclado
23/10/2019 • 4 minutes to read • Edit Online
A maioria dos programas do Windows Forms processa a entrada do teclado tratando eventos de teclado. Este
tópico fornece uma visão geral dos eventos de teclado, incluindo detalhes sobre quando usar cada evento e os
dados que são fornecidos para cada evento. Consulte também visão geral de manipuladores de eventos (Windows
Forms) e visão geral de eventos (Windows Forms).
Eventos de teclado
O Windows Forms fornece dois eventos que ocorrem quando um usuário pressiona uma tecla do teclado e um
evento quando um usuário libera uma tecla do teclado:
O KeyDown evento ocorre uma vez
O KeyPress evento, que pode ocorrer várias vezes quando um usuário segura a mesma tecla.
O KeyUp evento ocorre uma vez quando um usuário libera uma tecla.
Quando um usuário pressiona uma tecla, o Windows Forms determina qual evento deve ser gerado com base em
se a mensagem do teclado especifica uma tecla de caractere ou uma tecla física. Para obter mais informações
sobre teclas de caracteres e físicas, consulte Como funciona a entrada do teclado.
A tabela a seguir descreve os três eventos de teclado.
O Handled propriedade,
que pode ser definida
para impedir que o
controle subjacente
receba a chave.
O SuppressKeyPress
propriedade, que pode
ser usada para suprimir
a KeyPress e KeyUp
eventos para esse
pressionamento de tecla.
EVEN TO DE T EC L A DO DESC RIÇ Ã O RESULTA DO S
KeyPress Esse evento é gerado quando as teclas KeyPress é gerado após KeyDown.
são pressionadas resultam em um
caractere. Por exemplo, um usuário O manipulador para KeyPress
pressiona as teclas SHIFT e a letra “a” recebe:
minúscula, o que resulta em uma letra Um KeyPressEventArgs
“A” maiúscula. parâmetro, que contém o
código de caractere da tecla que
foi pressionada. Esse código de
caractere é exclusivo para cada
combinação de uma tecla de
caractere e tecla modificadora.
O código de caractere
65, se ela estiver
pressionada com a tecla
SHIFT
Ou a tecla CAPS LOCK,
97 se ela for pressionada
sozinha,
E 1 se ela estiver
pressionada com a tecla
CTRL.
Consulte também
Entrada do teclado em um aplicativo dos Windows Forms
Como a entrada do teclado funciona
Entrada do mouse em um Aplicativo do Windows Forms
Como: modificar a entrada do teclado para um
controle padrão
23/10/2019 • 9 minutes to read • Edit Online
O Windows Forms fornece a capacidade de consumir e modificar as entradas do teclado. Consumir uma tecla
significa tratá-la dentro de um método ou manipulador de eventos para que outros métodos e eventos mais
adiante na fila de mensagens não recebam o valor da tecla. Modificar uma tecla significa modificar o valor de uma
tecla para que os métodos e manipuladores de eventos mais adiante na fila de mensagens recebam um valor de
tecla diferente. Este tópico mostra como realizar essas tarefas.
Consumir uma tecla
Em um KeyPress manipulador de eventos, defina Handled a propriedade da KeyPressEventArgs classe como
true .
-ou-
Em um KeyDown manipulador de eventos, defina Handled a propriedade da KeyEventArgs classe como
true .
NOTE
Definir a Handled KeyDown Propriedade no manipulador de eventos não impede que os KeyPress eventos KeyUp e
sejam gerados para o pressionamento de teclas atual. Use a SuppressKeyPress propriedade para essa finalidade.
O exemplo a seguir é um trecho de switch uma instrução que examina a KeyChar Propriedade do
KeyPressEventArgs recebido por um KeyPress manipulador de eventos. Esse código consome as teclas dos
caracteres “A” e “a”.
MessageBox.Show("Control.PreProcessMessage: '" +
keyCode.ToString() + "' pressed.");
MessageBox.Show(("Control.PreProcessMessage: '" + _
keyCode.ToString() + "' pressed."))
Exemplo
O exemplo de código a seguir é o aplicativo completo para os exemplos de código nas seções anteriores. O
aplicativo usa um controle personalizado derivado da TextBox classe para consumir e modificar a entrada do
teclado.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace KeyboardInput
{
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand,
Name="FullTrust")]
class Form1 : Form
{
// The following Windows message value is defined in Winuser.h.
private int WM_KEYDOWN = 0x100;
CustomTextBox CustomTextBox1 = new CustomTextBox();
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
{
this.AutoSize = true;
this.Controls.Add(CustomTextBox1);
CustomTextBox1.KeyPress +=
new KeyPressEventHandler(CustomTextBox1_KeyPress);
}
public CustomTextBox()
{
this.Size = new Size(100, 100);
this.AutoSize = false;
}
MessageBox.Show("Control.PreProcessMessage: '" +
keyCode.ToString() + "' pressed.");
MessageBox.Show("Control.ProcessKeyMessage: '" +
keyCode.ToString() + "' pressed.");
break;
}
}
Imports System.Drawing
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows.Forms
Namespace KeyboardInput
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand,
Name:="FullTrust")> _
Class Form1
Inherits Form
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Public Sub New()
Me.AutoSize = True
Me.Controls.Add(CustomTextBox1)
End Sub
<System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand,
Name:="FullTrust")> _
Public Class CustomTextBox
Inherits TextBox
MessageBox.Show(("Control.PreProcessMessage: '" + _
keyCode.ToString() + "' pressed."))
MessageBox.Show(("Control.ProcessKeyMessage: '" + _
keyCode.ToString() + "' pressed."))
End Select
End If
End Class
End Namespace
Compilando o código
Este exemplo requer:
Referências aos assemblies System, System.Drawing e System.Windows.Forms.
Consulte também
Entrada do teclado em um aplicativo dos Windows Forms
Entrada do usuário em um aplicativo dos Windows Forms
Como a entrada do teclado funciona
Como: determinar qual tecla modificadora foi
pressionada
23/10/2019 • 3 minutes to read • Edit Online
Quando você cria um aplicativo que aceita a digitação do usuário, também é recomendável monitorar as teclas
modificadoras como SHIFT, ALT e CTRL. Quando uma tecla modificadora for pressionada junto com outras teclas,
ou com cliques do mouse, seu aplicativo pode responder adequadamente. Por exemplo, se a letra S for
pressionada, isso poderá simplesmente fazer um “s” aparecer na tela, mas se as teclas CTRL + S forem
pressionadas, o documento atual poderá ser salvo. Se você manipular o KeyDown evento, a Modifiers propriedade
de KeyEventArgs recebido pelo manipulador de eventos especifica quais teclas modificadoras são pressionadas.
Como alternativa, a KeyData propriedade de KeyEventArgs especifica o caractere que foi pressionado, bem como
quaisquer chaves de modificador combinadas com um OR-bit. No entanto, se você estiver KeyPress manipulando
o evento ou um evento do mouse, o manipulador de eventos não receberá essas informações. Nesse caso, você
deve usar a ModifierKeys propriedade Control da classe. Em ambos os casos, você deve executar uma e/ou um
Keys valor apropriado e o valor que você está testando. A Keys Enumeração oferece variações de cada chave de
modificador, portanto, é importante que você execute o bit e o com o valor correto. Por exemplo, a tecla Shift é
representada por Shift RShiftKey , ShiftKeye LShiftKey o valor correto para testar o deslocamento como uma chave
de modificador é Shift. Da mesma forma, para testar CTRL e Alt como modificadores, você deve Control usar Alt os
valores e, respectivamente.
NOTE
Visual Basic programadores também podem acessar informações de chave por Keyboard meio da propriedade
private:
void textBox1_KeyPress(Object^ sender, KeyPressEventArgs^ e)
{
if ((Control::ModifierKeys & Keys::Shift) == Keys::Shift)
{
MessageBox::Show("Pressed " + Keys::Shift.ToString());
}
}
Consulte também
Keys
ModifierKeys
Entrada do teclado em um aplicativo dos Windows Forms
Como: Determinar se CapsLock está no Visual Basic
Como: manipular a entrada do teclado no nível do
formulário
23/10/2019 • 7 minutes to read • Edit Online
Os Windows Forms proporcionam a capacidade de manipular mensagens de teclado no nível do formulário, antes
que as mensagens cheguem a um controle. Este tópico mostra como realizar essa tarefa.
Como manipular uma mensagem do teclado no nível do formulário
Lidar com o KeyPress ou KeyDown evento do formulário de inicialização e defina as KeyPreview
propriedade do formulário para true para que as mensagens do teclado são recebidas pelo formulário
antes que elas atinjam os controles no formulário. O seguinte código de exemplo manipula o KeyPress
eventos, detectando todas as teclas numéricas e consumindo '1', '4' e '7'.
switch (e->KeyChar)
{
case '1':
case '4':
case '7':
MessageBox::Show("Form.KeyPress: '" +
e->KeyChar.ToString() + "' consumed.");
e->Handled = true;
break;
}
}
}
// Detect all numeric characters at the form level and consume 1,
// 4, and 7. Note that Form.KeyPreview must be set to true for this
// event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar >= 48 && e.KeyChar <= 57)
{
MessageBox.Show("Form.KeyPress: '" +
e.KeyChar.ToString() + "' pressed.");
switch (e.KeyChar)
{
case (char)49:
case (char)52:
case (char)55:
MessageBox.Show("Form.KeyPress: '" +
e.KeyChar.ToString() + "' consumed.");
e.Handled = true;
break;
}
}
}
' Detect all numeric characters at the form level and consume 1,
' 4, and 7. Note that Form.KeyPreview must be set to true for this
' event handler to be called.
Sub Form1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles Me.KeyPress
Exemplo
O exemplo de código a seguir é o aplicativo completo para o exemplo acima. O aplicativo inclui um TextBox
juntamente com vários outros controles que permitem que você mova o foco do TextBox. O KeyPress eventos da
janela principal Form consome '1', '4' e '7' e o KeyPress evento do TextBox consome '2', '5' e '8' e exibe as teclas
restantes. Comparar as MessageBox de saída quando você pressiona uma tecla numérica enquanto o TextBox tem
o foco com o MessageBox quando você pressiona uma tecla numérica enquanto o foco está em um dos outros
controles de saída.
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
namespace KeyboardInputForm
{
{
public ref class Form1 sealed: public Form, public IMessageFilter
{
// The following Windows message value is defined in Winuser.h.
private:
static const int WM_KEYDOWN = 0x100;
private:
TextBox^ inputTextBox;
public:
Form1()
{
inputTextBox = gcnew TextBox();
this->AutoSize = true;
Application::AddMessageFilter(this);
FlowLayoutPanel^ panel = gcnew FlowLayoutPanel();
panel->AutoSize = true;
panel->FlowDirection = FlowDirection::TopDown;
panel->Controls->Add(gcnew Button());
panel->Controls->Add(gcnew RadioButton());
panel->Controls->Add(inputTextBox);
this->Controls->Add(panel);
this->KeyPreview = true;
this->KeyPress +=
gcnew KeyPressEventHandler(this, &Form1::Form1_KeyPress);
inputTextBox->KeyPress +=
gcnew KeyPressEventHandler(this,
&Form1::inputTextBox_KeyPress);
}
switch (e->KeyChar)
{
case '1':
case '4':
case '7':
MessageBox::Show("Form.KeyPress: '" +
e->KeyChar.ToString() + "' consumed.");
e->Handled = true;
break;
}
}
}
switch (e->KeyChar)
{
case '2':
case '5':
case '8':
MessageBox::Show("Control.KeyPress: '" +
e->KeyChar.ToString() + "' consumed.");
e->Handled = true;
break;
}
}
}
};
}
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew KeyboardInputForm::Form1());
}
using System;
using System.Drawing;
using System.Windows.Forms;
namespace KeyboardInputForm
{
class Form1 : Form
{
TextBox TextBox1 = new TextBox();
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
public Form1()
{
this.AutoSize = true;
this.KeyPreview = true;
this.KeyPress +=
new KeyPressEventHandler(Form1_KeyPress);
TextBox1.KeyPress +=
new KeyPressEventHandler(TextBox1_KeyPress);
}
switch (e.KeyChar)
{
case (char)49:
case (char)52:
case (char)55:
MessageBox.Show("Form.KeyPress: '" +
e.KeyChar.ToString() + "' consumed.");
e.Handled = true;
break;
}
}
}
switch (e.KeyChar)
{
case (char)50:
case (char)53:
case (char)56:
MessageBox.Show("Control.KeyPress: '" +
e.KeyChar.ToString() + "' consumed.");
e.Handled = true;
break;
}
}
}
}
}
Imports System.Drawing
Imports System.Windows.Forms
Namespace KeyboardInputForm
Namespace KeyboardInputForm
Class Form1
Inherits Form
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Me.KeyPreview = True
End Sub
' Detect all numeric characters at the form level and consume 1,
' 4, and 7. Note that Form.KeyPreview must be set to true for this
' event handler to be called.
Sub Form1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles Me.KeyPress
' Detect all numeric characters at the TextBox level and consume
' 2, 5, and 8.
Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles TextBox1.KeyPress
End Class
End Namespace
Compilando o código
Este exemplo requer:
Referências aos assemblies System, System.Drawing e System.Windows.Forms.
Consulte também
Entrada do teclado em um aplicativo dos Windows Forms
Entrada do mouse em um aplicativo do Windows
Forms
03/02/2020 • 2 minutes to read • Edit Online
O Windows Forms inclui uma variedade de eventos de mouse e suporte adicional para cursores personalizados
de mouse, captura de mouse e comportamento de arrastar e soltar.
Nesta seção
Como a entrada do mouse funciona nos Windows Forms
Fornece informações sobre os eventos do mouse e como obter informações atuais e configurações do sistema
para o mouse.
Eventos do mouse nos Windows Forms
Fornece informações sobre a ordem na qual os eventos do mouse ocorrem e como os eventos do mouse são
gerados dentro de controles específicos.
Como distinguir entre cliques e cliques duplos
Demonstra como usar cliques únicos e duplos para iniciar ações incompatíveis.
Ponteiros do mouse nos Windows Forms
Descreve como alterar o cursor do mouse.
Captura do mouse nos Windows Forms
Descreve como um controle pode capturar o mouse.
Funcionalidade do tipo "arrastar e soltar" no Windows Forms
Descreve como implementar o comportamento de arrastar e soltar.
Seções Relacionadas
Acessando o Mouse
Lista os tópicos para acessar o mouse usando Visual Basic.
Como a entrada do mouse funciona no Windows
Forms
03/02/2020 • 9 minutes to read • Edit Online
Receber e manipular entradas de mouse é uma parte importante qualquer aplicativo do Windows. Você pode
manipular eventos de mouse para executar uma ação em seu aplicativo ou usar informações sobre a localização
do mouse para executar testes de clique ou outras ações. Além disso, é possível alterar a maneira como os
controles em seu aplicativo manipulam as entradas de mouse. Este tópico descreve esses eventos de mouse de
forma detalhada, bem como obter e alterar configurações do sistema para o mouse. Para obter mais informações
sobre os dados fornecidos com os eventos de mouse e a ordem em que os eventos de clique do mouse são
gerados, consulte Eventos de mouse nos Windows Forms.
Eventos de mouse
A principal maneira de responder a entradas de mouse é manipular eventos de mouse. A tabela a seguir mostra
os eventos de mouse e descreve quando eles são gerados.
Consulte também
Entrada do mouse em um Aplicativo do Windows Forms
Captura do mouse nos Windows Forms
Ponteiros do mouse nos Windows Forms
Eventos do mouse no Windows Forms
03/02/2020 • 8 minutes to read • Edit Online
Quando manipula entradas de mouse, você geralmente deseja conhecer a localização do ponteiro do mouse e o
estado dos botões do mouse. Este tópico fornece detalhes sobre como obter essas informações de eventos do
mouse e explica a ordem em que eventos de clique do mouse são gerados em controles dos Windows Forms.
Para obter uma lista e uma descrição de todos os eventos de mouse, consulte Como a entrada do mouse
funciona nos Windows Forms. Consulte também visão geral de manipuladores de eventos (Windows Forms) e
visão geral de eventos (Windows Forms).
NOTE
Para o controle de ComboBox, o comportamento de evento detalhado posteriormente ocorrerá se o usuário clicar
no campo de edição, no botão ou em um item dentro da lista.
NOTE
O comportamento do evento detalhado a seguir ocorre quando o usuário clica em qualquer lugar desses controles.
NOTE
O comportamento de evento detalhado posteriormente ocorre apenas quando o usuário clica nos itens em si ou à
direita dos itens no controle de TreeView. Nenhum evento é gerado para cliques em qualquer outro lugar no
controle. Além daqueles descritos posteriormente, há os eventos BeforeCheck, BeforeSelect, BeforeLabelEdit,
AfterSelect, AfterChecke AfterLabelEdit, que podem ser de seu interesse se você quiser usar a validação com o
controle TreeView.
Consulte também
Entrada do mouse em um Aplicativo do Windows Forms
Como: distinguir entre cliques e cliques duplos
23/10/2019 • 11 minutes to read • Edit Online
Normalmente, um único clique inicia uma interface do usuário e um clique duplo estende a ação. Por exemplo, um
clique normalmente seleciona um item e um clique duplo edita o item selecionado. No entanto, eventos de clique a
formulários do Windows não acomodam facilmente um cenário onde um clique e um clique duplo executam ações
incompatíveis, como uma ação associada à Click ou MouseClick eventos é executado antes da ação ligada para o
DoubleClickou MouseDoubleClick eventos. Este tópico demonstra duas soluções para esse problema. Uma solução
é manipular o evento de clique duplo e reverter as ações no tratamento de evento de clique. Em raras situações,
você talvez seja necessário simular um clique e comportamento de clique duplo manipulando o MouseDown
evento e, usando o DoubleClickTime e DoubleClickSize propriedades do SystemInformation classe. Você medir o
tempo entre cliques e se um segundo clique ocorre antes do valor de DoubleClickTime for atingido e o clique foi
dentro de um retângulo definido por DoubleClickSize, executar a ação de clique duplo; caso contrário, execute a
ação de clique.
Reverter uma ação de clique
Verifique se o controle em que você está trabalhando tem um comportamento de clique duplo padrão. Se
não estiver, habilite o controle com o SetStyle método. Trate o evento de clique duplo e reverta a ação de
clique, bem como a ação de clique duplo. O exemplo de código a seguir demonstra um como criar um botão
personalizado com clique duplo habilitado, bem como reverter a ação de clique no código de tratamento de
eventos de clique duplo.
using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MouseRollBackSingleClick
{
public class Form1 : Form
{
private DoubleClickButton button1;
private FormBorderStyle initialStyle;
public Form1()
{
initialStyle = this.FormBorderStyle;
this.ClientSize = new System.Drawing.Size(292, 266);
button1 = new DoubleClickButton();
button1.Location = new Point (40,40);
button1.Click += new EventHandler(button1_Click);
button1.AutoSize = true;
this.AllowDrop = true;
button1.Text = "Click or Double Click";
button1.DoubleClick += new EventHandler(button1_DoubleClick);
this.Controls.Add(button1);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
public class DoubleClickButton : Button
{
public DoubleClickButton() : base()
{
// Set the style so a double click event occurs.
SetStyle(ControlStyles.StandardClick |
ControlStyles.StandardDoubleClick, true);
}
}
}
Imports System.ComponentModel
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
End Sub
End Sub
Me.FormBorderStyle = FormBorderStyle.FixedToolWindow
End Sub
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
End Class
End Sub
End Class
Distinguir entre cliques no evento MouseDown
Lidar com o MouseDown eventos e determinar o local e o tempo de espaço entre os cliques usando
apropriado SystemInformation propriedades e um Timer componente. Execute a ação apropriada
dependendo se ocorreu um clique ou um clique duplo. O exemplo de código a seguir demonstra como fazer
isso.
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
namespace SingleVersusDoubleClick
{
public ref class Form1 : public Form
{
private:
Rectangle hitTestRectangle;
private:
Rectangle doubleClickRectangle;
private:
TextBox^ outputBox;
private:
Timer^ doubleClickTimer;
private:
ProgressBar^ doubleClickBar;
private:
Label^ hitTestLabel;
private:
Label^ timerLabel;
private:
bool isFirstClick;
private:
bool isDoubleClick;
private:
int milliseconds;
public:
Form1()
{
hitTestRectangle = Rectangle();
hitTestRectangle.Location = Point(30, 20);
hitTestRectangle.Size = System::Drawing::Size(100, 40);
doubleClickRectangle = Rectangle();
isFirstClick = true;
private:
void doubleClickTimer_Tick(Object^ sender, EventArgs^ e)
{
milliseconds += 100;
doubleClickBar->Increment(100);
if (isDoubleClick)
{
outputBox->AppendText("Perform double click action");
outputBox->AppendText(Environment::NewLine);
}
else
{
outputBox->AppendText("Perform single click action");
outputBox->AppendText(Environment::NewLine);
}
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew SingleVersusDoubleClick::Form1);
}
using System;
using System.Drawing;
using System.Windows.Forms;
namespace SingleVersusDoubleClick
{
class Form1 : Form
{
private Rectangle hitTestRectangle = new Rectangle();
private Rectangle doubleClickRectangle = new Rectangle();
private TextBox textBox1 = new TextBox();
private Timer doubleClickTimer = new Timer();
private ProgressBar doubleClickBar = new ProgressBar();
private Label label1 = new Label();
private Label label2 = new Label();
private bool isFirstClick = true;
private bool isDoubleClick = false;
private int milliseconds = 0;
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
public Form1()
{
label1.Location = new Point(30, 5);
label1.Size = new Size(100, 15);
label1.Text = "Hit test rectangle:";
doubleClickTimer.Interval = 100;
doubleClickTimer.Tick +=
new EventHandler(doubleClickTimer_Tick);
if (isDoubleClick)
{
textBox1.AppendText("Perform double click action");
textBox1.AppendText(Environment.NewLine);
}
else
{
textBox1.AppendText("Perform single click action");
textBox1.AppendText(Environment.NewLine);
}
Imports System.Drawing
Imports System.Windows.Forms
Namespace SingleVersusDoubleClick
Class Form1
Inherits Form
Private hitTestRectangle As New Rectangle()
Private doubleClickRectangle As New Rectangle()
Private textBox1 As New TextBox()
Private WithEvents doubleClickTimer As New Timer()
Private doubleClickBar As New ProgressBar()
Private label1 As New Label()
Private label2 As New Label()
Private isFirstClick As Boolean = True
Private isDoubleClick As Boolean = False
Private milliseconds As Integer = 0
<STAThread()> _
Public Shared Sub Main()
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Me.Controls.Add(doubleClickBar)
Me.Controls.Add(textBox1)
Me.Controls.Add(label1)
Me.Controls.Add(label2)
End Sub
milliseconds += 100
doubleClickBar.Increment(100)
' The timer has reached the double click time limit.
If milliseconds >= SystemInformation.DoubleClickTime Then
doubleClickTimer.Stop()
If isDoubleClick Then
textBox1.AppendText("Perform double click action")
textBox1.AppendText(Environment.NewLine)
Else
textBox1.AppendText("Perform single click action")
textBox1.AppendText(Environment.NewLine)
End If
Compilando o código
Esses exemplos precisam de:
Referências aos assemblies System, System.Drawing e System.Windows.Forms.
Consulte também
Entrada do mouse em um Aplicativo do Windows Forms
Ponteiros do mouse no Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
O ponteiro do mouse, que às vezes é conhecido como o cursor, é um bitmap que especifica um ponto de foco na
tela para entrada do usuário com o mouse. Este tópico fornece uma visão geral do ponteiro do mouse no
Windows Forms e descreve algumas maneiras de modificar e controlar o ponteiro do mouse.
Consulte também
Cursor
Entrada do mouse em um Aplicativo do Windows Forms
Funcionalidade do tipo "arrastar e soltar" no Windows Forms
Captura do mouse no Windows Forms
03/02/2020 • 2 minutes to read • Edit Online
Captura do mouse significa quando um controle toma o comando todas as entradas do mouse. Quando um
controle tiver capturado o mouse, ele recebe a entrada do mouse com o ponteiro estando ou não dentro de suas
bordas.
Consulte também
Entrada do mouse em um Aplicativo do Windows Forms
Funcionalidade de arrastar e soltar no Windows
Forms
03/02/2020 • 4 minutes to read • Edit Online
O Windows Forms incluem um conjunto de métodos, eventos e classes que implementam o comportamento do
tipo "arrastar e soltar". Este tópico fornece uma visão geral do suporte a arrastar e soltar no Windows Forms.
Consulte também Operações do tipo "arrastar e soltar" e suporte à área de transferência.
A classe DragEventArgs fornece o local do ponteiro do mouse, o estado atual dos botões do mouse e as teclas
modificadoras do teclado, os dados que estão sendo arrastados e DragDropEffects valores que especificam as
operações permitidas pela origem do evento de arrastar e o efeito de soltar destino para a operação.
Eventos na fonte
A tabela a seguir mostra os eventos que ocorrem na fonte atual de uma operação do tipo "arrastar e soltar".
EVEN TO DE M O USE DESC RIÇ Ã O
A classe QueryContinueDragEventArgs fornece o estado atual dos botões do mouse e as teclas modificadoras do
teclado, um valor que especifica se a tecla ESC foi pressionada e um valor DragAction que pode ser definido para
especificar se a operação de arrastar e soltar deve continuar.
Consulte também
Entrada do mouse em um Aplicativo do Windows Forms
Como simular eventos de mouse e teclado no código
11/12/2019 • 13 minutes to read • Edit Online
O Windows Forms fornece várias opções para simular programaticamente entradas do mouse e do teclado. Este
tópico fornece uma visão geral dessas opções.
Se seu aplicativo for destinado ao uso internacional com uma variedade de teclados, o uso de SendKeys.Send
poderá gerar resultados imprevisíveis e deve ser evitado.
NOTE
A classe SendKeys foi atualizada para o .NET Framework 3,0 para habilitar seu uso em aplicativos executados no Windows
Vista. A segurança avançada do Windows Vista (conhecida como Controle de Conta de Usuário ou UAC) impede que a
implementação anterior funcione conforme o esperado.
A classe SendKeys é suscetível a problemas de tempo, que alguns desenvolvedores precisavam solucionar. A implementação
atualizada ainda está suscetível a problemas de atraso, mas é ligeiramente mais rápida e pode exigir alterações para as
soluções alternativas. A classe SendKeys tenta usar a implementação anterior primeiro e, se isso falhar, usará a nova
implementação. Como resultado, a classe SendKeys pode se comportar de forma diferente em sistemas operacionais
diferentes. Além disso, quando a classe SendKeys usa a nova implementação, o método SendWait não aguardará que as
mensagens sejam processadas quando forem enviadas a outro processo.
Se seu aplicativo depender de um comportamento consistente independentemente do sistema operacional, você poderá
forçar a classe de SendKeys a usar a nova implementação adicionando a seguinte configuração de aplicativo ao seu arquivo
app. config.
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
Para forçar a classe de SendKeys a usar a implementação anterior, use o valor "JournalHook" em vez disso.
' Send the enter key to the button, which raises the click
' event for the button. This works because the tab stop of
' the button is 0.
SendKeys.Send("{ENTER}")
End Sub
NOTE
Os parâmetros corretos da chamada FindWindow que localiza o aplicativo Calculadora variam de acordo com sua
versão do Windows. O código a seguir encontra o aplicativo de calculadora no Windows 7. No Windows Vista, altere o
primeiro parâmetro para "SciCalc". Você pode usar a ferramenta Spy++, incluída no Visual Studio, para determinar os
parâmetros corretos.
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
namespace SimulateKeyPress
{
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew SimulateKeyPress::Form1());
}
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace SimulateKeyPress
{
class Form1 : Form
{
private Button button1 = new Button();
[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
{
button1.Location = new Point(10, 10);
button1.TabIndex = 0;
button1.Text = "Click to automate Calculator";
button1.AutoSize = true;
button1.Click += new EventHandler(button1_Click);
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Windows.Forms
Namespace SimulateKeyPress
Class Form1
Inherits Form
Private WithEvents button1 As New Button()
<STAThread()> _
Public Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
' Send a key to the button when the user double-clicks anywhere
' on the form.
Private Sub Form1_DoubleClick(ByVal sender As Object, _
ByVal e As EventArgs) Handles Me.DoubleClick
' Send the enter key to the button, which raises the click
' event for the button. This works because the tab stop of
' the button is 0.
SendKeys.Send("{ENTER}")
End Sub
End Class
End Namespace
Compilando o Código
Este exemplo requer:
Referências aos assemblies System, System.Drawing e System.Windows.Forms.
Consulte também
Entrada do usuário nos Windows Forms
Como manipular eventos de entrada do usuário em
controles do Windows Forms
03/02/2020 • 27 minutes to read • Edit Online
Este exemplo demonstra como lidar com a maioria dos eventos de teclado, mouse, foco e validação que podem
ocorrer em um controle de Windows Forms. A caixa de texto chamada TextBoxInput recebe os eventos quando
ele tem o foco e as informações sobre cada evento são gravadas na caixa de texto chamada TextBoxOutput na
ordem em que os eventos são gerados. O aplicativo também inclui um conjunto de caixas de seleção que podem
ser usadas para filtrar os eventos a serem relatados.
{1>Exemplo<1}
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
#using <System.dll>
namespace UserInputWalkthrough
{
public ref class Form1 : public Form
{
Label^ lblEvent;
Label^ lblInput;
TextBox^ TextBoxOutput;
TextBox^ TextBoxInput;
GroupBox^ GroupBoxEvents;
Button^ ButtonClear;
LinkLabel^ LinkLabelDrag;
CheckBox^ CheckBoxToggleAll;
CheckBox^ CheckBoxMouse;
CheckBox^ CheckBoxMouseEnter;
CheckBox^ CheckBoxMouseMove;
CheckBox^ CheckBoxMousePoints;
CheckBox^ CheckBoxMouseDrag;
CheckBox^ CheckBoxMouseDragOver;
CheckBox^ CheckBoxKeyboard;
CheckBox^ CheckBoxKeyUpDown;
CheckBox^ CheckBoxFocus;
CheckBox^ CheckBoxValidation;
public:
Form1() : Form()
{
this->Load += gcnew EventHandler(this, &Form1::Form1_Load);
private:
void Form1_Load(Object^ sender, EventArgs^ e)
{
this->GroupBoxEvents->SuspendLayout();
this->SuspendLayout();
LinkLabelDrag->AllowDrop = true;
LinkLabelDrag->AutoSize = true;
LinkLabelDrag->Location = Point(13, 240);
LinkLabelDrag->Size = System::Drawing::Size(175, 14);
LinkLabelDrag->TabIndex = 2;
LinkLabelDrag->TabStop = true;
LinkLabelDrag->Text = "Click here to use as a drag source";
LinkLabelDrag->Links->Add(gcnew LinkLabel::Link(0,
LinkLabelDrag->Text->Length));
CheckBoxToggleAll->AutoSize = true;
CheckBoxToggleAll->Location = Point(7, 20);
CheckBoxToggleAll->Size = System::Drawing::Size(122, 17);
CheckBoxToggleAll->TabIndex = 4;
CheckBoxToggleAll->TabIndex = 4;
CheckBoxToggleAll->Text = "Toggle All Events";
CheckBoxMouse->AutoSize = true;
CheckBoxMouse->Location = Point(7, 45);
CheckBoxMouse->Size = System::Drawing::Size(137, 17);
CheckBoxMouse->TabIndex = 5;
CheckBoxMouse->Text = "Mouse and Click Events";
CheckBoxMouseEnter->AutoSize = true;
CheckBoxMouseEnter->Location = Point(26, 69);
CheckBoxMouseEnter->Margin =
System::Windows::Forms::Padding(3, 3, 3, 1);
CheckBoxMouseEnter->Size = System::Drawing::Size(151, 17);
CheckBoxMouseEnter->TabIndex = 6;
CheckBoxMouseEnter->Text = "Mouse Enter/Hover/Leave";
CheckBoxMouseMove->AutoSize = true;
CheckBoxMouseMove->Location = Point(26, 89);
CheckBoxMouseMove->Margin =
System::Windows::Forms::Padding(3, 2, 3, 3);
CheckBoxMouseMove->Size = System::Drawing::Size(120, 17);
CheckBoxMouseMove->TabIndex = 7;
CheckBoxMouseMove->Text = "Mouse Move Events";
CheckBoxMousePoints->AutoSize = true;
CheckBoxMousePoints->Location = Point(26, 112);
CheckBoxMousePoints->Margin =
System::Windows::Forms::Padding(3, 3, 3, 1);
CheckBoxMousePoints->Size = System::Drawing::Size(141, 17);
CheckBoxMousePoints->TabIndex = 8;
CheckBoxMousePoints->Text = "Draw Mouse Points";
CheckBoxMouseDrag->AutoSize = true;
CheckBoxMouseDrag->Location = Point(26, 135);
CheckBoxMouseDrag->Margin =
System::Windows::Forms::Padding(3, 1, 3, 3);
CheckBoxMouseDrag->Size = System::Drawing::Size(151, 17);
CheckBoxMouseDrag->TabIndex = 9;
CheckBoxMouseDrag->Text = "Mouse Drag && Drop Events";
CheckBoxMouseDragOver->AutoSize = true;
CheckBoxMouseDragOver->Location = Point(44, 159);
CheckBoxMouseDragOver->Size = System::Drawing::Size(142, 17);
CheckBoxMouseDragOver->TabIndex = 10;
CheckBoxMouseDragOver->Text = "Mouse Drag Over Events";
CheckBoxKeyboard->AutoSize = true;
CheckBoxKeyboard->Location = Point(8, 184);
CheckBoxKeyboard->Size = System::Drawing::Size(103, 17);
CheckBoxKeyboard->TabIndex = 11;
CheckBoxKeyboard->Text = "Keyboard Events";
CheckBoxKeyUpDown->AutoSize = true;
CheckBoxKeyUpDown->Location = Point(26, 207);
CheckBoxKeyUpDown->Margin =
System::Windows::Forms::Padding(3, 3, 3, 1);
CheckBoxKeyUpDown->Size = System::Drawing::Size(133, 17);
CheckBoxKeyUpDown->TabIndex = 12;
CheckBoxKeyUpDown->Text = "Key Up && Down Events";
CheckBoxFocus->AutoSize = true;
CheckBoxFocus->Location = Point(8, 233);
CheckBoxFocus->Margin =
System::Windows::Forms::Padding(3, 2, 3, 3);
CheckBoxFocus->Size = System::Drawing::Size(146, 17);
CheckBoxFocus->TabIndex = 13;
CheckBoxFocus->Text = "Focus && Activation Events";
CheckBoxValidation->AutoSize = true;
CheckBoxValidation->AutoSize = true;
CheckBoxValidation->Location = Point(8, 257);
CheckBoxValidation->Size = System::Drawing::Size(104, 17);
CheckBoxValidation->TabIndex = 14;
CheckBoxValidation->Text = "Validation Events";
ButtonClear->Click +=
gcnew EventHandler(this, &Form1::ButtonClear_Click);
TextBoxInput->KeyDown +=
gcnew KeyEventHandler(this, &Form1::TextBoxInput_KeyDown);
TextBoxInput->KeyPress +=
gcnew KeyPressEventHandler(this,
&Form1::TextBoxInput_KeyPress);
TextBoxInput->KeyUp +=
gcnew KeyEventHandler(this, &Form1::TextBoxInput_KeyUp);
TextBoxInput->Click +=
gcnew EventHandler(this, &Form1::TextBoxInput_Click);
TextBoxInput->DoubleClick +=
gcnew EventHandler(this, &Form1::TextBoxInput_DoubleClick);
TextBoxInput->MouseClick +=
gcnew MouseEventHandler(this, &Form1::TextBoxInput_MouseClick);
TextBoxInput->MouseDoubleClick +=
gcnew MouseEventHandler(this,
&Form1::TextBoxInput_MouseDoubleClick);
TextBoxInput->MouseDown +=
gcnew MouseEventHandler(this, &Form1::TextBoxInput_MouseDown);
TextBoxInput->MouseUp +=
gcnew MouseEventHandler(this, &Form1::TextBoxInput_MouseUp);
TextBoxInput->MouseEnter +=
gcnew EventHandler(this, &Form1::TextBoxInput_MouseEnter);
TextBoxInput->MouseHover +=
gcnew EventHandler(this, &Form1::TextBoxInput_MouseHover);
TextBoxInput->MouseLeave +=
gcnew EventHandler(this, &Form1::TextBoxInput_MouseLeave);
TextBoxInput->MouseWheel +=
gcnew MouseEventHandler(this, &Form1::TextBoxInput_MouseWheel);
TextBoxInput->MouseMove +=
gcnew MouseEventHandler(this, &Form1::TextBoxInput_MouseMove);
TextBoxInput->MouseCaptureChanged +=
gcnew EventHandler(this,
&Form1::TextBoxInput_MouseCaptureChanged);
TextBoxInput->DragEnter +=
gcnew DragEventHandler(this, &Form1::TextBoxInput_DragEnter);
TextBoxInput->DragDrop +=
gcnew DragEventHandler(this, &Form1::TextBoxInput_DragDrop);
TextBoxInput->DragOver +=
gcnew DragEventHandler(this, &Form1::TextBoxInput_DragOver);
TextBoxInput->DragLeave +=
gcnew EventHandler(this, &Form1::TextBoxInput_DragLeave);
TextBoxInput->Enter +=
gcnew EventHandler(this, &Form1::TextBoxInput_Enter);
TextBoxInput->Leave +=
gcnew EventHandler(this, &Form1::TextBoxInput_Leave);
TextBoxInput->GotFocus +=
gcnew EventHandler(this, &Form1::TextBoxInput_GotFocus);
TextBoxInput->LostFocus +=
gcnew EventHandler(this, &Form1::TextBoxInput_LostFocus);
TextBoxInput->Validated +=
gcnew EventHandler(this, &Form1::TextBoxInput_Validated);
TextBoxInput->Validating +=
gcnew CancelEventHandler(this,
&Form1::TextBoxInput_Validating);
LinkLabelDrag->MouseDown +=
gcnew MouseEventHandler(this, &Form1::LinkLabelDrag_MouseDown);
LinkLabelDrag->GiveFeedback +=
gcnew GiveFeedbackEventHandler(this,
&Form1::LinkLabelDrag_GiveFeedback);
CheckBoxToggleAll->CheckedChanged +=
gcnew EventHandler(this,
&Form1::CheckBoxToggleAll_CheckedChanged);
CheckBoxMouse->CheckedChanged +=
gcnew EventHandler(this, &Form1::CheckBoxMouse_CheckedChanged);
CheckBoxMouseDrag->CheckedChanged +=
gcnew EventHandler(this,
&Form1::CheckBoxMouseDrag_CheckedChanged);
CheckBoxMouseEnter->CheckedChanged +=
gcnew EventHandler(this,
&Form1::CheckBoxMouseMove_CheckedChanged);
CheckBoxMouseMove->CheckedChanged +=
gcnew EventHandler(this,
&Form1::CheckBoxMouseMove_CheckedChanged);
CheckBoxKeyboard->CheckedChanged +=
gcnew EventHandler(this,
&Form1::CheckBoxKeyboard_CheckedChanged);
this->GroupBoxEvents->ResumeLayout(false);
this->GroupBoxEvents->PerformLayout();
this->ResumeLayout(false);
this->PerformLayout();
CheckAllChildCheckBoxes(this, true);
}
// Click event handler for the button that clears the text box.
private:
void ButtonClear_Click(Object^ sender, EventArgs^ e)
{
TextBoxOutput->Invalidate();
TextBoxOutput->Clear();
}
private:
void TextBoxInput_KeyDown(Object^ sender, KeyEventArgs^ e)
{
if (CheckBoxKeyUpDown->Checked)
{
DisplayLine("KeyDown: " + e->KeyData.ToString());
}
}
private:
void TextBoxInput_KeyUp(Object^ sender, KeyEventArgs^ e)
{
if (CheckBoxKeyUpDown->Checked)
{
DisplayLine("KeyUp: " + e->KeyData.ToString());
}
}
private:
void TextBoxInput_KeyPress(Object^ sender,
KeyPressEventArgs^ e)
{
if (CheckBoxKeyboard->Checked)
{
if (Char::IsWhiteSpace(e->KeyChar))
{
DisplayLine("KeyPress: WS");
}
else
{
DisplayLine("KeyPress: " + e->KeyChar.ToString());
}
}
}
private:
void TextBoxInput_Click(Object^ sender, EventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("Click event");
}
}
private:
void TextBoxInput_DoubleClick(Object^ sender, EventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("DoubleClick event");
DisplayLine("DoubleClick event");
}
}
private:
void TextBoxInput_MouseClick(Object^ sender, MouseEventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("MouseClick: " + e->Button.ToString() +
" " + e->Location.ToString());
}
}
private:
void TextBoxInput_MouseDoubleClick(Object^ sender,
MouseEventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("MouseDoubleClick: " + e->Button.ToString() +
" " + e->Location.ToString());
}
}
private:
void TextBoxInput_MouseDown(Object^ sender,
MouseEventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("MouseDown: " + e->Button.ToString() +
" " + e->Location.ToString());
}
}
private:
void TextBoxInput_MouseUp(Object^ sender,
MouseEventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("MouseUp: " + e->Button.ToString() +
" " + e->Location.ToString());
}
private:
void TextBoxInput_MouseEnter(Object^ sender, EventArgs^ e)
{
if (CheckBoxMouseEnter->Checked)
{
DisplayLine("MouseEnter event");
}
}
private:
void TextBoxInput_MouseHover(Object^ sender, EventArgs^ e)
{
if (CheckBoxMouseEnter->Checked)
{
DisplayLine("MouseHover event");
}
}
}
private:
void TextBoxInput_MouseLeave(Object^ sender, EventArgs^ e)
{
if (CheckBoxMouseEnter->Checked)
{
DisplayLine("MouseLeave event");
}
}
private:
void TextBoxInput_MouseWheel(Object^ sender,
MouseEventArgs^ e)
{
if (CheckBoxMouse->Checked)
{
DisplayLine("MouseWheel: " + e->Delta.ToString() +
" detents at " + e->Location.ToString());
}
}
private:
void TextBoxInput_MouseMove(Object^ sender,
MouseEventArgs^ e)
{
if (CheckBoxMouseMove->Checked)
{
DisplayLine("MouseMove: " + e->Button.ToString() + " " +
e->Location.ToString());
}
if (CheckBoxMousePoints->Checked)
{
Graphics^ g = TextBoxInput->CreateGraphics();
g->FillRectangle(Brushes::Black, e->Location.X,
e->Location.Y, 1, 1);
delete g;
}
}
private:
void TextBoxInput_MouseCaptureChanged(Object^ sender,
EventArgs^ e)
{
if (CheckBoxMouseDrag->Checked)
{
DisplayLine("MouseCaptureChanged event");
}
}
private:
void TextBoxInput_DragEnter(Object^ sender, DragEventArgs^ e)
{
if (CheckBoxMouseDrag->Checked)
{
Point^ pt = gcnew Point(e->X, e->Y);
DisplayLine("DragEnter: " +
CovertKeyStateToString(e->KeyState)
+ " at " + pt->ToString());
}
}
private:
void TextBoxInput_DragDrop(Object^ sender, DragEventArgs^ e)
{
if (CheckBoxMouseDrag->Checked)
{
Point^ pt = gcnew Point(e->X, e->Y);
Point^ pt = gcnew Point(e->X, e->Y);
DisplayLine("DragDrop: " +
CovertKeyStateToString(e->KeyState)
+ " at " + pt->ToString());
}
}
private:
void TextBoxInput_DragOver(Object^ sender, DragEventArgs^ e)
{
if (CheckBoxMouseDragOver->Checked)
{
Point^ pt = gcnew Point(e->X, e->Y);
DisplayLine("DragOver: " +
CovertKeyStateToString(e->KeyState)
+ " at " + pt->ToString());
}
private:
void TextBoxInput_DragLeave(Object^ sender,
EventArgs^ e)
{
if (CheckBoxMouseDrag->Checked)
{
DisplayLine("DragLeave event");
}
}
private:
static String^ CovertKeyStateToString(int keyState)
{
String^ keyString = "None";
if ((keyState & 8) == 8)
{
keyString += "+CTRL";
}
return keyString;
}
private:
void TextBoxInput_Enter(Object^ sender, EventArgs^ e)
{
if (CheckBoxFocus->Checked)
{
DisplayLine("Enter event");
}
}
private:
void TextBoxInput_Leave(Object^ sender, EventArgs^ e)
{
if (CheckBoxFocus->Checked)
{
DisplayLine("Leave event");
}
}
private:
void TextBoxInput_GotFocus(Object^ sender, EventArgs^ e)
{
if (CheckBoxFocus->Checked)
{
DisplayLine("GotFocus event");
}
}
private:
void TextBoxInput_LostFocus(Object^ sender, EventArgs^ e)
{
if (CheckBoxFocus->Checked)
{
DisplayLine("LostFocus event");
}
}
private:
void TextBoxInput_Validated(Object^ sender, EventArgs^ e)
{
if (CheckBoxValidation->Checked)
{
DisplayLine("Validated event");
}
}
private:
void TextBoxInput_Validating(
Object^ sender, CancelEventArgs^ e)
{
if (CheckBoxValidation->Checked)
{
DisplayLine("Validating event");
}
}
private:
void CheckBoxToggleAll_CheckedChanged(
Object^ sender, EventArgs^ e)
{
if (dynamic_cast<CheckBox^>(sender))
{
CheckAllChildCheckBoxes(this, ((CheckBox^)sender)->Checked);
}
}
private:
void CheckBoxMouse_CheckedChanged(
Object^ sender, EventArgs^ e)
{
ConfigureCheckBoxSettings();
}
private:
void CheckBoxMouseDrag_CheckedChanged(
Object^ sender, EventArgs^ e)
{
ConfigureCheckBoxSettings();
}
private:
void CheckBoxKeyboard_CheckedChanged(
Object^ sender, EventArgs^ e)
{
ConfigureCheckBoxSettings();
}
private:
void CheckBoxMouseMove_CheckedChanged(
Object^ sender, EventArgs^ e)
{
ConfigureCheckBoxSettings();
}
if (!CheckBoxKeyboard->Checked)
{
CheckBoxKeyUpDown->Enabled = false;
}
else
{
CheckBoxKeyUpDown->Enabled = true;
}
}
private:
void LinkLabelDrag_MouseDown(Object^ sender, MouseEventArgs^ e)
{
String^ data = "Sample Data";
LinkLabelDrag->DoDragDrop(data, DragDropEffects::All);
}
private:
void LinkLabelDrag_GiveFeedback(Object^ sender,
GiveFeedbackEventArgs^ e)
{
if ((e->Effect & DragDropEffects::Copy) ==
DragDropEffects::Copy)
{
LinkLabelDrag->Cursor = Cursors::HSplit;
}
else
{
LinkLabelDrag->Cursor = Cursors::Default;
}
}
};
}
[STAThread]
int main()
{
Application::EnableVisualStyles();
Application::Run(gcnew UserInputWalkthrough::Form1());
}
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
namespace UserInputWalkthrough
{
public class Form1 : Form
{
Label Label1 = new Label();
Label Label2 = new Label();
TextBox TextBoxOutput = new TextBox();
TextBox TextBoxInput = new TextBox();
GroupBox GroupBoxEvents = new GroupBox();
Button ButtonClear = new Button();
LinkLabel LinkLabelDrag = new LinkLabel();
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
public Form1()
: base()
{
this.Load += new EventHandler(Form1_Load);
}
LinkLabelDrag.AllowDrop = true;
LinkLabelDrag.AutoSize = true;
LinkLabelDrag.Location = new Point(13, 240);
LinkLabelDrag.Size = new Size(175, 14);
LinkLabelDrag.TabIndex = 2;
LinkLabelDrag.TabStop = true;
LinkLabelDrag.Text = "Click here to use as a drag source";
LinkLabelDrag.Links.Add(new LinkLabel.Link(0,
LinkLabelDrag.Text.Length));
CheckBoxToggleAll.AutoSize = true;
CheckBoxToggleAll.Location = new Point(7, 20);
CheckBoxToggleAll.Size = new Size(122, 17);
CheckBoxToggleAll.TabIndex = 4;
CheckBoxToggleAll.Text = "Toggle All Events";
CheckBoxMouse.AutoSize = true;
CheckBoxMouse.Location = new Point(7, 45);
CheckBoxMouse.Location = new Point(7, 45);
CheckBoxMouse.Size = new Size(137, 17);
CheckBoxMouse.TabIndex = 5;
CheckBoxMouse.Text = "Mouse and Click Events";
CheckBoxMouseEnter.AutoSize = true;
CheckBoxMouseEnter.Location = new Point(26, 69);
CheckBoxMouseEnter.Margin = new Padding(3, 3, 3, 1);
CheckBoxMouseEnter.Size = new System.Drawing.Size(151, 17);
CheckBoxMouseEnter.TabIndex = 6;
CheckBoxMouseEnter.Text = "Mouse Enter/Hover/Leave";
CheckBoxMouseMove.AutoSize = true;
CheckBoxMouseMove.Location = new Point(26, 89);
CheckBoxMouseMove.Margin = new Padding(3, 2, 3, 3);
CheckBoxMouseMove.Size = new Size(120, 17);
CheckBoxMouseMove.TabIndex = 7;
CheckBoxMouseMove.Text = "Mouse Move Events";
CheckBoxMousePoints.AutoSize = true;
CheckBoxMousePoints.Location = new Point(26, 112);
CheckBoxMousePoints.Margin = new Padding(3, 3, 3, 1);
CheckBoxMousePoints.Size = new Size(141, 17);
CheckBoxMousePoints.TabIndex = 8;
CheckBoxMousePoints.Text = "Draw Mouse Points";
CheckBoxMouseDrag.AutoSize = true;
CheckBoxMouseDrag.Location = new Point(26, 135);
CheckBoxMouseDrag.Margin = new Padding(3, 1, 3, 3);
CheckBoxMouseDrag.Size = new Size(151, 17);
CheckBoxMouseDrag.TabIndex = 9;
CheckBoxMouseDrag.Text = "Mouse Drag && Drop Events";
CheckBoxMouseDragOver.AutoSize = true;
CheckBoxMouseDragOver.Location = new Point(44, 159);
CheckBoxMouseDragOver.Size = new Size(142, 17);
CheckBoxMouseDragOver.TabIndex = 10;
CheckBoxMouseDragOver.Text = "Mouse Drag Over Events";
CheckBoxKeyboard.AutoSize = true;
CheckBoxKeyboard.Location = new Point(8, 184);
CheckBoxKeyboard.Size = new Size(103, 17);
CheckBoxKeyboard.TabIndex = 11;
CheckBoxKeyboard.Text = "Keyboard Events";
CheckBoxKeyUpDown.AutoSize = true;
CheckBoxKeyUpDown.Location = new Point(26, 207);
CheckBoxKeyUpDown.Margin = new Padding(3, 3, 3, 1);
CheckBoxKeyUpDown.Size = new Size(133, 17);
CheckBoxKeyUpDown.TabIndex = 12;
CheckBoxKeyUpDown.Text = "Key Up && Down Events";
CheckBoxFocus.AutoSize = true;
CheckBoxFocus.Location = new Point(8, 233);
CheckBoxFocus.Margin = new Padding(3, 2, 3, 3);
CheckBoxFocus.Size = new Size(146, 17);
CheckBoxFocus.TabIndex = 13;
CheckBoxFocus.Text = "Focus && Activation Events";
CheckBoxValidation.AutoSize = true;
CheckBoxValidation.Location = new Point(8, 257);
CheckBoxValidation.Size = new Size(104, 17);
CheckBoxValidation.TabIndex = 14;
CheckBoxValidation.Text = "Validation Events";
ButtonClear.Click +=
new EventHandler(ButtonClear_Click);
TextBoxInput.KeyDown +=
new KeyEventHandler(TextBoxInput_KeyDown);
TextBoxInput.KeyPress +=
new KeyPressEventHandler(TextBoxInput_KeyPress);
TextBoxInput.KeyUp +=
new KeyEventHandler(TextBoxInput_KeyUp);
TextBoxInput.Click +=
new EventHandler(TextBoxInput_Click);
TextBoxInput.DoubleClick +=
new EventHandler(TextBoxInput_DoubleClick);
TextBoxInput.MouseClick +=
new MouseEventHandler(TextBoxInput_MouseClick);
TextBoxInput.MouseDoubleClick +=
new MouseEventHandler(TextBoxInput_MouseDoubleClick);
TextBoxInput.MouseDown +=
new MouseEventHandler(TextBoxInput_MouseDown);
TextBoxInput.MouseUp +=
new MouseEventHandler(TextBoxInput_MouseUp);
TextBoxInput.MouseEnter +=
new EventHandler(TextBoxInput_MouseEnter);
TextBoxInput.MouseHover +=
new EventHandler(TextBoxInput_MouseHover);
TextBoxInput.MouseLeave +=
new EventHandler(TextBoxInput_MouseLeave);
TextBoxInput.MouseWheel +=
new MouseEventHandler(TextBoxInput_MouseWheel);
TextBoxInput.MouseMove +=
new MouseEventHandler(TextBoxInput_MouseMove);
TextBoxInput.MouseCaptureChanged +=
new EventHandler(TextBoxInput_MouseCaptureChanged);
TextBoxInput.DragEnter +=
new DragEventHandler(TextBoxInput_DragEnter);
TextBoxInput.DragDrop +=
new DragEventHandler(TextBoxInput_DragDrop);
TextBoxInput.DragOver +=
new DragEventHandler(TextBoxInput_DragOver);
TextBoxInput.DragLeave +=
new EventHandler(TextBoxInput_DragLeave);
TextBoxInput.Enter +=
new EventHandler(TextBoxInput_Enter);
TextBoxInput.Leave +=
new EventHandler(TextBoxInput_Leave);
TextBoxInput.GotFocus +=
new EventHandler(TextBoxInput_GotFocus);
TextBoxInput.LostFocus +=
new EventHandler(TextBoxInput_LostFocus);
TextBoxInput.Validated +=
new EventHandler(TextBoxInput_Validated);
new EventHandler(TextBoxInput_Validated);
TextBoxInput.Validating +=
new CancelEventHandler(TextBoxInput_Validating);
LinkLabelDrag.MouseDown +=
new MouseEventHandler(LinkLabelDrag_MouseDown);
LinkLabelDrag.GiveFeedback +=
new GiveFeedbackEventHandler(LinkLabelDrag_GiveFeedback);
CheckBoxToggleAll.CheckedChanged +=
new EventHandler(CheckBoxToggleAll_CheckedChanged);
CheckBoxMouse.CheckedChanged +=
new EventHandler(CheckBoxMouse_CheckedChanged);
CheckBoxMouseDrag.CheckedChanged +=
new EventHandler(CheckBoxMouseDrag_CheckedChanged);
CheckBoxMouseEnter.CheckedChanged +=
new EventHandler(CheckBoxMouseMove_CheckedChanged);
CheckBoxMouseMove.CheckedChanged +=
new EventHandler(CheckBoxMouseMove_CheckedChanged);
CheckBoxKeyboard.CheckedChanged +=
new EventHandler(CheckBoxKeyboard_CheckedChanged);
this.GroupBoxEvents.ResumeLayout(false);
this.GroupBoxEvents.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
CheckAllChildCheckBoxes(this, true);
}
// Click event handler for the button that clears the text box.
private void ButtonClear_Click(object sender, EventArgs e)
{
TextBoxOutput.Invalidate();
TextBoxOutput.Clear();
}
if (CheckBoxMousePoints.Checked)
{
Graphics g = TextBoxInput.CreateGraphics();
g.FillRectangle(Brushes.Black, e.Location.X,
e.Location.Y, 1, 1);
g.Dispose();
}
}
if ((keyState & 8) == 8)
{
keyString += "+CTRL";
}
return keyString;
}
if (!CheckBoxKeyboard.Checked)
{
CheckBoxKeyUpDown.Enabled = false;
}
else
{
CheckBoxKeyUpDown.Enabled = true;
}
}
Imports System.Drawing
Imports System.ComponentModel
Imports System.Windows.Forms
Namespace UserInputWalkthrough
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.Run(New Form1())
End Sub
Me.GroupBoxEvents.SuspendLayout()
Me.SuspendLayout()
LinkLabelDrag.AllowDrop = True
LinkLabelDrag.AutoSize = True
LinkLabelDrag.Location = New Point(13, 240)
LinkLabelDrag.Size = New Size(175, 14)
LinkLabelDrag.TabIndex = 2
LinkLabelDrag.TabStop = True
LinkLabelDrag.Text = "Click here to use as a drag source"
LinkLabelDrag.Links.Add(New LinkLabel.Link(0, _
LinkLabelDrag.Text.Length))
CheckBoxToggleAll.AutoSize = True
CheckBoxToggleAll.Location = New Point(7, 20)
CheckBoxToggleAll.Location = New Point(7, 20)
CheckBoxToggleAll.Size = New Size(122, 17)
CheckBoxToggleAll.TabIndex = 4
CheckBoxToggleAll.Text = "Toggle All Events"
CheckBoxMouse.AutoSize = True
CheckBoxMouse.Location = New Point(7, 45)
CheckBoxMouse.Size = New Size(137, 17)
CheckBoxMouse.TabIndex = 5
CheckBoxMouse.Text = "Mouse and Click Events"
CheckBoxMouseEnter.AutoSize = True
CheckBoxMouseEnter.Location = New Point(26, 69)
CheckBoxMouseEnter.Margin = New Padding(3, 3, 3, 1)
CheckBoxMouseEnter.Size = New System.Drawing.Size(151, 17)
CheckBoxMouseEnter.TabIndex = 6
CheckBoxMouseEnter.Text = "Mouse Enter/Hover/Leave"
CheckBoxMouseMove.AutoSize = True
CheckBoxMouseMove.Location = New Point(26, 89)
CheckBoxMouseMove.Margin = New Padding(3, 2, 3, 3)
CheckBoxMouseMove.Size = New Size(120, 17)
CheckBoxMouseMove.TabIndex = 7
CheckBoxMouseMove.Text = "Mouse Move Events"
CheckBoxMousePoints.AutoSize = True
CheckBoxMousePoints.Location = New Point(26, 112)
CheckBoxMousePoints.Margin = New Padding(3, 3, 3, 1)
CheckBoxMousePoints.Size = New Size(141, 17)
CheckBoxMousePoints.TabIndex = 8
CheckBoxMousePoints.Text = "Draw Mouse Points"
CheckBoxMouseDrag.AutoSize = True
CheckBoxMouseDrag.Location = New Point(26, 135)
CheckBoxMouseDrag.Margin = New Padding(3, 1, 3, 3)
CheckBoxMouseDrag.Size = New Size(151, 17)
CheckBoxMouseDrag.TabIndex = 9
CheckBoxMouseDrag.Text = "Mouse Drag && Drop Events"
CheckBoxMouseDragOver.AutoSize = True
CheckBoxMouseDragOver.Location = New Point(44, 159)
CheckBoxMouseDragOver.Size = New Size(142, 17)
CheckBoxMouseDragOver.TabIndex = 10
CheckBoxMouseDragOver.Text = "Mouse Drag Over Events"
CheckBoxKeyboard.AutoSize = True
CheckBoxKeyboard.Location = New Point(8, 184)
CheckBoxKeyboard.Size = New Size(103, 17)
CheckBoxKeyboard.TabIndex = 11
CheckBoxKeyboard.Text = "Keyboard Events"
CheckBoxKeyUpDown.AutoSize = True
CheckBoxKeyUpDown.Location = New Point(26, 207)
CheckBoxKeyUpDown.Margin = New Padding(3, 3, 3, 1)
CheckBoxKeyUpDown.Size = New Size(133, 17)
CheckBoxKeyUpDown.TabIndex = 12
CheckBoxKeyUpDown.Text = "Key Up && Down Events"
CheckBoxFocus.AutoSize = True
CheckBoxFocus.Location = New Point(8, 233)
CheckBoxFocus.Margin = New Padding(3, 2, 3, 3)
CheckBoxFocus.Size = New Size(146, 17)
CheckBoxFocus.TabIndex = 13
CheckBoxFocus.Text = "Focus && Activation Events"
CheckBoxValidation.AutoSize = True
CheckBoxValidation.Location = New Point(8, 257)
CheckBoxValidation.Size = New Size(104, 17)
CheckBoxValidation.TabIndex = 14
CheckBoxValidation.Text = "Validation Events"
CheckBoxValidation.Text = "Validation Events"
Me.GroupBoxEvents.ResumeLayout(False)
Me.GroupBoxEvents.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
CheckAllChildCheckBoxes(Me, True)
End Sub
' Recursively search the form for all contained checkboxes and
' initially check them
Private Sub CheckAllChildCheckBoxes(ByRef parent As Control, _
ByVal value As Boolean)
TextBoxOutput.AppendText(line)
TextBoxOutput.AppendText(ControlChars.NewLine)
End Sub
' Click event handler for the button that clears the text box.
Private Sub ButtonClear_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ButtonClear.Click
TextBoxOutput.Invalidate()
TextBoxOutput.Clear()
End Sub
If Char.IsWhiteSpace(e.KeyChar) Then
Dim keyVal As Integer
keyVal = AscW(e.KeyChar)
DisplayLine("KeyPress: WS-" + keyVal.ToString())
Else
DisplayLine("KeyPress: " + e.KeyChar.ToString())
End If
End If
End Sub
Dim pt As Point
If CheckBoxMouseDrag.Checked = True Then
pt = New Point(e.X, e.Y)
DisplayLine("DragEnter: " + _
CovertKeyStateToString(e.KeyState) _
+ " at " + pt.ToString())
End If
End Sub
DisplayLine("DragDrop: " + _
CovertKeyStateToString(e.KeyState) _
+ " at " + pt.ToString())
End If
End Sub
Return keyString
End Function
Dim cb As CheckBox
cb = TryCast(sender, CheckBox)
If cb IsNot Nothing Then
CheckAllChildCheckBoxes(Me, cb.Checked)
End If
End Sub
ConfigureCheckBoxSettings()
End Sub
ConfigureCheckBoxSettings()
End Sub
ConfigureCheckBoxSettings()
End Sub
ConfigureCheckBoxSettings()
End Sub
End Class
End Namespace
Compilando o Código
Este exemplo requer:
Referências aos assemblies System, System.Drawing e System.Windows.Forms.
Consulte também
Entrada do usuário no Windows Forms
Validação da entrada do usuário no Windows Forms
24/04/2020 • 13 minutes to read • Edit Online
Quando os usuários inserem dados em seu aplicativo, convém verificar se os dados são válidos antes de seu
aplicativo utilizá-los. Você pode exigir que determinados campos de texto não sejam de comprimento zero, que um
campo seja formatado como um número de telefone ou outros tipos de dados bem formados ou que uma cadeia
de caracteres não contenha caracteres desprotegidos que poderiam ser usados para comprometer a segurança de
um banco de dados. O Windows Forms fornece várias maneiras para validar a entrada em seu aplicativo.
IMPORTANT
Se você tiver validação personalizada Validating que ocorra após o evento, ela não afetará a vinculação de dados. Por
exemplo, se você Validated tiver código em um caso que tente cancelar a vinculação de dados, a vinculação de dados ainda
ocorrerá. Neste caso, para realizar Validated a validação no evento, altere a propriedade do Modo de Atualização de Fonte
de Dados do controle (em (Databindings) \ (Avançado) ) de OnValidation para Never , e adicione Control
.DataBindings[" <YOURFIELD> "].WriteValue() ao seu código de validação.
ContainerControl Inherit
Form EnableAllowFocusChange
SplitContainer Inherit
UserControl EnableAllowFocusChange
NOTE
Se você forçar o formulário a fechar desta maneira, todos os dados nos controles do formulário que ainda não tiverem sido
salvos serão perdidos. Além disso, os formulários modais não validam o conteúdo dos controles quando eles são fechados.
Você ainda pode usar a validação de controle para bloquear o foco em um controle, mas você não precisa se preocupar com
o comportamento associado ao fechamento do formulário.
Confira também
Control.Validating
Form.FormClosing
System.Windows.Forms.FormClosingEventArgs
Controle MaskedTextBox
Exemplos de expressões regulares
Caixas de diálogo no Windows Forms
29/01/2020 • 2 minutes to read • Edit Online
Caixas de diálogo são usadas para interagir com o usuário e recuperar informações. Em termos simples, uma caixa
de diálogo é um formulário com sua propriedade de enumeração FormBorderStyle definida como FixedDialog .
Você pode construir suas próprias caixas de diálogo personalizadas usando o Designer de Formulários do
Windows no Visual Studio. Adicione controles como Label , Textbox e Button para personalizar caixas de diálogo
conforme suas necessidades específicas. O .NET Framework também inclui caixas de diálogo predefinidas, como
caixas de mensagem e aber tura de arquivo , que você pode adaptar para seus próprios aplicativos. Para obter
mais informações, confira Controles e componentes da caixa de diálogo.
Nesta seção
Como exibir caixas de diálogo para o Windows Forms
Fornece instruções para mostrar caixas de diálogo.
Seções Relacionadas
Controles e componentes da caixa de diálogo
Lista os controles da caixa de diálogo predefinida.
Alterando a aparência dos Windows Forms
Contém links para tópicos que descrevem como alterar a aparência de aplicativos dos Windows Forms.
Visão geral do controle TabControl
Explica como incorporar o controle guia em uma caixa de diálogo.
Como exibir caixas de diálogo para o Windows
Forms
20/03/2020 • 2 minutes to read • Edit Online
Você exibe uma caixa de diálogo da mesma forma que exibe qualquer outro formulário em um aplicativo. O
formulário de inicialização é carregado automaticamente quando o aplicativo é executado. Para fazer aparecer um
segundo formulário ou caixa de diálogo no aplicativo, escreva código para carregá-lo e exibi-lo. Da mesma forma,
para fazer o formulário ou caixa de diálogo desaparecer, escreva código para descarregá-lo ou escondê-lo.
Para exibir uma caixa de diálogo
1. Navegue até o manipulador de eventos com o qual deseja abrir a caixa de diálogo. Isso pode acontecer
quando um comando de menu é selecionado, quando um botão é clicado ou quando qualquer outro evento
ocorre.
2. No manipulador de eventos, adicione código para abrir a caixa de diálogo. Neste exemplo, um evento de
clique de botão é usado para mostrar a caixa de diálogo:
private:
void button1_Click(System::Object ^ sender,
System::EventArgs ^ e)
{
Form ^ dlg1 = gcnew Form();
dlg1->ShowDialog();
}
Associação de dados do Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
A associação de dados no Windows Forms oferece os meios para exibir e realizar alterações nas informações de
uma fonte de dados em controles no formulário. É possível associar a fontes de dados tradicionais e a
praticamente qualquer estrutura que contém dados.
Nesta seção
Associação de dados e o Windows Forms
Fornece uma visão geral da associação de dados no Windows Forms.
Fontes de dados com suporte nos Windows Forms
Descreve as fontes de dados que podem ser usadas com o Windows Forms.
Interfaces relacionadas à vinculação de dados
Descreve várias das interfaces usadas com a associação de dados do Windows Forms.
Como navegar por dados no Windows Forms
Mostra como navegar por itens em uma fonte de dados.
Notificação de alteração na vinculação de dados dos Windows Forms
Descreve os diferentes tipos de notificação de alteração para associação de dados do Windows Forms.
Como implementar a interface INotifyPropertyChanged
Mostra como implementar a interface INotifyPropertyChanged. A interface se comunica com um controle
associado alterado pela propriedade em um objeto de negócios
Como aplicar o padrão PropertyNameChanged
Mostra como aplicar o padrão PropertyNameChanged nas propriedades de um controle de usuário do Windows
Forms.
Como implementar a interface ITypedList
Mostra como habilitar a descoberta do esquema para uma lista vinculável implementando a interface ITypedList.
Como implementar a interface IListSource
Mostra como implementar a interface IListSource para criar uma classe vinculável não implementa IList, mas
fornece uma lista de outro local.
Como assegurar que vários controles associados à mesma fonte de dados permaneçam sincronizados
Mostra como lidar com o evento BindingComplete para garantir que todos os controles vinculados a uma fonte
de dados permaneçam sincronizados.
Como garantir que a linha selecionada em uma tabela filho permaneça na posição correta
Mostra como garantir que a linha selecionada de uma tabela filho não seja alterada quando uma alteração for
feita em um campo da tabela pai.
Consulte também interfaces relacionadas à vinculação de dados, como navegar em dados em Windows Formse
como criar um controle de ligação simples em um Windows Form.
Referência
System.Windows.Forms.Binding
Descreve a classe que representa a associação entre um componente vinculável e uma fonte de dados.
System.Windows.Forms.BindingSource
Descreve a classe que encapsula uma fonte de dados para associação aos controles.
Seções Relacionadas
Componente BindingSource
Contém uma lista de tópicos que demonstram como usar o componente BindingSource.
Controle DataGridView
Fornece uma lista de tópicos que demonstram como usar um controle datagrid vinculável.
Consulte também acessando dados no Visual Studio.
Associação de dados e o Windows Forms
03/02/2020 • 8 minutes to read • Edit Online
No Windows Forms, você pode vincular não apenas a fontes de dados tradicionais, mas também a praticamente
qualquer estrutura que contenha dados. Você pode vincular a uma matriz de valores que você calcula no tempo
de execução, lê de um arquivo ou deriva dos valores de outros controles.
Além disso, você pode vincular qualquer propriedade de qualquer controle à fonte de dados. Na vinculação de
dados tradicional, você geralmente vincula a propriedade de exibição — por exemplo, a propriedade Text de um
controle TextBox — à fonte de dados. Com o .NET Framework, você também tem a opção de definir outras
propriedades por meio de associação também. É possível usar a vinculação para realizar as seguintes tarefas:
Definir o grafo de um controle de imagem.
Definir a cor do plano de fundo de um ou mais controles.
Definir o tamanho dos controles.
Basicamente, a vinculação de dados é uma maneira automática de configurar qualquer propriedade acessível do
tempo de execução de qualquer controle em um formulário.
Consulte também
Binding
Associação de dados do Windows Forms
Como associar o controle DataGrid dos Windows Forms a uma fonte de dados
Componente BindingSource
Fontes de dados com suporte do Windows Forms
03/02/2020 • 7 minutes to read • Edit Online
Tradicionalmente, a associação de dados era usada nos aplicativos para tirar proveito dos dados armazenados em
bancos de dados. Com a associação de dados do Windows Forms, você pode acessar dados de bancos de dados,
bem como dados em outras estruturas, como matrizes e coleções, desde que certos requisitos mínimos sejam
atendidos.
Consulte também
Notificação de alteração na vinculação de dados dos Windows Forms
Associação de dados e o Windows Forms
Associação de dados do Windows Forms
Interfaces relacionadas à associação de dados
23/11/2019 • 15 minutes to read • Edit Online
Com o ADO.NET, você pode criar várias estruturas de dados diferentes para atender às necessidades de
associação do seu aplicativo e aos dados com os quais você está trabalhando. Talvez você queira criar suas
próprias classes que forneçam ou consumam dados nos Windows Forms. Esses objetos podem oferecer vários
níveis de funcionalidade e complexidade, desde a vinculação de dados básica até o fornecimento de suporte em
tempo de design, verificação de erros, notificação de alterações ou até mesmo suporte para uma reversão
estruturada das alterações feitas nos próprios dados.
NOTE
Se você quiser criar uma lista de objetos comerciais para associação com Windows Forms, considere usar o
BindingList<T>. O BindingList<T> é uma classe extensível que implementa as interfaces primárias necessárias para
a associação de dados de Windows Forms bidirecional.
interface IBindingList
Uma classe que implementa a interface IBindingList fornece um nível muito mais alto de funcionalidade de
vinculação de dados. Essa implementação oferece recursos básicos de classificação e notificação de
alteração para quando os itens da lista são alterados (por exemplo, o terceiro item em uma lista de clientes
tem uma alteração no campo de endereço), bem como quando a própria lista é alterada (por exemplo, o
número de itens na lista aumenta ou diminui). A notificação de alteração é importante se você planeja ter
vários controles associados aos mesmos dados e deseja que as alterações de dados feitas em um dos
controles sejam propagadas para os outros controles associados.
NOTE
A notificação de alteração está habilitada para a interface de IBindingList por meio da propriedade
SupportsChangeNotification, que, quando true , gera um evento de ListChanged, indicando que a lista foi
alterada ou um item na lista foi alterado.
NOTE
O BindingList<T> fornece uma implementação genérica da interface IBindingList.
interface IBindingListView
Uma classe que implementa a interface IBindingListView fornece toda a funcionalidade de uma
implementação de IBindingList, bem como a filtragem e a funcionalidade de classificação avançada. Essa
implementação oferece filtragem baseada em cadeia de caracteres e classificação de várias colunas com
pares de propriedade descritor-direção.
interface IEditableObject
Uma classe que implementa a interface IEditableObject permite que um objeto controle quando as
alterações feitas nesse objeto são permanentes. Essa implementação proporciona os métodos BeginEdit,
EndEdite CancelEdit, que permitem que você Reverta as alterações feitas no objeto. Veja a seguir uma
breve explicação do funcionamento dos métodos BeginEdit, EndEdite CancelEdit e como eles funcionam
em conjunto entre si para permitir uma possível reversão das alterações feitas nos dados:
O método BeginEdit sinaliza o início de uma edição em um objeto. Um objeto que implementa essa
interface precisará armazenar todas as atualizações após a chamada do método BeginEdit de forma
que as atualizações possam ser descartadas se o método CancelEdit for chamado. Na Windows
Forms de vinculação de dados, você pode chamar BeginEdit várias vezes dentro do escopo de uma
única transação de edição (por exemplo, BeginEdit, BeginEdit, EndEdit). As implementações de
IEditableObject devem controlar se BeginEdit já foi chamado e ignorar chamadas subsequentes
para BeginEdit. Como esse método pode ser chamado várias vezes, é importante que as chamadas
subsequentes a ele sejam não destrutivas; ou seja, as chamadas de BeginEdit subsequentes não
podem destruir as atualizações que foram feitas ou alterar os dados que foram salvos na primeira
chamada BeginEdit.
O método EndEdit envia todas as alterações desde que BeginEdit foi chamado no objeto subjacente,
se o objeto estiver em modo de edição no momento.
O método CancelEdit descarta as alterações feitas no objeto.
Para obter mais informações sobre como os métodos BeginEdit, EndEdite CancelEdit funcionam, consulte
salvar dados de volta no banco de dado.
Essa noção transacional de funcionalidade de dados é usada pelo controle de DataGridView.
interface ICancelAddNew
Uma classe que implementa a interface ICancelAddNew geralmente implementa a interface IBindingList e
permite que você Reverta uma adição feita à fonte de dados com o método AddNew. Se sua fonte de
dados implementar a interface IBindingList, você também deverá fazer com que ela implemente a
interface ICancelAddNew.
interface IDataErrorInfo
Uma classe que implementa a interface IDataErrorInfo permite que os objetos ofereçam informações de
erro personalizadas a controles associados:
A propriedade Error retorna texto de mensagem de erro geral (por exemplo, "ocorreu um erro").
A propriedade Item[String] retorna uma cadeia de caracteres com a mensagem de erro específica
da coluna (por exemplo, "o valor na coluna State é inválido").
interface IEnumerable
Uma classe que implementa a interface IEnumerable normalmente é consumida por ASP.NET. Windows
Forms suporte para essa interface só está disponível por meio do componente BindingSource.
NOTE
O componente BindingSource copia todos os itens de IEnumerable em uma lista separada para fins de associação.
interface ITypedList
Uma classe Collections que implementa a interface ITypedList fornece a capacidade de controlar a ordem e
o conjunto de propriedades expostas ao controle associado.
NOTE
Quando você implementar o método GetItemProperties e a matriz PropertyDescriptor não for nula, a última
entrada na matriz será o descritor de propriedade que descreve a Propriedade List que é outra lista de itens.
interface ICustomTypeDescriptor
Uma classe que implementa a interface ICustomTypeDescriptor fornece informações dinâmicas sobre si
mesma. Essa interface é semelhante a ITypedList, mas é usada para objetos em vez de listas. Essa interface
é usada pelo DataRowView para projetar o esquema das linhas subjacentes. Uma implementação simples
de ICustomTypeDescriptor é fornecida pela classe CustomTypeDescriptor.
NOTE
Para dar suporte à associação de tempo de design a tipos que implementam ICustomTypeDescriptor, o tipo
também deve implementar IComponent e existir como uma instância no formulário.
interface IListSource
Uma classe que implementa a interface IListSource habilita a associação baseada em lista em objetos que
não são de lista. O método GetList de IListSource é usado para retornar uma lista vinculável de um objeto
que não herda de IList. IListSource é usado pela classe DataSet.
interface IRaiseItemChangedEvents
Uma classe que implementa a interface IRaiseItemChangedEvents é uma lista vinculável que também
implementa a interface IBindingList. Essa interface é usada para indicar se o tipo gera ListChanged eventos
do tipo ItemChanged por meio de sua propriedade RaisesItemChangedEvents.
NOTE
Você deve implementar a IRaiseItemChangedEvents se sua fonte de dados fornecer a propriedade para listar a
conversão de eventos descrita anteriormente e estiver interagindo com o componente BindingSource. Caso
contrário, a BindingSource também executará a propriedade para listar a conversão de eventos, resultando em um
desempenho mais lento.
interface ISupportInitialize
Um componente que implementa a interface ISupportInitialize aproveita as vantagens das otimizações do
lote para definir propriedades e inicializar propriedades codependentes. O ISupportInitialize contém dois
métodos:
BeginInit sinaliza que a inicialização do objeto está iniciando.
EndInit sinaliza que a inicialização do objeto está sendo concluída.
interface ISupportInitializeNotification
Um componente que implementa a interface ISupportInitializeNotification também implementa a
interface ISupportInitialize. Essa interface permite que você notifique outros componentes do
ISupportInitialize que a inicialização foi concluída. A interface ISupportInitializeNotification contém dois
membros:
IsInitialized retorna um valor de boolean indicando se o componente é inicializado.
Initialized ocorre quando EndInit é chamado.
interface INotifyPropertyChanged
Uma classe que implementa essa interface é um tipo que aciona um evento quando qualquer um dos seus
valores de propriedade são alterados. Essa interface foi projetada para substituir o padrão de ter um
evento de alteração para cada propriedade de um controle. Quando usado em uma BindingList<T>, um
objeto comercial deve implementar a interface INotifyPropertyChanged e a BindingList`1 converterá
PropertyChanged eventos em eventos ListChanged do tipo ItemChanged.
NOTE
Para que a notificação de alteração ocorra em uma associação entre um cliente associado e uma fonte de dados, o
tipo de fonte de dados ligada deve implementar a interface de INotifyPropertyChanged (preferencial) ou você pode
fornecer eventos de Changed PropertyName para o tipo associado, mas você não deve fazer ambos.
NOTE
Se o componente herdar de Control, você não precisará implementar a interface IBindableComponent.
interface ICurrencyManagerProvider
Uma classe que implementa a interface ICurrencyManagerProvider é um componente que fornece seu
próprio CurrencyManager para gerenciar as associações associadas a esse componente específico. O
acesso ao CurrencyManager personalizado é fornecido pela propriedade CurrencyManager.
NOTE
Uma classe que herda de Control gerencia associações automaticamente por meio de sua propriedade
BindingContext, portanto, os casos em que você precisa implementar os ICurrencyManagerProvider são bastante
raros.
Consulte também
Associação de dados e o Windows Forms
Como criar um controle associado simples em um Windows Form
Vinculação de dados dos Windows Forms
Notificação de alteração na associação de dados do
Windows Forms
03/02/2020 • 5 minutes to read • Edit Online
Um dos conceitos mais importantes da Associação de dados de Windows Forms é a notificação de alteração. Para
garantir que a fonte de dados e os controles vinculados sempre tenham os dados mais recentes, você deve
adicionar a notificação de alteração para a vinculação de dados. Especificamente, você deseja garantir que os
controles associados sejam notificados sobre as alterações que foram feitas em sua fonte de dados, e a fonte de
dados é notificada sobre as alterações feitas nas propriedades associadas de um controle.
Há diferentes tipos de notificação de alteração, dependendo do tipo de associação de dados:
Associação simples, na qual uma única propriedade de controle está associada a uma única instância de um
objeto.
Associação baseada em lista, que pode incluir uma única propriedade de controle associada à propriedade
de um item em uma lista ou uma propriedade de controle associada a uma lista de objetos.
Além disso, se você estiver criando Windows Forms controles que deseja usar para vinculação de dados, deverá
aplicar o padrão de PropertyNamealterado aos controles, de modo que as alterações na propriedade bound de
um controle sejam propagadas para a fonte de dados.
Consulte também
BindingSource
INotifyPropertyChanged
BindingList<T>
Associação de dados do Windows Forms
Fontes de dados com suporte nos Windows Forms
Associação de dados e o Windows Forms
Como: aplicar o padrão PropertyNameChanged
23/10/2019 • 2 minutes to read • Edit Online
O exemplo de código a seguir demonstra como aplicar a PropertyNameChanged padrão para um controle
personalizado. Aplica esse padrão quando você implementa controles personalizados que são usados com o
mecanismo de associação de dados de formulários do Windows.
Exemplo
// This class implements a simple user control
// that demonstrates how to apply the propertyNameChanged pattern.
[ComplexBindingProperties("DataSource", "DataMember")]
public class CustomerControl : UserControl
{
private DataGridView dataGridView1;
private Label label1;
private DateTime lastUpdate = DateTime.Now;
public CustomerControl()
{
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.label1 = new System.Windows.Forms.Label();
this.dataGridView1.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.ImeMode = System.Windows.Forms.ImeMode.Disable;
this.dataGridView1.Location = new System.Drawing.Point(19, 55);
this.dataGridView1.Size = new System.Drawing.Size(350, 150);
this.dataGridView1.TabIndex = 1;
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(19, 23);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(76, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Customer List:";
this.Controls.Add(this.label1);
this.Controls.Add(this.dataGridView1);
this.Size = new System.Drawing.Size(350, 216);
}
}
' This class implements a simple user control
' that demonstrates how to apply the propertyNameChanged pattern.
<ComplexBindingProperties("DataSource", "DataMember")> _
Public Class CustomerControl
Inherits UserControl
Private dataGridView1 As DataGridView
Private label1 As Label
Private lastUpdate As DateTime = DateTime.Now
End Sub
Compilando o código
Para compilar o exemplo de código anterior:
Cole o código em um arquivo de código vazio. Você deve usar o controle personalizado em um formulário do
Windows que contenha um Main método.
Consulte também
Como: Implementar a Interface INotifyPropertyChanged
Notificação de alteração na vinculação de dados dos Windows Forms
Associação de dados do Windows Forms
Como: criar um controle associado e formatar os
dados exibidos
23/10/2019 • 4 minutes to read • Edit Online
Com a associação de dados do Windows Forms, você pode formatar os dados exibidos em um controle associado a
dados usando a caixa de diálogo Formatação e associação avançada .
T IP O DE F O RM ATO O P Ç Ã O DE F O RM ATA Ç Ã O
8. Selecione OK para fechar a caixa de diálogo formatação e Associação avançada e retornar para a janela
Propriedades.
Consulte também
Como: Criar um controle de associação simples em um formulário do Windows
Validação da entrada do usuário nos Windows Forms
Associação de dados do Windows Forms
Como: Criar um controle de associação simples em
um formulário do Windows
23/10/2019 • 2 minutes to read • Edit Online
Com a associação simples, é possível exibir um elemento de dados simples, como um valor de coluna de uma
tabela de dados em um controle. Você pode associar de maneira simples qualquer propriedade de um controle a
um valor de dados.
NOTE
Como controles de associação simples mostram apenas um elemento de dados, é muito comum incluir a lógica de
navegação em um Windows Form com controles de associação simples.
Consulte também
Binding
Associação de dados do Windows Forms
Vinculação de dados e os Windows Forms
Como: assegurar que vários controles associados à
mesma fonte de dados permaneçam sincronizados
23/10/2019 • 5 minutes to read • Edit Online
Muitas vezes, ao trabalhar com vinculação de dados nos Windows Forms, vários controles são associados à
mesma fonte de dados. Em alguns casos, pode ser necessário executar etapas adicionais para garantir que as
propriedades associadas dos controles permaneçam sincronizadas entre si e à fonte de dados. Essas etapas são
necessárias em duas situações:
Se a fonte de dados não implementa IBindingListe, portanto, gerar ListChanged eventos do tipo
ItemChanged.
Se a fonte de dados implementa IEditableObject.
No primeiro caso, você pode usar um BindingSource para associar a fonte de dados aos controles. No último caso,
você deve usar um BindingSource e lidar com o BindingComplete eventos e chame EndCurrentEdit em associado
BindingManagerBase.
Exemplo
O exemplo de código a seguir demonstra como associar três controles — dois controles de caixa de texto e um
DataGridView controle — para a mesma coluna em uma DataSet usando um BindingSource componente. Este
exemplo demonstra como lidar com o BindingComplete evento e certifique-se de que quando o valor de texto de
uma caixa de texto é alterado, a caixa de texto adicionais e o DataGridView controle são atualizados com o valor
correto.
O exemplo usa um BindingSource para associar a fonte de dados e os controles. Como alternativa, você pode
associar os controles diretamente à fonte de dados e recuperar o BindingManagerBase para a associação a partir
do formulário BindingContext e, em seguida, lidar com as BindingComplete evento para o BindingManagerBase.
Para obter um exemplo de como fazer isso, consulte a página de ajuda o BindingComplete eventos de
BindingManagerBase.
End Sub
' Check if the data source has been updated, and that no error has occurred.
If e.BindingCompleteContext = BindingCompleteContext.DataSourceUpdate _
AndAlso e.Exception Is Nothing Then
End Sub
Compilando o código
Este exemplo de código requer
Referências para o System, System.Windows.Forms, e System.Drawing assemblies.
Um formulário com o Load evento como manipulado e uma chamada para o
InitializeControlsAndDataSource método no exemplo a partir do formulário Load manipulador de eventos.
Consulte também
Como: Compartilhar dados associados entre formulários usando o componente BindingSource
Notificação de alteração na vinculação de dados dos Windows Forms
Interfaces relacionadas à vinculação de dados
Associação de dados do Windows Forms
Como: assegurar que a linha selecionada em uma
tabela filho permaneça na posição correta
23/10/2019 • 14 minutes to read • Edit Online
Muitas vezes, ao trabalhar com a vinculação de dados nos Windows Forms, você exibirá dados no que é chamado
de modo de exibição pai/filho ou detalhes/mestre. Isso se refere a um cenário de associação de dados em que os
dados da mesma fonte são exibidos em dois controles. Alterar a seleção em um controle faz com que os dados
exibidos no segundo controle mudem. Por exemplo, o primeiro controle pode conter uma lista de clientes e o
segundo, uma lista de pedidos relacionada ao cliente selecionado no primeiro controle.
Iniciando com o .NET Framework versão 2.0, quando você exibe dados no modo de exibição pai/filho, pode ser
necessário executar etapas adicionais para que a linha selecionada atualmente na tabela filho não seja redefinida
para a primeira linha da tabela. Para fazer isso, será preciso armazenar em cache a posição da tabela filho e
redefini-la após a alteração da tabela pai. Normalmente, a redefinição do filho ocorre na primeira vez que um
campo em uma linha da tabela pai muda.
Para armazenar em cache a posição filho atual
1. Declare uma variável de inteiro para armazenar a posição de lista filho e uma variável booliana para indicar
se a posição filho deve ser armazenada em cache.
End Sub
4. Lidar com a lista de pai CurrentChanged evento para o Gerenciador de moeda pai. No manipulador, defina o
valor booliano para indicar que este não é um cenário de cache. Se o CurrentChanged ocorre, a alteração
para o pai é uma alteração de posição de lista e não uma alteração de valor do item.
' Handle the current changed event. This event occurs when
' the current item is changed, but not when a field of the current
' item is changed.
Private Sub bindingSource1_CurrentChanged(ByVal sender As Object, _
ByVal e As EventArgs) Handles bindingSource1.CurrentChanged
' If the CurrentChanged event occurs, this is not a caching
' situation.
cacheChildPosition = False
End Sub
Exemplo
O exemplo a seguir demonstra como salvar a posição atual no CurrencyManagerpara uma tabela filho e redefinir a
posição após a conclusão de uma edição na tabela pai. Este exemplo contém dois DataGridView controles
associados a duas tabelas em um DataSet usando um BindingSource componente. É estabelecido um
relacionamento entre as duas tabelas e o relacionamento é adicionado para o DataSet. A posição na tabela filho
inicialmente é definida como a terceira linha para fins de demonstração.
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BT2
{
public class Form1 : Form
{
public Form1()
{
InitializeControlsAndDataSource();
}
// Set the data source and member for the second DataGridView.
dataGridView2.DataSource = bindingSource1;
dataGridView2.DataMember = "custOrders";
// Handle the two events for caching and resetting the position.
relatedCM.ListChanged += new ListChangedEventHandler(relatedCM_ListChanged);
relatedCM.PositionChanged
+= new EventHandler(relatedCM_PositionChanged);
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
End Sub
Me.dataGridView2.ColumnHeadersHeightSizeMode = _
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.dataGridView2.Location = New System.Drawing.Point(0, 225)
Me.dataGridView2.Size = New System.Drawing.Size(309, 130)
Me.cachePositionCheckBox.AutoSize = True
Me.cachePositionCheckBox.Checked = True
Me.cachePositionCheckBox.Location = New System.Drawing.Point(150, 175)
Me.cachePositionCheckBox.Name = "radioButton1"
Me.cachePositionCheckBox.Size = New System.Drawing.Size(151, 17)
Me.cachePositionCheckBox.Text = "Cache and restore position"
Me.ClientSize = New System.Drawing.Size(325, 420)
Me.Controls.Add(Me.dataGridView1)
Me.Controls.Add(Me.cachePositionCheckBox)
Me.Controls.Add(Me.dataGridView2)
Me.Controls.Add(Me.button1)
' Set the data source and member for the second DataGridView.
dataGridView2.DataSource = bindingSource1
dataGridView2.DataMember = "custOrders"
' Get the currency manager for the customer orders binding.
Dim relatedCM As CurrencyManager = _
bindingSource1.GetRelatedCurrencyManager("custOrders")
' Handle the two events for caching and resetting the position.
AddHandler relatedCM.ListChanged, AddressOf relatedCM_ListChanged
AddHandler relatedCM.PositionChanged, AddressOf relatedCM_PositionChanged
' Set the position in the child table for demonstration purposes.
relatedCM.Position = 3
End Sub
' Establish the data set with two tables and a relationship
' between them.
Private Function InitializeDataSet() As DataSet
set1 = New DataSet()
' Declare the DataSet and add a table and column.
set1.Tables.Add("Customers")
set1.Tables(0).Columns.Add("CustomerID")
set1.Tables(0).Columns.Add("Customer Name")
set1.Tables(0).Columns.Add("Contact Name")
End Sub
' Handle the current changed event. This event occurs when
' the current item is changed, but not when a field of the current
' item is changed.
Private Sub bindingSource1_CurrentChanged(ByVal sender As Object, _
ByVal e As EventArgs) Handles bindingSource1.CurrentChanged
ByVal e As EventArgs) Handles bindingSource1.CurrentChanged
' If the CurrentChanged event occurs, this is not a caching
' situation.
cacheChildPosition = False
End Sub
<STAThread()> _
Shared Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
Application.Run(New Form1())
End Sub
End Class
Compilando o código
Este exemplo requer:
Referência aos assemblies System, System.Data, System.Drawing, System.Windows.Forms e System.XML.
Consulte também
Como: Certifique-se de vários controles associados à mesma fonte de dados permaneçam sincronizados
Componente BindingSource
Vinculação de dados e os Windows Forms
Como: implementar a interface IListSource
23/10/2019 • 7 minutes to read • Edit Online
Implementar o IListSource interface para criar uma classe vinculável que não implementa IList , mas em vez disso,
fornece uma lista de outro local.
Exemplo
O exemplo de código a seguir demonstra como implementar o IListSource interface. Um componente chamado
EmployeeListSource expõe uma IList para vinculação de dados Implementando o GetList método.
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace IListSourceCS
{
public class EmployeeListSource : Component, IListSource
{
public EmployeeListSource() {}
bool IListSource.ContainsListCollection
{
get { return false; }
}
System.Collections.IList IListSource.GetList()
{
BindingList<Employee> ble = new BindingList<Employee>();
if (!this.DesignMode)
{
ble.Add(new Employee("Aaberg, Jesper", 26000000));
ble.Add(new Employee("Cajhen, Janko", 19600000));
ble.Add(new Employee("Furse, Kari", 19000000));
ble.Add(new Employee("Langhorn, Carl", 16000000));
ble.Add(new Employee("Todorov, Teodor", 15700000));
ble.Add(new Employee("Verebélyi, Ágnes", 15700000));
}
return ble;
}
#endregion
}
}
Imports System.ComponentModel
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New(ByVal Container As System.ComponentModel.IContainer)
MyClass.New()
End Sub
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New()
End Sub
Return ble
End Function
#End Region
End Class
End Class
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace IListSourceCS
{
public class Employee : BusinessObjectBase
{
private string _id;
private string _name;
private Decimal parkingId;
// Set values
this.Name = name;
this.ParkingID = parkingId;
}
public string ID
{
get { return _id; }
}
End Class
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Diagnostics;
namespace IListSourceCS
{
public class BusinessObjectBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
#endregion
}
}
Imports System.ComponentModel
#End Region
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace IListSourceCS
{
public class Form1 : Form
public class Form1 : Form
{
private System.ComponentModel.IContainer components = null;
private FlowLayoutPanel flowLayoutPanel1;
private Label label2;
private DataGridView dataGridView1;
private DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn;
private DataGridViewTextBoxColumn salaryDataGridViewTextBoxColumn;
private DataGridViewTextBoxColumn iDDataGridViewTextBoxColumn;
private EmployeeListSource employeeListSource1;
public Form1()
{
InitializeComponent();
}
#endregion
}
Imports System.ComponentModel
Imports System.Windows.Forms
Me.InitializeComponent()
End Sub
End Sub
Compilando o código
Este exemplo requer:
Referências aos assemblies System.Drawing e System.Windows.Forms.
Consulte também
IListSource
ITypedList
BindingList<T>
IBindingList
Vinculação de dados e os Windows Forms
Como: implementar a interface
INotifyPropertyChanged
23/10/2019 • 5 minutes to read • Edit Online
Exemplo
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
public Form1()
{
InitializeComponent();
set
{
if (value != this.customerNameValue)
{
this.customerNameValue = value;
NotifyPropertyChanged();
}
}
}
set
{
if (value != this.phoneNumberValue)
{
this.phoneNumberValue = value;
NotifyPropertyChanged();
}
}
}
}
}
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Runtime.CompilerServices
Imports System.Windows.Forms
customerList.Add(DemoCustomer.CreateNewCustomer())
customerList.Add(DemoCustomer.CreateNewCustomer())
customerList.Add(DemoCustomer.CreateNewCustomer())
' These fields hold the values for the public properties.
Private idValue As Guid = Guid.NewGuid()
Private customerNameValue As String = String.Empty
Private phoneNumberValue As String = String.Empty
Consulte também
Como: Aplicar o padrão PropertyNameChanged
Associação de dados do Windows Forms
Como: Gerar notificações de alteração usando um BindingSource e a Interface INotifyPropertyChanged
Notificação de alteração na vinculação de dados dos Windows Forms
Como: implementar a interface ITypedList
23/10/2019 • 9 minutes to read • Edit Online
Implementar o ITypedList interface para habilitar a descoberta do esquema para uma lista vinculável.
Exemplo
O exemplo de código a seguir demonstra como implementar o ITypedList interface. Um tipo genérico chamado
SortableBindingList deriva de BindingList<T> classe e implementa o ITypedList interface. Uma classe simples
denominada Customer fornece os dados, o que estão associados ao cabeçalho de uma DataGridView controle.
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Collections;
using System.Reflection;
namespace ITypedListCS
{
[Serializable()]
public class SortableBindingList<T> : BindingList<T>, ITypedList
{
[NonSerialized()]
private PropertyDescriptorCollection properties;
return pdc;
}
#endregion
}
}
Imports System.ComponentModel
Imports System.Collections.Generic
Imports System.Windows.Forms
<Serializable()> _
Public Class SortableBindingList(Of Tkey)
Inherits BindingList(Of Tkey)
Implements ITypedList
<NonSerialized()> _
Private properties As PropertyDescriptorCollection
End Sub
Return pdc
End Function
Return GetType(Tkey).Name
End Function
#End Region
End Class
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace ITypedListCS
{
class Customer : INotifyPropertyChanged
{
public Customer() {}
public Customer(int id, string name, string company, string address, string city, string state, string
zip)
{
this._id = id;
this._name = name;
this._company = company;
this._address = address;
this._city = city;
this._state = state;
this._zip = zip;
}
public int ID
{
get { return _id; }
set
{
if (_id != value)
{
_id = value;
OnPropertyChanged(new PropertyChangedEventArgs("ID"));
}
}
}
#endregion
#endregion
#endregion
}
}
Imports System.ComponentModel
End Sub
Public Sub New(ByVal id As Integer, ByVal name As String, ByVal company As String, ByVal address As
String, ByVal city As String, ByVal state As String, ByVal zip As String)
Me._id = id
Me._name = name
Me._company = company
Me._address = address
Me._city = city
Me._state = state
Me._zip = zip
End Sub
#End Region
#End Region
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ITypedListCS
{
public partial class Form1 : Form
{
private SortableBindingList<Customer> sortableBindingListOfCustomers;
private BindingList<Customer> bindingListOfCustomers;
public Form1()
{
InitializeComponent();
}
this.dataGridView1.DataSource = this.bindingListOfCustomers;
}
#endregion
}
Imports System.ComponentModel
Imports System.Windows.Forms
Me.InitializeComponent()
End Sub
Me.dataGridView1.DataSource = bindingListOfCustomers
End Sub
End Class
Compilando o código
Este exemplo requer:
Referências aos assemblies System.Drawing e System.Windows.Forms.
Consulte também
ITypedList
BindingList<T>
IBindingList
Vinculação de dados e os Windows Forms
Como navegar por dados no Windows Forms
03/02/2020 • 4 minutes to read • Edit Online
Em um aplicativo do Windows, a maneira mais fácil de navegar pelos registros em uma fonte de dados é associar
um componente BindingSource à fonte de dados e, em seguida, associar os controles à BindingSource. Você pode
usar o método de navegação interno no BindingSource MoveNext, MoveLast, MovePrevious e MoveFirst. O uso
desses métodos ajustará as propriedades Position e Current do BindingSource adequadamente. Você também
pode encontrar um item e defini-lo como o item atual definindo a propriedade Position.
Incrementar a posição em uma fonte de dados
1. Defina a propriedade Position do BindingSource para os dados associados à posição do registro para a
qual ir. O exemplo a seguir ilustra o uso do método MoveNext da BindingSource para incrementar a
propriedade Position quando o nextButton é clicado. O BindingSource está associado à tabela de
Customers de um conjunto de Northwind de um DataSet.
NOTE
Definir a propriedade Position como um valor além do primeiro ou último registro não resulta em um erro, pois o
.NET Framework não permitirá que você defina a posição como um valor fora dos limites da lista. Se, no aplicativo,
for importante saber se você passou do primeiro ou do último registro, inclua a lógica para testar se a contagem de
elementos de dados será excedida.
NOTE
Lembre-se de que é necessário alterar a lista em que você está navegando no código, reabilite o botão Próximo ,
para que os usuários possam pesquisar a totalidade da nova lista. Além disso, lembre-se de que o evento de
PositionChanged acima para o BindingSource específico com o qual você está trabalhando precisa estar associado ao
seu método de manipulação de eventos. Veja a seguir um exemplo de um método para manipular o evento de
PositionChanged:
void customersBindingSource_PositionChanged(object sender, EventArgs e)
{
if (customersBindingSource.Position == customersBindingSource.Count - 1)
nextButton.Enabled = false;
else
nextButton.Enabled = true;
}
If customersBindingSource.Position = _
customersBindingSource.Count - 1 Then
nextButton.Enabled = False
Else
nextButton.Enabled = True
End If
End Sub
Consulte também
Fontes de dados com suporte nos Windows Forms
Notificação de alteração na vinculação de dados dos Windows Forms
Associação de dados e o Windows Forms
Associação de dados do Windows Forms
Segurança do Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
O Windows Forms oferece um modelo de segurança baseado em código (os níveis de segurança são definidos
para o código, independentemente do usuário que o executa). Isso vai além de qualquer esquema de segurança
que já pode estar em vigor no seu sistema de computador. Eles podem incluir os do navegador (como a segurança
baseada em zonas disponível no Internet Explorer) ou do sistema operacional (como a segurança baseada em
credenciais do Windows NT).
Nesta seção
Visão geral da segurança dos Windows Forms
Explica brevemente o modelo de segurança do .NET Framework e as etapas básicas necessárias para garantir que
o Windows Forms no seu aplicativo esteja seguro.
Acesso mais seguro a arquivos e a dados nos Windows Forms
Descreve como acessar arquivos e dados em um ambiente de confiança parcial.
Impressão mais segura nos Windows Forms
Descreve como acessar recursos de impressão em um ambiente de confiança parcial.
Considerações adicionais sobre segurança nos Windows Forms
Descreve como realizar manipulação de janela, como usar a Área de Transferência e como fazer chamadas a
código não gerenciado em um ambiente de confiança parcial.
Seções Relacionadas
Política de segurança padrão
Lista as permissões padrão concedidas nos conjuntos de permissão de Confiança Total, Intranet Local e Internet.
Administração de política de segurança geral
Fornece informações sobre como administrar a política de segurança do .NET Framework e elevar as permissões.
Permissões perigosas e administração de política
Discute algumas permissões do .NET Framework que podem potencialmente permitir que o sistema de segurança
seja contornado.
Diretrizes de codificação segura
Fornece links para tópicos que explicam as práticas recomendadas para escrever código com segurança no .NET
Framework.
Solicitando permissões
Discute o uso de atributos que permitem que o runtime saiba quais permissões seu código precisa executar.
Principais conceitos de segurança
Links para tópicos que abrangem aspectos básicos de segurança de código.
Noções Básicas da Segurança de Acesso do Código
Discute as noções básicas de trabalhar com a política de segurança de tempo de execução do .NET Framework.
Determinando quando modificar a política de segurança
Explica como determinar quando seus aplicativos precisam divergir da política de segurança padrão.
Implantando política de segurança
Discute a melhor maneira de implantar alterações de política de segurança.
Visão geral da Segurança do Windows Forms
03/02/2020 • 18 minutes to read • Edit Online
Antes do lançamento da .NET Framework, todo o código em execução no computador de um usuário tinha os
mesmos direitos ou permissões para acessar os recursos que um usuário do computador tinha. Por exemplo, se o
usuário era autorizado a acessar o sistema de arquivos, o código era autorizado a acessar o sistema de arquivos.
Se o usuário era autorizado a acessar um banco de dados, o código era autorizado a acessar o banco de dados.
Embora esses direitos ou permissões possam ser aceitáveis para código em executáveis que o usuário
explicitamente instalou no computador local, eles podem não ser aceitáveis para código potencialmente mal-
intencionado proveniente da Internet ou de uma intranet local. Esse código não deveria ser capaz de acessar
recursos do computador do usuário sem permissão.
O .NET Framework introduz uma infraestrutura chamada segurança de acesso ao código que permite diferenciar
as permissões, ou direitos, que o código tem dos direitos que o usuário tem. Por padrão, o código proveniente da
Internet e da intranet somente pode executar no que é conhecido como confiança parcial. A confiança parcial
sujeita um aplicativo a uma série de restrições: entre outras coisas, um aplicativo é impedido de acessar o disco
rígido local e não pode executar código não gerenciado. O .NET Framework controla os recursos que o código tem
permissão para acessar com base na identidade desse código: de onde ele veio, se ele tem um assembly de nome
forte, se ele está assinado com um certificado e assim por diante.
A tecnologia ClickOnce, que você usa para implantar Windows Forms aplicativos, ajuda a facilitar o
desenvolvimento de aplicativos que são executados em confiança parcial, com confiança total ou em confiança
parcial com permissões elevadas. O ClickOnce fornece recursos como elevação de permissão e implantação de
aplicativo confiável para que seu aplicativo possa solicitar confiança total ou permissões elevadas do usuário local
de uma maneira responsável.
As permissões reais concedidas ao seu aplicativo podem ser diferentes dos valores padrão, porque a política de
segurança pode ser modificada. Isso significa que seu aplicativo pode ter permissão em um computador, mas não
em outro.
TÓ P IC O DESC RIÇ Ã O
- Acesso mais seguro a arquivos e a dados nos Windows Descreve como acessar arquivos e dados em um ambiente de
Forms confiança parcial.
- Impressão mais segura nos Windows Forms Descreve como acessar os recursos de impressão em um
ambiente de confiança parcial.
- Considerações adicionais sobre segurança nos Windows Descreve como realizar manipulação de janela, como usar a
Forms área de transferência e como fazer chamadas a código não
gerenciado em um ambiente de confiança parcial.
A tecnologia escolhida dependerá de seu ambiente de implantação. Para obter mais informações, consulte
Escolhendo uma estratégia de implantação do ClickOnce.
Por padrão, os aplicativos ClickOnce implantados usando o Visual Studio ou as ferramentas SDK do .NET
Framework (Mage. exe e MageUI. exe) são configurados para serem executados em um computador cliente com
confiança total. Se você estiver implantando seu aplicativo usando a confiança parcial ou usando somente
algumas permissões adicionais, você terá que alterar esse padrão. Isso pode ser feito com o Visual Studio ou com
a ferramenta SDK do .NET Framework MageUI. exe quando você configura a implantação. Para obter mais
informações sobre como usar o MageUI. exe, consulte passo a passos: Implantando manualmente um aplicativo
ClickOnce. Consulte também Como definir permissões personalizadas para um aplicativo ClickOnce ou Como
definir permissões personalizadas para um aplicativo ClickOnce.
Para obter mais informações sobre os aspectos de segurança do ClickOnce e a elevação de permissões, consulte
Securing ClickOnce Applications. Para obter mais informações sobre a implantação de aplicativo confiável,
consulte Visão geral da implantação de aplicativos confiáveis.
Testando o aplicativo
Se você tiver implantado seu aplicativo Windows Forms usando o Visual Studio, poderá habilitar a depuração em
confiança parcial ou um conjunto de permissões restritos do ambiente de desenvolvimento. Consulte também
como: Depurar um aplicativo ClickOnce com permissões restritas.
Consulte também
Segurança do Windows Forms
Noções Básicas da Segurança de Acesso do Código
Segurança e implantação do ClickOnce
Visão geral da implantação de aplicativos confiáveis
Mage.exe (Manifest Generation and Editing Tool)
MageUI.exe (Manifest Generation and Editing Tool, cliente gráfico)
Acesso mais seguro a arquivos e dados no Windows
Forms
20/03/2020 • 15 minutes to read • Edit Online
O .NET Framework usa permissões para ajudar a proteger recursos e dados. Onde seu aplicativo pode ler ou
gravar dados depende das permissões concedidas ao aplicativo. Quando seu aplicativo é executado em um
ambiente de confiança parcial, talvez você não tenha acesso aos seus dados ou talvez você precise alterar a
maneira como você acessa os dados.
Quando você encontrar uma restrição de segurança, você tem duas opções: declarar a permissão (supondo que
ela foi concedida ao seu aplicativo) ou use uma versão do recurso escrita para trabalhar em confiança parcial. As
seções a seguir abordam como trabalhar com arquivos, o banco de dados e o acesso ao Registro de aplicativos
que são executados em um ambiente parcialmente confiável.
NOTE
Por padrão, as ferramentas que geram implantações clickOnce padrão essas implantações para solicitar full trust a partir dos
computadores em que eles são executados. Se você decidir que deseja os benefícios adicionais de segurança de executar em
confiança parcial, você deve alterar esse padrão no Visual Studio ou em uma das ferramentas do Windows SDK (Mage.exe
ou MageUI.exe). Para obter mais informações sobre segurança dos Windows Forms e sobre como determinar o nível de
confiança apropriado para seu aplicativo, consulte Visão geral de Segurança nos Windows Forms.
Acesso a arquivos
A FileIOPermission classe controla o acesso a arquivos e pastas no Quadro .NET. Por padrão, o sistema de
FileIOPermission segurança não concede a parte de ambientes de confiança, como a intranet local e zonas de
Internet. No entanto, um aplicativo que requer acesso a arquivos ainda funcionará nesses ambientes se você
modificar o design do seu aplicativo ou usa métodos diferentes para acessar arquivos. Por padrão, a zona da
intranet local recebe o direito de ter o mesmo acesso a sites e o mesmo acesso a diretórios, para conectar-se
novamente ao site de sua origem e ler seu diretório de instalação. Por padrão, a zona da Internet, é apenas o
direito para se conectar novamente ao site de sua origem.
Arquivos especificados pelo usuário
Uma maneira de lidar com a não permissão de acesso ao OpenFileDialog arquivo SaveFileDialog é solicitar ao
usuário que forneça informações específicas do arquivo usando a ou a classe. Essa interação de usuário ajuda a
fornecer alguma garantia de que o aplicativo não pode carregar arquivos particulares ou substituir arquivos
importantes maliciosamente. Os OpenFile OpenFile métodos fornecem acesso a arquivos de leitura e gravação
abrindo o fluxo de arquivos para o arquivo que o usuário especificou. Os métodos também ajudam a proteger o
arquivo do usuário ocultando o caminho do arquivo.
NOTE
Essas permissões são diferentes dependendo se o seu aplicativo estiver na zona da Internet ou zona da Intranet. Os
aplicativos da região OpenFileDialogda Internet só podem usar o , enquanto os aplicativos Intranet têm permissão de
diálogo de arquivo irrestrita.
A FileDialogPermission classe especifica que tipo de caixa de diálogo de arquivo seu aplicativo pode usar. A tabela
a seguir mostra o FileDialog valor que você deve ter para usar cada classe.
C L A SSE VA LO R DE A C ESSO N EC ESSÁ RIO
OpenFileDialog Open
SaveFileDialog Save
NOTE
A permissão específica não OpenFile é solicitada até que o método seja realmente chamado.
A permissão para exibir uma caixa de diálogo de FileDialogarquivo OpenFileDialognão SaveFileDialog concede ao
seu aplicativo acesso total a todos os membros das classes e classes. Para obter as permissões exatas necessárias
para chamar cada método, consulte o tópico de referência para esse método na documentação da biblioteca de
classe .NET Framework.
O exemplo de OpenFile código a seguir usa o método RichTextBox para abrir um arquivo especificado pelo
usuário em um controle. O exemplo FileDialogPermission requer Open e o valor de enumeração associado. O
exemplo demonstra como SecurityException lidar com o para determinar se o recurso de salvamento deve ser
desativado. Este exemplo requer Form que Button o ButtonOpen seu RichTextBox tenha RtfBoxMain um controle
chamado , e um controle chamado .
NOTE
A lógica de programação para o recurso de gravação não é mostrado no exemplo.
Private Sub ButtonOpen_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ButtonOpen.Click
NOTE
No Visual C#, certifique-se de adicionar código para ativar o manipulador de eventos. Ao usar o código do exemplo anterior,
o código a seguir mostra como habilitar o manipulador de eventos.
this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);
Outros arquivos
Às vezes, você precisará ler ou gravar em arquivos que o usuário não especifica, como quando você precisa salvar
as configurações do aplicativo. Na intranet local e zonas da Internet, o aplicativo não terá permissão para
armazenar dados em um arquivo local. No entanto, seu aplicativo poderá armazenar dados no armazenamento
isolado. Armazenamento isolado é um compartimento de dados abstrato (não um local de armazenamento
específico) que contém um ou mais arquivos de armazenamento isolados, chamados de armazenamentos, que
contêm os locais reais dos diretórios nos quais os dados são armazenados. Permissões de FileIOPermission
acesso ao arquivo não são necessárias; em vez IsolatedStoragePermission disso, a classe controla as permissões
para armazenamento isolado. Por padrão, os aplicativos que são executados na intranet local e zonas da Internet
podem armazenar dados usando armazenamento isolado; No entanto, configurações como cota de disco podem
variar. Para obter mais informações sobre armazenamento isolado, consulte Armazenamento Isolado.
O exemplo a seguir usa armazenamento isolado para gravar dados em um arquivo localizado em um repositório.
O exemplo IsolatedStorageFilePermission requer DomainIsolationByUser e o valor de enumeração. O exemplo
demonstra a leitura e Button a escrita de certos valores de propriedade do controle para um arquivo em
armazenamento isolado. A função Read é chamada depois que o aplicativo é iniciado e a função Write é
chamada antes do aplicativo terminar. O exemplo requer Read Write que as funções Form e funções existam
como membros de um que contém um Button controle chamado MainButton .
' Reads the button options from the isolated storage. Uses Default values
' for the button if the options file does not exist.
Public Sub Read()
Dim isoStore As System.IO.IsolatedStorage.IsolatedStorageFile = _
System.IO.IsolatedStorage.IsolatedStorageFile. _
GetUserStoreForDomain()
Me.MainButton.BackColor = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Color)
me.MainButton.ForeColor = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Color)
converter = System.ComponentModel.TypeDescriptor.GetConverter _
(GetType(Font))
me.MainButton.Font = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Font)
Catch ex As Exception
Debug.WriteLine("Cannot read options " + _
ex.ToString())
Finally
reader.Close()
End Try
End If
Catch ex As Exception
Debug.WriteLine("Cannot read options " + ex.ToString())
End Try
End Sub
' Creates the options.txt file and writes the button options to it.
Dim writer as System.IO.StreamWriter
Try
Dim isos As New System.IO.IsolatedStorage.IsolatedStorageFileStream _
(filename, IO.FileMode.CreateNew, isoStore)
converter = System.ComponentModel.TypeDescriptor.GetConverter _
(GetType(Color))
writer.WriteLine(converter.ConvertToString( _
Me.MainButton.BackColor))
writer.WriteLine(converter.ConvertToString( _
Me.MainButton.ForeColor))
Catch ex as Exception
Debug.WriteLine("Cannot write options " + ex.ToString())
Finally
writer.Close()
End Try
End Sub
// Reads the button options from the isolated storage. Uses default values
// for the button if the options file does not exist.
public void Read()
{
System.IO.IsolatedStorage.IsolatedStorageFile isoStore =
System.IO.IsolatedStorage.IsolatedStorageFile.
GetUserStoreForDomain();
this.MainButton.BackColor =
(Color)(converter.ConvertFromString(reader.ReadLine()));
this.MainButton.ForeColor =
(Color)(converter.ConvertFromString(reader.ReadLine()));
converter = TypeDescriptor.GetConverter(typeof(Font));
this.MainButton.Font =
(Font)(converter.ConvertFromString(reader.ReadLine()));
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot read options " + ex.ToString());
}
finally
{
reader.Close();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot read options " + ex.ToString());
}
}
// Creates the options file and writes the button options to it.
System.IO.StreamWriter writer = null;
try
{
System.IO.IsolatedStorage.IsolatedStorageFileStream isos = new
System.IO.IsolatedStorage.IsolatedStorageFileStream(filename,
System.IO.FileMode.CreateNew,isoStore);
converter = TypeDescriptor.GetConverter(typeof(Color));
writer.WriteLine(converter.ConvertToString(
this.MainButton.BackColor));
writer.WriteLine(converter.ConvertToString(
this.MainButton.ForeColor));
converter = TypeDescriptor.GetConverter(typeof(Font));
writer.WriteLine(converter.ConvertToString(
this.MainButton.Font));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot write options " + ex.ToString());
}
finally
{
writer.Close();
}
}
Acesso ao Registro
A RegistryPermission classe controla o acesso ao registro do sistema operacional. Por padrão, somente aplicativos
que estão sendo executados localmente podem acessar o Registro. RegistryPermissionapenas concede a um
aplicativo o direito de tentar o acesso ao registro; não garante que o acesso será bem sucedido, pois o sistema
operacional ainda impõe segurança no registro.
Como você não pode acessar o Registro sob confiança parcial, você precisará encontrar outros métodos para
armazenar seus dados. Quando você armazena configurações do aplicativo, use o armazenamento isolado em vez
de no Registro. Armazenamento isolado também pode ser usado para armazenar outros arquivos específicos do
aplicativo. Você também pode armazenar informações globais do aplicativo sobre o servidor ou site de origem,
porque, por padrão, um aplicativo recebe o direito de acessar o seu site de origem.
Confira também
Impressão mais segura no Windows Forms
Considerações adicionais sobre segurança nos Windows Forms
Visão geral da Segurança do Windows Forms
Segurança de formulários do Windows
Mage.exe (Manifest Generation and Editing Tool)
MageUI.exe (Manifest Generation and Editing Tool, cliente gráfico)
Impressão mais segura no Windows Forms
03/02/2020 • 2 minutes to read • Edit Online
Aplicativos dos Windows Forms com frequência incluem recursos de impressão. O .NET Framework usa a classe
PrintingPermission para controlar o acesso a recursos de impressão e o valor de enumeração
PrintingPermissionLevel associado para indicar o nível de acesso. Por padrão, a impressão é habilitada por padrão
nas zonas da Internet e da Intranet Local. No entanto, o nível de acesso é restrito em ambas as zonas. Não
importa se o seu aplicativo pode imprimir, requer interação do usuário ou não pode imprimir, isso dependerá do
valor da permissão concedida ao aplicativo. Por padrão, a zona da intranet local recebe DefaultPrinting acesso e a
zona da intranet recebe acesso SafePrinting.
A tabela a seguir mostra a funcionalidade disponível em cada nível de permissão de impressão.
Consulte também
Acesso mais seguro a arquivos e a dados nos Windows Forms
Considerações adicionais sobre segurança nos Windows Forms
Visão geral da segurança dos Windows Forms
Segurança do Windows Forms
Considerações adicionais sobre Segurança do
Windows Forms
03/02/2020 • 13 minutes to read • Edit Online
.NET Framework configurações de segurança podem fazer com que seu aplicativo seja executado de forma
diferente em um ambiente de confiança parcial do que no computador local. O .NET Framework restringe o
acesso a recursos locais críticos como o sistema de arquivos, a rede e as APIs não gerenciadas, entre outras coisas.
As configurações de segurança afetam a capacidade de chamar a API do Microsoft Windows ou outras APIs que
não podem ser verificadas pelo sistema de segurança. A segurança também afeta outros aspectos do seu
aplicativo, incluindo acesso a arquivos e dados e impressão. Para obter mais informações sobre o acesso a
arquivos e dados em um ambiente de confiança parcial, consulte acesso a dados e arquivos mais seguros em
Windows Forms. Para obter mais informações sobre como imprimir em um ambiente de confiança parcial,
consulte impressão mais segura em Windows Forms.
As seções a seguir discutem como trabalhar com a área de transferência, executar a manipulação de janela e
chamar a API do Windows de aplicativos que estão sendo executados em um ambiente de confiança parcial.
Por padrão, a zona da intranet local recebe AllClipboard acesso e a zona da Internet recebe acesso OwnClipboard.
Isso significa que o aplicativo pode copiar dados para a área de transferência, mas o aplicativo não pode colar ou
ler de forma programática a partir da área de transferência. Essas restrições impedem que programas sem
confiança total leiam conteúdo copiado para a área de transferência por outro aplicativo. Se seu aplicativo exigir
acesso completo à área de transferência, mas você não tiver as permissões, você precisará elevar as permissões
para seu aplicativo. Para obter mais informações sobre como elevar permissões, consulte Administração de
política de segurança geral.
Manipulação de janela
A classe UIPermission também controla a permissão para executar a manipulação de janela e outras ações
relacionadas à interface do usuário, e o valor de enumeração associado UIPermissionWindow indica o nível de
acesso. A tabela a seguir mostra os níveis de permissão possíveis.
Por padrão, a zona da intranet local recebe AllWindows acesso e a zona da Internet recebe acesso
SafeTopLevelWindows. Isso significa que, na zona da Internet, o aplicativo pode executar a maioria das ações da
janela e da interface do usuário, mas a aparência da janela será modificada. A janela modificado exibe uma
notificação de balão quando executada pela primeira vez, contém texto de barra de título modificado e requer um
botão fechar na barra de título. A notificação de balão e a barra de título identificam o usuário do aplicativo que o
aplicativo está executando sob confiança parcial.
Cada nível de permissão identificado pela enumeração de UIPermissionWindow permite menos ações do que o
nível acima. As tabelas a seguir indicam as ações que são restritas pelo SafeTopLevelWindows e valores de
SafeSubWindows. Para obter permissões exatas que são necessárias para cada membro, consulte a referência
para esse membro na documentação da biblioteca de classes do .NET Framework.
SafeTopLevelWindows permissão restringe as ações listadas na tabela a seguir.
C O M P O N EN T E A Ç Õ ES REST RITA S
O valor de SafeSubWindows restringe as ações listadas na tabela a seguir, além das restrições colocadas pelo
valor de SafeTopLevelWindows.
C O M P O N EN T E A Ç Õ ES REST RITA S
C O M P O N EN T E { 1>M EM B RO <1}
Se seu aplicativo não tiver permissão para chamar código não gerenciado, seu aplicativo deverá solicitar
UnmanagedCode permissão ou você deve considerar maneiras alternativas de implementar recursos; em muitos
casos, o Windows Forms fornece uma alternativa gerenciada para funções de API do Windows. Se nenhum meio
alternativo existir e o aplicativo precisar acessar o código não gerenciado, você precisará elevar as permissões
para o aplicativo.
A permissão para chamar código não gerenciado permite que um aplicativo execute a maioria de qualquer coisa.
Portanto, a permissão para chamar código não gerenciado só deve ser concedida para aplicativos provenientes de
uma fonte confiável. Como alternativa, dependendo do aplicativo, a parte da funcionalidade do aplicativo que faz
a chamada para código não gerenciado poderia ser opcional ou habilitada somente no ambiente de confiança
total. Para obter mais informações sobre permissões perigosas, consulte permissões perigosas e administração de
diretivas. Para obter mais informações sobre como elevar permissões, consulte Administração de política de
segurança geral.
Consulte também
Acesso mais seguro a arquivos e a dados nos Windows Forms
Impressão mais segura nos Windows Forms
Visão geral da segurança dos Windows Forms
Segurança do Windows Forms
Protegendo aplicativos ClickOnce
Implantação do ClickOnce para o Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
Os tópicos a seguir descrevem o ClickOnce, uma tecnologia usada para implantar facilmente Windows Forms
aplicativos em computadores cliente.
Seções Relacionadas
Escolhendo uma estratégia de implantação do ClickOnce
Apresenta várias opções para implantar aplicativos ClickOnce.
Escolhendo uma estratégia de atualização do ClickOnce
Apresenta várias opções para atualizar aplicativos ClickOnce.
Protegendo aplicativos ClickOnce
Explica as implicações de segurança da implantação do ClickOnce.
Solução de problemas de implantações ClickOnce
Descreve vários problemas que podem ocorrer ao implantar aplicativos ClickOnce e documenta as mensagens de
erro de nível superior que o ClickOnce pode gerar.
O ClickOnce e as configurações de aplicativo
Descreve como a implantação do ClickOnce funciona com as configurações do aplicativo, que armazena as
configurações do aplicativo e do usuário para recuperação futura.
Visão geral da implantação de aplicativos confiáveis
Descreve um recurso do ClickOnce que permite que aplicativos confiáveis sejam executados com um nível mais
alto de permissão em computadores cliente.
ClickOnce e Authenticode
Descreve como a tecnologia Authenticode é usada na implantação de aplicativos confiáveis.
Passo a passo: implantando um aplicativo ClickOnce manualmente
Demonstra o uso de ferramentas de linha de comando e SDK para implantar um aplicativo ClickOnce sem usar o
Visual Studio.
Como adicionar um fornecedor confiável a um computador cliente para aplicativos ClickOnce
Demonstra a configuração única de computadores cliente necessários para a implantação de aplicativos confiáveis.
Como especificar um local alternativo para atualizações da implantação
Demonstra a configuração de um aplicativo ClickOnce, usando ferramentas do SDK, para verificar um local
diferente para novas versões de um aplicativo.
Passo a passo: baixando assemblies sob demanda com a API de implantação do ClickOnce
Demonstra o uso de chamadas de API para recuperar um assembly na primeira vez que seu aplicativo tenta
carregá-lo.
Como recuperar informações de cadeia de caracteres de consulta em um aplicativo ClickOnce online
Demonstra a recuperação de parâmetros da URL usada para executar um aplicativo ClickOnce.
Visão geral do cache do ClickOnce
Descreve o cache usado para armazenar aplicativos ClickOnce no computador local.
Acessando dados locais e remotos em aplicativos ClickOnce
Descreve como acessar arquivos de dados locais e fontes de dados remotas de um aplicativo ClickOnce.
Como incluir um arquivo de dados em um aplicativo ClickOnce
Demonstra como marcar um arquivo para que ele esteja disponível no diretório de dados do ClickOnce.
Consulte também
Visão Geral das Configurações do Aplicativo
Publicando aplicativos ClickOnce
Compilando aplicativos ClickOnce por meio da linha de comando
Depurando aplicativos ClickOnce que usam System.Deployment.Application
Implantando componentes do COM com o ClickOnce
Como publicar um aplicativo ClickOnce usando o Assistente de Publicação
Melhorias de acessibilidade nos controles do
Windows Forms para .NET Core 3.0
21/04/2020 • 9 minutes to read • Edit Online
O Windows Forms continua a melhorar a forma como funciona com as tecnologias de acessibilidade para melhor
apoiar os clientes do Windows Forms. essas melhorias incluem as seguintes alterações:
Mudanças em várias áreas de interação com aplicativos clientes de acessibilidade, incluindo o Narrator.
Alterações na hierarquia acessível (melhora da navegação por meio da árvore de automação de interface do
usuário).
Alterações na navegação do teclado.
IMPORTANT
As alterações de acessibilidade feitas no Quadro .NET 4.7.1 até o .NET Framework 4.8 estão incluídas no .NET Core 3.0 ou
superior, e são habilitadas por padrão. O .NET Framework suportava switches de compatibilidade que permitiam que os
aplicativos optassem por não usar o novo comportamento de acessibilidade. Por outro lado, o .NET Core não suporta essas
configurações e não permite que os aplicativos optem pelo comportamento de acessibilidade.
A partir do .NET Core 3.0, os aplicativos do Windows Forms se beneficiam de todos os novos recursos de
acessibilidade (introduzidos no .NET Framework 4.7.1 - 4.8) sem configuração adicional.
Confira também
Práticas recomendadas de acessibilidade.
Como acessar coleções indexadas por chave no
Windows Forms
03/02/2020 • 2 minutes to read • Edit Online
Você pode acessar itens de coleção individuais por chave. Essa funcionalidade foi adicionada a muitas
classes de coleção que normalmente são usadas por aplicativos dos Windows Forms. A lista a seguir exibe
algumas das classes de coleção que têm coleções acessíveis por chave:
ListView.ListViewItemCollection
ListViewItem.ListViewSubItemCollection
Control.ControlCollection
TabControl.TabPageCollection
TreeNodeCollection
Normalmente, a chave associada a um item em uma coleção é o nome do item. Os procedimentos a seguir
mostram como usar classes de coleção para executar tarefas comuns.
Para localizar e colocar em foco um controle aninhado em uma coleção de controles
Use os métodos Find e Focus para especificar o nome do controle para localizar e dar o foco.
this.BackgroundImage = imageList1.Images["logo.gif"];
Me.BackgroundImage = imageList1.Images("logo.gif")
tabControl1.SelectedTab = tabControl1.TabPages["shippingOptions"];
tabControl1.SelectedTab = tabControl1.TabPages("shippingOptions")
Consulte também
Introdução ao Windows Forms
Como adicionar ou remover imagens com o componente ImageList dos Windows Forms
Aprimorando aplicativos do Windows Forms
03/02/2020 • 3 minutes to read • Edit Online
O Windows Forms contém muitos recursos que você pode usar para aprimorar seus aplicativos do Windows para
atender às necessidades específicas dos seus usuários. Os tópicos a seguir descrevem esses recursos e como usá-
los.
Nesta seção
Elementos Gráficos e Desenho nos Windows Forms
Contém links para tópicos que descrevem e mostram como usar a interface gráfica nos Windows Forms.
Configurações de aplicativo para Windows Forms.
Contém links para tópicos que descrevem e mostram como usar o recurso de Configurações de Aplicativo .
Suporte à impressão nos Windows Forms
Contém links para tópicos que descrevem e mostram como imprimir arquivos de Aplicativos dos Windows Forms.
Operações do Tipo "Arrastar e Soltar" e Suporte à Área de Transferência
Contém links para tópicos que descrevem e mostram como usar o recurso do tipo "arrastar e soltar" e a área de
transferência nos Windows Forms.
Rede em Aplicativos dos Windows Forms
Contém links para tópicos que descrevem e mostram como usar redes nos Windows Forms.
Globalizando aplicativos Windows Forms
Contém links para tópicos que mostram como globalizar aplicativos dos Windows Forms.
Windows Forms e aplicativos não gerenciados
Contém links para tópicos que descrevem e mostram como acessar componentes COM de Aplicativos do
Windows Form.
Informações do Sistema e o Windows Forms
Descreve como usar informações do sistema nos Windows Forms.
Gerenciamento de Energia nos Windows Forms
Descreve como gerenciar o uso de energia em Aplicativos dos Windows Forms.
Herança Visual dos Windows Forms
Descreve como herdar de um formulário base.
Aplicativos da interface MDI (Interface de Vários Documentos)
Descreve como criar aplicativos de interface MDI (Interface de Vários Documentos).
Integrando a Ajuda do Usuário nos Windows Forms
Descreve como integrar a Ajuda do usuário aos seus aplicativos.
Acessibilidade dos Windows Forms
Descreve como disponibilizar seus aplicativos para uma ampla variedade de usuários.
Usando Controles do WPF
Descreve como usar controles WPF em seus aplicativos dos Windows Forms.
Seções Relacionadas
Sistemas de Ajuda em Aplicativos dos Windows Forms
Contém links para tópicos que descrevem e mostram como fornecer Ajuda do usuário em Aplicativos dos
Windows Forms.
Introdução ao Windows Forms
Contém links para tópicos que descrevem como usar os recursos básicos dos Windows Forms.