A “programação visual” surgiu juntamente com as interfaces gráficas. Com ela, você começa a desenvolver um programa desenhando sua janela principal, com a barra de menu, textos (labels), botões, campos de edição, etc. Você já pode desenhar também as janelas secundárias do programa e definir os menus, por exemplo.
Nesse jeito de programar, os elementos visuais de um programa são chamados widgets. Cada ambiente gráfico tem a sua coleção de widgets, e existem várias coleções de widgets disponíveis na forma de código-fonte. Essas coleções, ou bibliotecas, são chamadas de toolkits. Alguns desses toolkits funcionam de forma similar em diferentes sistemas operacionais e ambientes gráficos. Por exemplo, Qt, GTK, GraphApp, FLTK, MGUI, entre outros.
A segunda fase do desenvolvimento é criar respostas para os eventos. Num ambiente gráfico, as ações do usuário e até do próprio computador são chamadas eventos. Quando você clica o mouse em algum lugar, gera um evento (vamos dizer, Click_Right_Mouse_Button) no sistema operacional. O ambiente gráfico detecta em que posição o mouse estava na hora do clique e, se ele estava sobre um determinado botão (OK, por exemplo), o ambiente informa ao programa que o botão OK foi clicado. Cabe ao programador criar uma resposta a esse evento — ou seja, ele deve atribuir uma função ao botão OK. O próprio sistema operacional gera uma série de eventos — por exemplo, o relógio do sistema (o timer) gera pulsos constantes. Você pode usar um manipulador para os eventos do timer para atualizar os dígitos de hora e minutos em um programa de relógio, por exemplo.
As respostas a eventos têm a forma de funções e subrotinas, que recebem diferentes nomes em diferentes linguagens de programação, mas significam a mesma coisa: são pequenos trechos de um programa, que fazem uma determinada tarefa e depois retornam para o bloco de programa que estava em andamento. As funções, assim como na matemática, dão de volta algum resultado, geralmente numérico. As subrotinas (procedures em Pascal, void function em C, SUBs em Visual Basic, etc) simplesmente executam alguma tarefa e não devolvem um resultado. Funções e subrotinas têm uma vantagem importante: elas podem ser reaproveitáveis, e juntadas numa biblioteca. Você pode ter uma biblioteca matemática, por exemplo, com uma função para calcular a raiz quadrada de um número, outra para calcular o logaritmo, outra para tirar o fatorial, e assim por diante. Da mesma forma, para responder a eventos em um programa visual, você tem diferentes funções e subrotinas para responder a um clique de botão, o acionamento de uma combinação de teclas de atalho, etc.
Uma noção importante da programação visual é que ela não tem um fluxo de programa contínuo como os programas antigos. Num ambiente visual, o que o bloco principal do programa faz é basicamente carregar a janela principal na tela e ficar esperando alguma ação do usuário. Tudo que acontece depois são respostas a eventos. Você clica no botão 1 e o programa faz alguma coisa. Clica no botão 2 e o programa faz outra coisa. E fica nisso até você fechar a janela principal, e assim encerrar o programa. Por isso se diz que os programas em ambientes visuais são orientados a eventos. O bloco principal normalmente é chamado de event loop, porque ele fica rodando em círculos, sem fazer nada, só esperando um evento acontecer. Quando acontece algo, ele vê se existe alguma ação programada como resposta ao evento ocorrido. Se não tiver, ele continua sem fazer nada. Se tiver, ele passa o processamento para a ação correspondente.
Para a criação de programas, existem hoje diversos ambientes de desenvolvimento, que podem ser explicados como “programas para fazer programas”. As ferramentas que permitem a criação visual de um programa são chamadas de ferramentas RAD (Rapid Application Development). Visual Basic e Delphi/Kylix são os mais conhecidos. Depois de desenhar todas as janelas do programa, você escreve, em linguagem de programação, as respostas a eventos. Depois, quando todo o programa estiver escrito, você compila todos os arquivos. O compilador transforma todo o código-fonte e as janelas que você desenhou em linguagem de máquina, criando assim um executável, que é o programa pronto para rodar.