Sobre o Windows

Este tópico descreve os elementos de programação que os aplicativos usam para criar e usar janelas; gerenciar relações entre janelas; e dimensionar, mover e exibir janelas.

A visão geral inclui os tópicos a seguir.

Janela da Área de Trabalho

Quando você inicia o sistema, ele cria automaticamente a janela da área de trabalho. A janela da área de trabalho é uma janela definida pelo sistema que pinta a tela de fundo da tela e serve como base para todas as janelas exibidas por todos os aplicativos.

A janela da área de trabalho usa um bitmap para pintar a tela de fundo da tela. O padrão criado pelo bitmap é chamado de papel de parede da área de trabalho. Por padrão, a janela da área de trabalho usa o bitmap de um arquivo de .bmp especificado no registro como o papel de parede da área de trabalho.

A função GetDesktopWindow retorna um identificador para a janela da área de trabalho.

Um aplicativo de configuração do sistema, como um item Painel de Controle, altera o papel de parede da área de trabalho usando a função SystemParametersInfo com o parâmetro wAction definido como SPI_SETDESKWALLPAPER e o parâmetro lpvParam especificando um nome de arquivo bitmap. SystemParametersInfo carrega o bitmap do arquivo especificado, usa o bitmap para pintar o plano de fundo da tela e insere o novo nome de arquivo no registro.

Windows do aplicativo

Cada aplicativo gráfico baseado no Windows cria pelo menos uma janela, chamada janela main, que serve como a interface primária entre o usuário e o aplicativo. A maioria dos aplicativos também cria outras janelas, direta ou indiretamente, para executar tarefas relacionadas à janela main. Cada janela desempenha um papel na exibição da saída e no recebimento de entrada do usuário.

Quando você inicia um aplicativo, o sistema também associa um botão da barra de tarefas ao aplicativo. O botão da barra de tarefas contém o ícone e o título do programa. Quando o aplicativo está ativo, seu botão da barra de tarefas é exibido no estado enviado por push.

Uma janela do aplicativo inclui elementos como uma barra de título, uma barra de menus, o menu da janela (anteriormente conhecido como menu do sistema), o botão minimizar, o botão maximizar, o botão restaurar, o botão fechar, uma borda de dimensionamento, uma área do cliente, uma barra de rolagem horizontal e uma barra de rolagem vertical. A janela main de um aplicativo normalmente inclui todos esses componentes. A ilustração a seguir mostra esses componentes em uma janela de main típica.

janela típica

Área do Cliente

A área do cliente é a parte de uma janela em que o aplicativo exibe a saída, como texto ou gráficos. Por exemplo, um aplicativo de publicação da área de trabalho exibe a página atual de um documento na área de cliente. O aplicativo deve fornecer uma função, chamada de procedimento de janela, para processar a entrada na janela e exibir a saída na área do cliente. Para obter mais informações, confira Procedimentos do Windows.

Área não cliente

A barra de título, a barra de menus, o menu da janela, os botões minimizar e maximizar, a borda de dimensionamento e as barras de rolagem são chamados coletivamente de área não cliente da janela. O sistema gerencia a maioria dos aspectos da área não cliente; o aplicativo gerencia a aparência e o comportamento de sua área de cliente.

A barra de título exibe um ícone definido pelo aplicativo e uma linha de texto; normalmente, o texto especifica o nome do aplicativo ou indica a finalidade da janela. Um aplicativo especifica o ícone e o texto ao criar a janela. A barra de título também possibilita que o usuário mova a janela usando um mouse ou outro dispositivo apontador.

A maioria dos aplicativos inclui uma barra de menus que lista os comandos compatíveis com o aplicativo. Os itens na barra de menus representam as categorias main de comandos. Clicar em um item na barra de menus normalmente abre um menu pop-up cujos itens correspondem às tarefas dentro de uma determinada categoria. Ao clicar em um comando, o usuário direciona o aplicativo para executar uma tarefa.

O menu de janela é criado e gerenciado pelo sistema. Ele contém um conjunto padrão de itens de menu que, quando escolhidos pelo usuário, definem o tamanho ou a posição de uma janela, fecham o aplicativo ou executam tarefas. Para obter mais informações, consulte Menus.

Os botões no canto superior direito afetam o tamanho e a posição da janela. Quando você clica no botão maximizar, o sistema amplia a janela para o tamanho da tela e posiciona a janela, para que ela cubra toda a área de trabalho, menos a barra de tarefas. Ao mesmo tempo, o sistema substitui o botão maximizar pelo botão restaurar. Quando você clica no botão restaurar, o sistema restaura a janela para seu tamanho e posição anteriores. Quando você clica no botão minimizar, o sistema reduz a janela para o tamanho do botão da barra de tarefas, posiciona a janela sobre o botão da barra de tarefas e exibe o botão da barra de tarefas em seu estado normal. Para restaurar o aplicativo para seu tamanho e posição anteriores, clique no botão da barra de tarefas. Quando você clica no botão Fechar, o aplicativo é encerrado.

A borda de dimensionamento é uma área ao redor do perímetro da janela que permite ao usuário dimensionar a janela usando um mouse ou outro dispositivo apontador.

A barra de rolagem horizontal e a barra de rolagem vertical convertem a entrada do mouse ou do teclado em valores que um aplicativo usa para deslocar o conteúdo da área do cliente horizontal ou verticalmente. Por exemplo, um aplicativo de processamento de palavras que exibe um documento longo normalmente fornece uma barra de rolagem vertical para permitir que o usuário pagine para cima e para baixo por meio do documento.

Controles e caixas de diálogo

Um aplicativo pode criar vários tipos de janelas além de sua janela main, incluindo controles e caixas de diálogo.

Um controle é uma janela que um aplicativo usa para obter uma informação específica do usuário, como o nome de um arquivo a ser aberto ou o tamanho desejado de uma seleção de texto. Os aplicativos também usam controles para obter informações necessárias para controlar um recurso específico de um aplicativo. Por exemplo, um aplicativo de processamento de palavras normalmente fornece um controle para permitir que o usuário ative e desative o encapsulamento de palavras. Para obter mais informações, consulte Controles do Windows.

Os controles são sempre usados em conjunto com outra janela— normalmente, uma caixa de diálogo. Uma caixa de diálogo é uma janela que contém um ou mais controles. Um aplicativo usa uma caixa de diálogo para solicitar ao usuário a entrada necessária para concluir um comando. Por exemplo, um aplicativo que inclui um comando para abrir um arquivo exibiria uma caixa de diálogo que inclui controles nos quais o usuário especifica um caminho e um nome de arquivo. As caixas de diálogo normalmente não usam o mesmo conjunto de componentes de janela que uma janela main. A maioria tem uma barra de título, um menu de janela, uma borda (sem dimensionamento) e uma área de cliente, mas normalmente não têm uma barra de menus, minimizar e maximizar botões ou barras de rolagem. Para obter mais informações, consulte Caixas de diálogo.

Uma caixa de mensagem é uma caixa de diálogo especial que exibe uma anotação, cuidado ou aviso ao usuário. Por exemplo, uma caixa de mensagem pode informar o usuário sobre um problema que o aplicativo encontrou ao executar uma tarefa. Para obter mais informações, consulte Caixas de mensagens.

Atributos de janela

Um aplicativo deve fornecer as seguintes informações ao criar uma janela. (Com exceção do Identificador de Janela, que a função de criação retorna para identificar exclusivamente a nova janela.)

Esses atributos de janela são descritos nas seções a seguir.

Nome da Classe

Cada janela pertence a uma classe de janela. Um aplicativo deve registrar uma classe de janela antes de criar qualquer janela dessa classe. A classe de janela define a maioria dos aspectos da aparência e do comportamento de uma janela. O componente principal de uma classe de janela é o procedimento de janela, uma função que recebe e processa todas as entradas e solicitações enviadas para a janela. O sistema fornece a entrada e as solicitações na forma de mensagens. Para obter mais informações, consulte Classes de janela, procedimentos de janela e mensagens e filas de mensagens.

Nome da Janela

Um nome de janela é uma cadeia de texto que identifica uma janela para o usuário. Uma janela main, uma caixa de diálogo ou uma caixa de mensagem normalmente exibe o nome da janela na barra de título, se presente. Um controle pode exibir o nome da janela, dependendo da classe do controle. Por exemplo, botões, controles de edição e controles estáticos exibem seus nomes de janela dentro do retângulo ocupado pelo controle . No entanto, controles como caixas de listagem e caixas de combinação não exibem seus nomes de janela.

Para alterar o nome da janela depois de criar uma janela, use a função SetWindowText . Essa função usa as funções GetWindowTextLength e GetWindowText para recuperar a cadeia de caracteres de nome de janela atual da janela.

Estilo de Janela

Cada janela tem um ou mais estilos de janela. Um estilo de janela é uma constante nomeada que define um aspecto da aparência e do comportamento da janela que não é especificado pela classe da janela. Um aplicativo geralmente define estilos de janela ao criar janelas. Ele também pode definir os estilos depois de criar uma janela usando a função SetWindowLong .

O sistema e, até certo ponto, o procedimento de janela para a classe , interpretam os estilos de janela.

Alguns estilos de janela se aplicam a todas as janelas, mas a maioria se aplica a janelas de classes de janela específicas. Os estilos gerais de janela são representados por constantes que começam com o prefixo WS_; eles podem ser combinados com o operador OR para formar diferentes tipos de janelas, incluindo janelas main, caixas de diálogo e janelas filho. Os estilos de janela específicos da classe definem a aparência e o comportamento das janelas pertencentes às classes de controle predefinidas. Por exemplo, a classe SCROLLBAR especifica um controle de barra de rolagem, mas os estilos SBS_HORZ e SBS_VERT determinam se um controle de barra de rolagem horizontal ou vertical é criado.

Para obter listas de estilos que podem ser usados pelo Windows, consulte os seguintes tópicos:

Estilo de janela estendido

Opcionalmente, cada janela pode ter um ou mais estilos de janela estendidos. Um estilo de janela estendida é uma constante nomeada que define um aspecto da aparência e do comportamento da janela que não é especificado pela classe de janela ou pelos outros estilos de janela. Um aplicativo geralmente define estilos de janela estendidos ao criar janelas. Ele também pode definir os estilos depois de criar uma janela usando a função SetWindowLong .

Para obter mais informações, consulte CreateWindowEx.

Posição

A posição de uma janela é definida como as coordenadas do canto superior esquerdo. Essas coordenadas, às vezes chamadas de coordenadas de janela, são sempre relativas ao canto superior esquerdo da tela ou, para uma janela filho, ao canto superior esquerdo da área do cliente da janela pai. Por exemplo, uma janela de nível superior com as coordenadas (10,10) é colocada 10 pixels à direita do canto superior esquerdo da tela e 10 pixels abaixo dela. Uma janela filho com as coordenadas (10,10) é colocada 10 pixels à direita do canto superior esquerdo da área do cliente da janela pai e 10 pixels abaixo dela.

A função WindowFromPoint recupera um identificador para a janela que ocupa um ponto específico na tela. Da mesma forma, as funções ChildWindowFromPoint e ChildWindowFromPointEx recuperam um identificador para a janela filho ocupando um ponto específico na área do cliente da janela pai. Embora ChildWindowFromPointEx possa ignorar janelas filho invisíveis, desabilitadas e transparentes, ChildWindowFromPoint não pode.

Tamanho

O tamanho de uma janela (largura e altura) é dado em pixels. Uma janela pode ter largura ou altura zero. Se um aplicativo definir a largura e a altura de uma janela como zero, o sistema definirá o tamanho como o tamanho mínimo padrão da janela. Para descobrir o tamanho mínimo padrão da janela, um aplicativo usa a função GetSystemMetrics com os sinalizadores SM_CXMIN e SM_CYMIN .

Um aplicativo pode precisar criar uma janela com uma área de cliente de um tamanho específico. As funções AdjustWindowRect e AdjustWindowRectEx calculam o tamanho necessário de uma janela com base no tamanho desejado da área do cliente. O aplicativo pode passar os valores de tamanho resultantes para a função CreateWindowEx .

Um aplicativo pode dimensionar uma janela para que ela seja extremamente grande; no entanto, ele não deve dimensionar uma janela para que ela seja maior que a tela. Antes de definir o tamanho de uma janela, o aplicativo deve marcar a largura e a altura da tela usando GetSystemMetrics com os sinalizadores SM_CXSCREEN e SM_CYSCREEN.

Identificador de janela pai ou proprietário

Uma janela pode ter uma janela pai. Uma janela que tem um pai é chamada de janela filho. A janela pai fornece o sistema de coordenadas usado para posicionar uma janela filho. Ter uma janela pai afeta aspectos da aparência de uma janela; por exemplo, uma janela filho é recortada para que nenhuma parte da janela filho possa aparecer fora das bordas de sua janela pai.

Uma janela que não tem pai ou cujo pai é a janela da área de trabalho é chamada de janela de nível superior. Um aplicativo pode usar a função EnumWindows para obter um identificador para cada janela de nível superior na tela. EnumWindows passa o identificador para cada janela de nível superior, por sua vez, para uma função de retorno de chamada definida pelo aplicativo, EnumWindowsProc.

Uma janela de nível superior pode possuir ou pertencer a outra janela. Uma janela de propriedade sempre aparece na frente da janela do proprietário, fica oculta quando a janela do proprietário é minimizada e é destruída quando a janela do proprietário é destruída. Para obter mais informações, consulte Windows de propriedade.

Uma janela filho pode ter um identificador de janela filho , um valor exclusivo definido pelo aplicativo associado à janela filho. Identificadores de janela filho são especialmente úteis em aplicativos que criam várias janelas filho. Ao criar uma janela filho, um aplicativo especifica o identificador da janela filho. Depois de criar a janela, o aplicativo pode alterar o identificador da janela usando a função SetWindowLong ou pode recuperar o identificador usando a função GetWindowLong .

Cada janela, exceto uma janela filho, pode ter um menu. Um aplicativo pode incluir um menu fornecendo um identificador de menu ao registrar a classe da janela ou ao criar a janela.

Identificador de Instância de Aplicativo

Cada aplicativo tem um identificador de instância associado a ele. O sistema fornece o identificador de instância para um aplicativo quando o aplicativo é iniciado. Como ele pode executar várias cópias do mesmo aplicativo, o sistema usa identificadores de instância internamente para distinguir uma instância de um aplicativo de outra. O aplicativo deve especificar o identificador de instância em muitas janelas diferentes, incluindo aquelas que criam janelas.

Dados de criação

Cada janela pode ter dados de criação definidos pelo aplicativo associados a ela. Quando a janela é criada pela primeira vez, o sistema passa um ponteiro para os dados para o procedimento de janela da janela que está sendo criada. O procedimento de janela usa os dados para inicializar variáveis definidas pelo aplicativo.

Identificador da Janela

Depois de criar uma janela, a função de criação retorna um identificador de janela que identifica exclusivamente a janela. Um identificador de janela tem o tipo de dados HWND ; um aplicativo deve usar esse tipo ao declarar uma variável que contém um identificador de janela. Um aplicativo usa esse identificador em outras funções para direcionar suas ações para a janela.

Um aplicativo pode usar a função FindWindow para descobrir se existe uma janela com o nome de classe ou o nome da janela especificado no sistema. Se essa janela existir, FindWindow retornará um identificador para a janela. Para limitar a pesquisa às janelas filho de um aplicativo específico, use a função FindWindowEx .

A função IsWindow determina se um identificador de janela identifica uma janela válida existente. Há constantes especiais que podem substituir um identificador de janela em determinadas funções. Por exemplo, um aplicativo pode usar HWND_BROADCAST nas funções SendMessage e SendMessageTimeout ou HWND_DESKTOP na função MapWindowPoints .

Criação de janela

Para criar janelas de aplicativos, use a função CreateWindow ou CreateWindowEx . Você deve fornecer as informações necessárias para definir os atributos de janela. CreateWindowEx tem um parâmetro, dwExStyle, que CreateWindow não tem; caso contrário, as funções são idênticas. Na verdade, CreateWindow simplesmente chama CreateWindowEx com o parâmetro dwExStyle definido como zero. Por esse motivo, o restante dessa visão geral refere-se apenas a CreateWindowEx.

Esta seção contém os seguintes tópicos:

Observação

Há funções adicionais para criar janelas de finalidade especial, como caixas de diálogo e caixas de mensagem. Para obter mais informações, consulte DialogBox, CreateDialog e MessageBox.

 

Criação da Janela Principal

Cada aplicativo baseado no Windows deve ter o WinMain como sua função de ponto de entrada. O WinMain executa várias tarefas, incluindo registrar a classe de janela para a janela main e criar a janela main. O WinMain registra a classe de janela main chamando a função RegisterClass e cria a janela main chamando a função CreateWindowEx.

Sua função WinMain também pode limitar seu aplicativo a uma única instância. Crie um mutex nomeado usando a função CreateMutex . Se GetLastError retornar ERROR_ALREADY_EXISTS, outra instância do aplicativo existirá (ele criou o mutex) e você deverá sair do WinMain.

O sistema não exibe automaticamente a janela main depois de criá-la; em vez disso, um aplicativo deve usar a função ShowWindow para exibir a janela main. Depois de criar a janela main, a função WinMain do aplicativo chama ShowWindow, passando-a dois parâmetros: um identificador para a janela main e um sinalizador especificando se a janela main deve ser minimizada ou maximizada quando é exibida pela primeira vez. Normalmente, o sinalizador pode ser definido como qualquer uma das constantes que começam com o prefixo SW_. No entanto, quando ShowWindow é chamado para exibir a janela main do aplicativo, o sinalizador deve ser definido como SW_SHOWDEFAULT. Esse sinalizador informa ao sistema para exibir a janela conforme direcionado pelo programa que iniciou o aplicativo.

Se uma classe de janela tiver sido registrada com a versão Unicode do RegisterClass, a janela receberá apenas mensagens Unicode. Para determinar se uma janela usa o conjunto de caracteres Unicode ou não, chame IsWindowUnicode.

mensagens Window-Creation

Ao criar qualquer janela, o sistema envia mensagens para o procedimento de janela da janela. O sistema envia a mensagem WM_NCCREATE depois de criar a área não cliente da janela e a mensagem WM_CREATE depois de criar a área do cliente. O procedimento de janela recebe ambas as mensagens antes que o sistema exiba a janela. Ambas as mensagens incluem um ponteiro para uma estrutura CREATETRUCT que contém todas as informações especificadas na função CreateWindowEx . Normalmente, o procedimento de janela executa tarefas de inicialização ao receber essas mensagens.

Ao criar uma janela filho, o sistema envia a mensagem WM_PARENTNOTIFY para a janela pai depois de enviar as mensagens WM_NCCREATE e WM_CREATE . Ele também envia outras mensagens durante a criação de uma janela. O número e a ordem dessas mensagens dependem da classe e do estilo da janela e da função usada para criar a janela. Essas mensagens são descritas em outros tópicos neste arquivo de ajuda.

Aplicativos multithread

Um aplicativo baseado no Windows pode ter vários threads de execução e cada thread pode criar janelas. O thread que cria uma janela deve conter o código para seu procedimento de janela.

Um aplicativo pode usar a função EnumThreadWindows para enumerar as janelas criadas por um thread específico. Essa função passa o identificador para cada janela de thread, por sua vez, para uma função de retorno de chamada definida pelo aplicativo, EnumThreadWndProc.

A função GetWindowThreadProcessId retorna o identificador do thread que criou uma janela específica.

Para definir o estado de exibição de uma janela criada por outro thread, use a função ShowWindowAsync .