Criar uma janela

Neste artigo, aprenda a criar e mostrar uma janela.

Classes de janela

Uma classe de janela define um conjunto de comportamentos que várias janelas podem ter em comum. Por exemplo, em um grupo de botões, cada botão tem um comportamento semelhante quando o usuário seleciona o botão. Claro, os botões não são completamente idênticos. Cada botão exibe sua própria cadeia de caracteres de texto e tem suas próprias coordenadas de tela. Os dados exclusivos para cada janela são chamados de dados de instância.

Cada janela deve ser associada a uma classe de janela, mesmo que seu programa crie apenas uma instância dessa classe. Uma classe de janela não é uma classe no sentido C++. Em vez disso, é uma estrutura de dados usada internamente pelo sistema operacional. As classes de janela são registradas com o sistema em tempo de execução. Para registrar uma nova classe de janela, preencha uma estrutura WNDCLASS :

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

Você deve definir os seguintes membros da estrutura:

  • lpfnWndProc é um ponteiro para uma função definida pelo aplicativo chamada procedimento de janela ou proc de janela. O procedimento de janela define a maior parte do comportamento da janela. Por enquanto, esse valor é uma declaração de encaminhamento de uma função. Para obter mais informações, consulte Escrevendo o procedimento Window.
  • hInstance é o identificador para a instância do aplicativo. Obtenha esse valor do parâmetro hInstance de wWinMain.
  • lpszClassName é uma cadeia de caracteres que identifica a classe de janela.

Os nomes de classe são locais para o processo atual, portanto, o nome só precisa ser exclusivo dentro do processo. No entanto, os controles padrão do Windows também têm classes. Se você usar qualquer um desses controles, deverá escolher nomes de classe que não entram em conflito com os nomes de classe de controle. Por exemplo, a classe de janela para o controle de botão é chamada de Botão.

A estrutura WNDCLASS tem outros membros que não são mostrados aqui. Você pode defini-los como zero, conforme mostrado neste exemplo, ou preenchê-los. Para obter mais informações, consulte WNDCLASS.

Em seguida, passe o endereço da estrutura WNDCLASS para a função RegisterClass . Essa função registra a classe de janela com o sistema operacional.

RegisterClass(&wc);

Criar a janela

Para criar uma nova instância de uma janela, chame a função CreateWindowEx :

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

Para obter descrições detalhadas do parâmetro, consulte CreateWindowEx. Aqui está um resumo rápido:

  • O primeiro parâmetro permite especificar alguns comportamentos opcionais para a janela, por exemplo, janelas transparentes. Defina esse parâmetro como zero para os comportamentos padrão.
  • CLASS_NAME é o nome da classe de janela. Esse nome define o tipo de janela a ser criada.
  • O texto da janela é usado de maneiras diferentes por diferentes tipos de janelas. Se a janela tiver uma barra de título, o texto será exibido na barra de título.
  • O estilo de janela é um conjunto de sinalizadores que definem parte da aparência de uma janela. A WS_OVERLAPPEDWINDOW constante é, na verdade, vários sinalizadores combinados com um bit a bit OR. Juntos, esses sinalizadores dão à janela uma barra de título, uma borda, um menu do sistema e botões Minimizar e Maximizar . Esse conjunto de sinalizadores é o estilo mais comum para uma janela de aplicativo de nível superior.
  • Para posição e tamanho, a constante CW_USEDEFAULT significa usar valores padrão.
  • O próximo parâmetro define uma janela pai ou uma janela de proprietário para a nova janela. Defina o pai se deseja criar uma janela filho. Para uma janela de nível superior, defina esse valor como NULL.
  • Para uma janela de aplicativo, o próximo parâmetro define o menu da janela. Este exemplo não usa um menu, portanto, o valor é NULL.
  • hInstance é o identificador de instância, descrito anteriormente. Consulte WinMain: o ponto de entrada do aplicativo.
  • O último parâmetro é um ponteiro para dados arbitrários do tipo void*. Você pode usar esse valor para passar uma estrutura de dados para o procedimento de janela. Para obter uma maneira possível de usar esse parâmetro, consulte Gerenciando o estado do aplicativo.

CreateWindowEx retorna um identificador para a nova janela ou zero se a função falhar. Para mostrar a janela, ou seja, torne a janela visível, passe o identificador da janela para a função ShowWindow :

ShowWindow(hwnd, nCmdShow);

O parâmetro hwnd é o identificador de janela retornado por CreateWindowEx. O parâmetro nCmdShow pode ser usado para minimizar ou maximizar uma janela. O sistema operacional passa esse valor para o programa por meio da função wWinMain .

Aqui está o código completo para criar a janela. Lembre-se de que WindowProc ainda é apenas uma declaração de encaminhamento de uma função.

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClass(&wc);

// Create the window.

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

ShowWindow(hwnd, nCmdShow);

Parabéns, você criou uma janela!

No momento, a janela não contém nenhum conteúdo ou interage com o usuário. Em um aplicativo de GUI real, a janela responderia a eventos do usuário e do sistema operacional. A próxima seção descreve como as mensagens de janela fornecem esse tipo de interatividade.

Confira também

Prossiga para Mensagens de Janela para continuar este módulo.