Prévia do material em texto
Estácio de Sá
Professor Rogério Disciplina: Linguagem de Programação
Curso de Engenharia Civil , Engenharia de Produção e Automação
Projeto de Interface Gráfica
Ao aprender C/C++, geralmente, se aprende a deselvolver programas no console certo? Se por acaso, tivéssimos que desenvolver um programa onde existam caixas de textos, botões, listas de itens, etc? É nesta parte que entra a GUI - Graphical User Interface ou Interface Grífica do Usírio, ou simplesmente "interface grífica" - uma tecnologia utilizada em sistemas operacionais para aplicar ao software, ícones, gráficos, controle por mouse, dentre outros, com o objetivo de fazer com que o usuário interaja com o tal software.
Neste tutorial, demonstrarei os principais fundamentos, exemplos da programação GUI em ambiente WIN32.
1) Crie um novo arquivo : "interface.cpp".
2) Adicione o seguinte código ao arquivo criado (utilize o copiar e colar, salve e rode o programa com F9).
3) Durante a execução aparecerá a tela do MS-DOS(tela preta), mas também a janela de interface gráfica.
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM
wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
MSG message;
HWND hwnd;
WNDCLASSEX wc;
wc.cbClsExtra=0;
wc.cbSize=sizeof(wc);
wc.cbWndExtra=0;
wc.hbrBackground=GetSysColorBrush(COLOR_BTNFACE);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
wc.lpfnWndProc=WinProc;
wc.lpszClassName="Janela";
wc.lpszMenuName=NULL;
wc.style=0;
RegisterClassEx(&wc);
hwnd = CreateWindowEx(0,"Janela","Clinica Boa Vida",WS_OVERLAPPED|WS_SYSMENU,50,50,600,600,NULL,NULL,NULL,NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam ;
}
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM wParam,LPARAM lParam){
switch(msg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
default: return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}
Comandos:
wc.hbrBackground=GetSysColorBrush(COLOR_BTNFACE);
O que faz? Cor de fundo da janela.
Parâmetros: COLOR_3DFACE, COLOR_3DHIGHLIGHT, COLOR_3DHILIGHT, COLOR_3DSHADOW, COLOR_ACTIVEBORDER, COLOR_BTNHIGHLIGHT, COLOR_BTNHILIGHT.
wc.hCursor=LoadCursor(NULL,IDC_WAIT);
O que faz? Ponteiro do mouse.
Parâmetros: IDC_HAND, IDC_CROSS, IDC_HELP, IDC_NO (esta opção é interessante), IDC_SIZEALL, IDC_WAIT
wc.hIconSm=LoadIcon(NULL,IDI_EXCLAMATION);
O que faz? O ícone da janela
Parâmetros: IDI_EXCLAMATION, IDI_INFORMATION, IDI_QUESTION, IDI_WARNING
hwnd = CreateWindowEx
(0,"Janela","Clinica Boa Vida",WS_OVERLAPPED|WS_SYSMENU,50,50,600,600,NULL,NULL,NULL,NULL);
O que faz? Informações sobre a janela a ser criada, isto é, título da janela, distância do topo da tela e distância a esquerda da tela, tamanho em pixels (largura e altura).
WS_OVERLAPPED : O que faz? Uma janela sobreposta geralmente tem uma legenda e uma borda.
WS_SYSMENU : O que faz? Cria uma janela que tem uma caixa com menu de controle em sua barra de título. Usado somente para janelas com barras de título.
Altere:
hwnd = CreateWindowEx (0,"Janela","Clinica Boa Vida", WS_SIZEBOX ,250,50,100,600,NULL,NULL,NULL,NULL);
WS_SIZEBOX : O que faz? Cria uma janela que tem uma borda de redimensionamento.
Altere:
hwnd = CreateWindowEx
(0,"Janela","Clinica Boa Vida",WS_SIZEBOX|WS_SYSMENU|WS_VSCROLL,50,50,600,600,NULL,NULL,NULL,NULL);
WS_VSCROLL: O que faz? Cria uma janela que tem uma barra de rolagem vertical.
ShowWindow(hwnd,SW_SHOW);
O que faz? Tipo de janela (inicialmente maximizada, minimizada ou no formato definido pelo usuário)
Parâmetros: SW_MINIMIZE, SW_MAXIMIZE.
Exercício
O paciente do sexo masculino pode fazer raiox (custo de R$ 300,00), sangue (R$ 150,00) e espermograma (R$ 250,00) e o paciente do sexo feminino pode fazer raiox (custo de R$ 300,00), sangue (R$ 150,00) e gravidez (R$ 122,00).
Desenvolva um programa que calcule o valor a ser pago pelo cliente.
Considere que a Clínica cobra uma taxa fixa de R$ 250,00 pelo atendimento. Dado o exemplo:
Paciente do sexo masculino: Exames feitos de sangue e espermograma, custo total de 650,00.
Paciente do sexo feminino: Exames feitos de raiox e gravidez, custo total de 672,00.
Passo 1:
Definir a criação dos componentes da Janela.
/* site da documentação interface gráfica.
http://www.forum-invaders.com.br/vb/showthread.php/8290-Tutorial-Interface-Gr%C3%A1fica-(GUI)-C-C
*/
#include <windows.h>
#include <stdio.h>
//Definimos um nome para os controles
#define label_1 1
#define label_2 2
#define radio_1 3
#define radio_2 4
#define texto_1 6
#define check_1 7
#define check_2 8
#define check_3 9
#define check_4 10
#define label_3 11
#define label_4 12
#define label_5 13
//HWND dos controles
HWND texto1;
HWND radio1,radio2;
HWND label1, label2, label3, label4,label5;
HWND check1, check2, check3,check4;
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM
wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
MSG message;
HWND hwnd;
WNDCLASSEX wc;
wc.cbClsExtra=0;
wc.cbSize=sizeof(wc);
wc.cbWndExtra=0;
wc.hbrBackground=GetSysColorBrush(COLOR_BTNFACE);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
wc.lpfnWndProc=WinProc;
wc.lpszClassName="Janela";
wc.lpszMenuName=NULL;
wc.style=0;
RegisterClassEx(&wc);
hwnd = CreateWindowEx(0,"Janela","Clinica Boa Vida",WS_OVERLAPPED|WS_SYSMENU,50,50,600,600,NULL,NULL,NULL,NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam ;
}
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM wParam,LPARAM lParam){
switch(msg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_CREATE: //No processo de criação da janela
label1 = CreateWindowEx(0,"STATIC","PACIENTE:" ,WS_CHILD|WS_VISIBLE,60,50,80,40,window,(HMENU)label_1,0,0);
texto1 = CreateWindowEx(0,"EDIT","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,140,50,370,20,window,(HMENU)texto_1,0,0); //Cria nosso textbox
label2 = CreateWindowEx(0,"STATIC","SEXO:" ,WS_CHILD|WS_VISIBLE,60,80,60,40,window,(HMENU)label_2,0,0);
radio1 = CreateWindowEx(0,"BUTTON","Masculino", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,100,240,15,window,(HMENU)radio_1,0,0);
radio2 = CreateWindowEx(0,"BUTTON","Feminino" , WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,120,240,15,window,(HMENU)radio_2,0,0);
label3 = CreateWindowEx(0,"STATIC","TIPO DE EXAME:" , WS_CHILD|WS_VISIBLE, 60,160,180,80,window,(HMENU)label_3,0,0);
check1 = CreateWindowEx(0,"BUTTON","RaioX" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,60,180,100,20,window,(HMENU)check_1,0,0);
check2 = CreateWindowEx(0,"BUTTON","Sangue" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,60,220,100,20,window,(HMENU)check_2,0,0);
check3 = CreateWindowEx(0,"BUTTON","Espermograma" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,200,180,120,20,window,(HMENU)check_3,0,0);
check4 = CreateWindowEx(0,"BUTTON","Gravidez" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,200,220,100,20,window,(HMENU)check_4,0,0);
label4 = CreateWindowEx(0,"STATIC","VALOR A PAGAR:" ,WS_CHILD|WS_VISIBLE,60,280,180,80,window,(HMENU)label_4,0,0);
label5 = CreateWindowEx(0,"STATIC","" ,WS_CHILD|WS_VISIBLE|WS_BORDER, 180,280,80,30,window,(HMENU)label_5,0,0);
break;
case WM_COMMAND: //Mensagem enviada quando se clica em um controle
switch(wParam) //Verifica o parâmetro
{
}
break;default: return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}
Comandos:
LABEL:
Para que serve? Label é um texto informativo. No caso acima é o paciente, sexo, tipo de sangue e o valor a pagar.
Parâmetros: Static > indica a criação da Label.
“PACIENTE: “ > Texto da Label.
WS_CHILD > janela filha.
WS_VISIBLE > Label visível.
60, 50, 80, 40 > distância do topo, distância à esquerda, comprimento e largura.
WINDOW > Identificação do objeto principal, onde o controle no nosso caso, será criado.
(HMENU)label_1-> Identifação do nosso objeto.
label1 =
CreateWindowEx(0,"STATIC","PACIENTE:" ,WS_CHILD|WS_VISIBLE,60,50,80,40,window,(HMENU)label_1,0,0);
EDIT:
Para que serve? Text (caixa de texto) é um campo que recebe dados via teclado. No caso acima é o nome.
Parâmetros: EDIT > indica a criação do campo para entrada de dados.
"" > valor inicial , nesse caso vazio.
WS_BORDER > campo com borda
Classe: EDIT (Estilos comuns)
ES_AUTOVSCROLL -> Rolagem vertical automítica.
ES_AUTOHSCROLL -> Rolagem horizontíl automatica.
ES_MULTILINE -> Múltiplas linhas.
ES_NUMBER -> Apenas números.
ES_PASSWORD -> Password (não se combina com ES_MULTILINE).
ES_READONLY -> Apenas leitura.
ES_UPPERCASE -> Apenas caixa alta.
WS_HSCROLL -> Barra de rolagem horizontal (Necessita ES_MULTILINE).
WS_VSCROLL -> Barra de rolagem vertical (Necessita ES_MULTILINE).
texto1 =
CreateWindowEx(0,"EDIT","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,140,50,370,20,window,(HMENU)texto_1,0,0);
RADIO:
Para que serve? Radio são usados quando o usuário pode escolher entre uma - e apenas uma - opção de um conjunto de alternativas.
Parâmetros: BUTTON > Cria um botão e com a opção BS_AUTORADIOBUTTON , cria um RADIO.
radio1 =
CreateWindowEx(0,"BUTTON","Masculino",
WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,100,240,15,window,(HMENU)radio_1,0,0);
radio2 =
CreateWindowEx(0,"BUTTON","Feminino" , WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,120,240,15,window,(HMENU)radio_2,0,0);
CHECKBOX:
Para que serve? Checkbox são usados quando o usuário pode escolher entre uma ou mais opções de um conjunto de alternativas.
Parâmetros: WS_DISABLED > opção desmarcada
BS_AUTOCHECKBOX> ess opção cria um CHECKBOX.
check1 =
CreateWindowEx(0,"BUTTON","RaioX" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,60,180,100,20,window,(HMENU)check_1,0,0);
Programa Pronto com as codificações dos botões.
#include <windows.h>
#include <stdio.h>
//Definimos um nome para os controles
#define label_1 1
#define label_2 2
#define radio_1 3
#define radio_2 4
#define texto_1 6
#define check_1 7
#define check_2 8
#define check_3 9
#define check_4 10
#define label_3 11
#define label_4 12
#define label_5 13
//HWND dos controles
HWND texto1;
HWND radio1,radio2;
HWND label1, label2, label3, label4,label5;
HWND check1, check2, check3,check4;
float total, diferenca;
char buffer[16];
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM
wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{
MSG message;
HWND hwnd;
WNDCLASSEX wc;
wc.cbClsExtra=0;
wc.cbSize=sizeof(wc);
wc.cbWndExtra=0;
wc.hbrBackground=GetSysColorBrush(COLOR_BTNFACE);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
wc.lpfnWndProc=WinProc;
wc.lpszClassName="Janela";
wc.lpszMenuName=NULL;
wc.style=0;
RegisterClassEx(&wc);
hwnd = CreateWindowEx(0,"Janela","Clinica Boa Vida",WS_OVERLAPPED|WS_SYSMENU,50,50,600,600,NULL,NULL,NULL,NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam ;
}
LRESULT CALLBACK WinProc(HWND window,UINT msg, WPARAM wParam,LPARAM lParam){
switch(msg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_CREATE: //No processo de criação da janela
label1 = CreateWindowEx(0,"STATIC","PACIENTE:" ,WS_CHILD|WS_VISIBLE,60,50,80,40,window,(HMENU)label_1,0,0);
texto1 = CreateWindowEx(0,"EDIT","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,140,50,370,20,window,(HMENU)texto_1,0,0); //Cria nosso textbox
label2 = CreateWindowEx(0,"STATIC","SEXO:" ,WS_CHILD|WS_VISIBLE,60,80,60,40,window,(HMENU)label_2,0,0);
radio1 = CreateWindowEx(0,"BUTTON","Masculino", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,100,240,15,window,(HMENU)radio_1,0,0);
radio2 = CreateWindowEx(0,"BUTTON","Feminino" , WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,60,120,240,15,window,(HMENU)radio_2,0,0);
label3 = CreateWindowEx(0,"STATIC","TIPO DE EXAME:" , WS_CHILD|WS_VISIBLE, 60,160,180,80,window,(HMENU)label_3,0,0);
check1 = CreateWindowEx(0,"BUTTON","RaioX" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,60,180,100,20,window,(HMENU)check_1,0,0);
check2 = CreateWindowEx(0,"BUTTON","Sangue" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,60,220,100,20,window,(HMENU)check_2,0,0);
check3 = CreateWindowEx(0,"BUTTON","Espermograma" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,200,180,120,20,window,(HMENU)check_3,0,0);
check4 = CreateWindowEx(0,"BUTTON","Gravidez" , WS_CHILD|WS_VISIBLE|WS_DISABLED|BS_AUTOCHECKBOX,200,220,100,20,window,(HMENU)check_4,0,0);
label4 = CreateWindowEx(0,"STATIC","VALOR A PAGAR:" ,WS_CHILD|WS_VISIBLE,60,280,180,80,window,(HMENU)label_4,0,0);
label5 = CreateWindowEx(0,"STATIC","" ,WS_CHILD|WS_VISIBLE|WS_BORDER, 180,280,80,30,window,(HMENU)label_5,0,0);
break;
case WM_COMMAND: //Mensagem enviada quando se clica em um controle
switch(wParam) //Verifica o parâmetro
{
case radio_1:
diferenca=250;
if(SendMessage(check1,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+300;
}
if(SendMessage(check2,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+150;
}
if(SendMessage(check3,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+250;
}
total = diferenca;
EnableWindow(check1,1);
EnableWindow(check2,1);
EnableWindow(check3,1);
EnableWindow(check4,0);
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);
break;
case radio_2:
diferenca=250;
if(SendMessage(check1,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+300;
}
if(SendMessage(check2,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+150;
}
if(SendMessage(check4,BM_GETCHECK,0,0) == BST_CHECKED){
diferenca=diferenca+122;
}
total = diferenca;
EnableWindow(check1,1);
EnableWindow(check2,1);
EnableWindow(check3,0);
EnableWindow(check4,1);
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);
break;
case check_1:
if(SendMessage(check1,BM_GETCHECK,0,0) == BST_CHECKED){
total = total + 300;
}
else
{
total = total - 300;
}
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);
break;
case check_2:
if(SendMessage(check2,BM_GETCHECK,0,0) == BST_CHECKED){
total = total + 150;
}
else
{
total = total - 150;
}
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);
break;
case check_3:
if(SendMessage(check3,BM_GETCHECK,0,0) == BST_CHECKED){
total = total + 250;
}
else
{
total = total - 250;
}
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);break;
case check_4:
if(SendMessage(check4,BM_GETCHECK,0,0) == BST_CHECKED){
total = total + 122;
}
else
{
total = total - 122;
}
sprintf (buffer,"%.2f",total);
SetWindowText(label5,buffer);
break;
}
break;
default: return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}