Nos últimos tutoriais uma janela era criada e passado um tempo que ela estava sendo exibida ela se fechava automaticamente, não havia nenhuma interação do usuário com a janela. Neste tutorial vou ensinar como interagir com os botões de minimizar, maximizar e fechar da janela.
Para ficar mais simples de compreender vou utilizar o código onde e criada apenas uma janela em branco assim como a utilizada no tutorial 3.
Vamos ao código de exemplo e em seguida as explicações:
#include <stdio.h>
#include <SDL2/SDL.h>
int main(int argc,char* argv[]){
if(SDL_Init(SDL_INIT_VIDEO) != 0){
fprintf(stderr, "Erro ao iniciar a biblioteca: %s", SDL_GetError());
return 1;
}
SDL_Window* janela;
janela = SDL_CreateWindow("janela", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
if(janela == NULL){
fprintf(stderr, "Erro ao criar a janela: %s", SDL_GetError());
return 1;
}
SDL_Event event;
while(1){
SDL_PollEvent(&event);
if(event.type == SDL_QUIT){
break;
}
}
SDL_DestroyWindow(janela);
SDL_Quit();
return 0;
}
O que tem de diferente entre este e o primeiro exemplo é a substituição do trecho onde estava a função SDL_Dealy() pelo trecho:
SDL_Event event;
while(1){
SDL_PollEvent(&event);
if(event.type == SDL_QUIT){
break;
}
}
Neste trecho do código é criado uma variável do tipo SDL_Event ela, então, é usada dentro do bloco while pela função SDL_PollEvent() que tira da fila de eventos o evento que está ocorrendo naquele momento que a função está sendo executada. Em seguida o tipo de evento que está ocorrendo é testado pelo bloco if, e no nosso exemplo, se ele for do tipo SDL_QUIT é executado um break que faz o loop while parar e dar continuidade ao restante do código onde finaliza e fecha o programa.
De acordo com a documentação da SLD este é o método preferencial receber eventos do sistema já que pode se fazer uso da função SDL_PollEvent() no loop principal sem o suspender enquanto espera um evento ocorrer.
Agora podemos executar nosso exemplo e ele continuará em execução até pressionarmos o botão fechar da janela.
Bem, este foi um exemplo simples de como fechar a nossa janela quando clicarmos no botão fechar mas, podemos vir a precisar de algo mais elaborado, por exemplo: E se precisássemos que algo ocorresse ao clicar no botão minimizar, ou no botão maximizar?
Para termos um controle maior sobre os eventos que ocorrem com a janela do programa podemos usar a função SDL_PollEvent() em conjunto com o tipo de evento SDL_WINDOWEVENT.
Veja o exemplo abaixo:
#include <stdio.h>
#include <SDL2/SDL.h>
int main(int argc,char* argv[]){
if(SDL_Init(SDL_INIT_VIDEO) != 0){
fprintf(stderr, "Erro ao iniciar a biblioteca: %s", SDL_GetError());
return 1;
}
SDL_Window* janela;
janela = SDL_CreateWindow("janela", 100, 100, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
if(janela == NULL){
fprintf(stderr, "Erro ao criar a janela: %s", SDL_GetError());
return 1;
}
SDL_Event event;
bool quit = false;
while(!quit){
SDL_PollEvent(&event);
if(event.type == SDL_WINDOWEVENT){
switch(event.window.event){
case SDL_WINDOWEVENT_SIZE_CHANGED:
SDL_Log("Maximizado para %d de largura e %d de altura", event.window.data1, event.window.data2);
break;
case SDL_WINDOWEVENT_MINIMIZED:
SDL_Log("O programa foi minimizado!");
break;
case SDL_WINDOWEVENT_CLOSE:
SDL_Log("Fechando o programa.");
quit = true;
break;
}
}else if (event.type == SDL_QUIT){
SDL_DestroyWindow(janela);
SDL_Quit();
return 0;
}
}
SDL_DestroyWindow(janela);
SDL_Quit();
return 0;
}
A primeira mudança está na criação da janela onde foi colocada a opção para permitir que a janela possa ser redimensionada e também habilita o botão maximizar na janela.
janela = SDL_CreateWindow("janela", 100, 100, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE );
Para este exemplo que é um pouco mais complexo uma boa opção é criar uma variável do tipo booleana e deixar ela com o falor false, e usamos ela de forma que o laço while continue em execução (!quit equivale a true).
bool quit = false;
while(!quit){
Nesta parte do código vemos que evento testado é do tipo SDL_WINDOWEVENT, que são eventos que ocorrem com a janela criada.
if(event.type == SDL_WINDOWEVENT){
No bloco switch testamos qual o tipo de evento que está ocorrendo na janela.
switch(event.window.event){
Caso o evento seja a mudança de tamanho da janela usa a função SDL_Log() que joga uma mensagem para o console. Quando há este tipo de evento as variáveis data1 e data2 guardam o valor da largura e altura que a nova janela possui.
case SDL_WINDOWEVENT_SIZE_CHANGED:
SDL_Log("Maximizado para %d de largura e %d de altura", event.window.data1, event.window.data2);
break;
No segundo case é testado se a janela está minimizada, se estiver novamente joga pra o console uma mensagem.
case SDL_WINDOWEVENT_MINIMIZED:
SDL_Log("O programa foi minimizado!");
break;
No último teste verificamos se o botão de fechar da janela foi pressionado, se sim mandamos uma mensagem para o console e modificamos o valor de quit para true, o que equivale a passar o valor false para o nosso while.
case SDL_WINDOWEVENT_CLOSE:
SDL_Log("Fechando o programa.");
quit = true;
break;
Com isso o loop para de ser executado e passa então para os comandos seguintes que finalizam a janela a biblioteca SDL e o programa.
SDL_DestroyWindow(janela); SDL_Quit(); return 0;
Para terminar abaixo está a tabela de eventos que pode ser usada em conjunto com eventos do tipo SDL_WINDOWEVENT.
|
SDL_WINDOWEVENT_SHOWN
|
a janela foi exibida.
|
|
SDL_WINDOWEVENT_HIDDEN
|
a
janela foi escondida.
|
|
SDL_WINDOWEVENT_EXPOSED
|
a
janela foi exposta e deve ser redesenhada
|
|
SDL_WINDOWEVENT_MOVED
|
a
janela foi movida, as variáveis data1 e data2 guardam a posição
X e Y para onde a janela foi movida
|
|
SDL_WINDOWEVENT_RESIZED
|
a
janela foi redimensionada, as variáveis data1 e data2 guardam a
largura e a altura da janela depois de redimensionada. Ela é
sempre precedida pela SDL_WINDOWEVENT_SIZE_CHANGED.
|
|
SDL_WINDOWEVENT_SIZE_CHANGED
|
o tamanho da janela foi alterado, seja por um
chamada da API, pelo sistema ou usuário alterando o tamanho da
janela; este evento é seguido por SDL_WINDOWEVENT_RESIZED
se
o tamanho foi alterado por um evento externo, exp. o usuário ou
gerenciador de janela.
|
|
SDL_WINDOWEVENT_MINIMIZED
|
a
janela foi minimizada.
|
|
SDL_WINDOWEVENT_MAXIMIZED
|
a
janela foi maximizada.
|
|
SDL_WINDOWEVENT_RESTORED
|
a
janela foi restaurada para o tamanho e posição normal.
|
|
SDL_WINDOWEVENT_ENTER
|
a
janela ganhou o foco do mouse.
|
|
SDL_WINDOWEVENT_LEAVE
|
a
janela perdeu o foco do mouse.
|
|
SDL_WINDOWEVENT_FOCUS_GAINED
|
a
janela ganhou o foco do teclado.
|
|
SDL_WINDOWEVENT_FOCUS_LOST
|
a
janela perdeu o foco do teclado.
|
|
SDL_WINDOWEVENT_CLOSE
|
O
gerenciador de janelas requer que a janela seja fechada.
|
Bom pessoal, acabou mais este tutorial, agradeço pela leitura.
Qualquer dúvida, sugestão é só deixar nos comentários abaixo.
Nenhum comentário:
Postar um comentário