Buscar

Aula 05 Interface gráfica

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Projeto de Interface Gráfica
Introdução
************************************************** *****
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 : "main.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>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
 LPSTR lpCmdLine, int nCmdShow)
{
 MessageBox(NULL, "CHEGA DE HELL WORLD!", "MENSAGEM", MB_OK);
 return 0;
}
Vamos analisar:
#include <windows.h>
Todo programa WINDOWS deve incluir este header.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
Esta função é a equivalente do Windows, para a função main() do console.
WINAPI -> Indica que que a chamada é definida como "_stdcall".
Seus argumentos:
HINSTANCE hInstance -> Handle (identificação) do programa no sistema. É por este valor que se controla quando um aplicativo estí executando ou é encerrado. É usado para carregar recursos como àcones, ou DLLS.
HINSTANCE hPrevInstance -> É um valor sempre nulo nos programa WIN32.Em win32, é ignorado.
LPSTR lpCmdLine -> Retorna a linha de comando, como uma string (LPSTR = char*), não incluindo o nome do executível
.
int nCmdShow -> Retorna o estado inicial da janela, para mudí-lo, utilizamos a função SHOW_WINDOW.
MessageBox(NULL, "CHEGA DE HELL WORLD!", "MENSAGEM", MB_OK); 
É uma função da API, responsível por exibir uma mensagem, para mais informações, consulte o tópico sobre API do Windows:
return 0; -> Fim do programa
1) Crie um novo arquivo : “primeiraJanela.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>
LRESULT CALLBACK WinProc(HWND window,UINT msg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
 LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
WNDCLASSEX win;
MSG message;
win.cbClsExtra=0;
win.cbSize=sizeof(win);
win.cbWndExtra=0;
win.hbrBackground=GetSysColorBrush(COLOR_WINDOW);
win.hCursor=LoadCursor(NULL,IDC_ARROW);
win.hIcon=LoadIcon(NULL,IDI_APPLICATION);
win.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
win.hInstance=hInstance;
win.lpfnWndProc=WinProc;
win.lpszClassName="Janela";
win.lpszMenuName=NULL;
win.style=0;
if(!RegisterClassEx(&win))
return 0;
hwnd = CreateWindowEx(0,"Janela","Minha janelinha",WS_OVERLAPPED|WS_SYSMENU,300,100,400,400,NULL,NULL,hInstance,NULL);
if(hwnd == NULL)
return 0;
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:
 DestroyWindow(window);
 break;
 case WM_DESTROY:
 PostQuitMessage(0);
 break;
 default:
 return DefWindowProc(window, msg, wParam, lParam);
}
	return 0;
}
WNDCLASSEX win; -> Declara variível para a classe da janela
win.cbClsExtra=0; -> Quantidade extra de dados alocados na meória pela classe
win.cbSize=sizeof(win); -> Tamanho da estrutura
win.cbWndExtra=0; -> Quantidade extra de dados alocados na meória pela classe por cada janela do tipo especifidado.
win.hbrBackground=GetSysColorBrush(COLOR_WINDOW); -> Cor de fundo da janela
win.hCursor=LoadCursor(NULL,IDC_ARROW); -> Ponteiro do mouse
win.hIcon=LoadIcon(NULL,IDI_APPLICATION); -> O àcone da janela
win.hIconSm=LoadIcon(NULL,IDI_APPLICATION); -> Ícone da janela quando é pressionado ALT+TAB.
win.hInstance=hInstance; -> Instância da janela, o mesmo valor declarado em WinMain.
win.lpfnWndProc=WinProc; -> Função que irí receber as mensagens enviadas à nossa janela. Esta é a função que controla os eventos, como cliques, movimento de mouse, etc.
win.lpszClassName="Janela"; -> Nome da classe da janela
win.lpszMenuName=NULL; ->Especifica o nome de do menu a ser utilizado na janela.
win.style=0; -> Especifica o tipo inicial da janela.
if(!RegisterClassEx(&win)) -> Registra nossa classe, caso ocorra um erro, o programa encerra.
return 0;
2 Passo - Criando a janela;
*************************************************
hwnd = CreateWindowEx(0,"Janela","Minha janelinha",
WS_OVERLAPPED|WS_SYSMENU,300,100,400,400,
NULL,NULL,hInstance,NULL);
Analisando:
Janela = nome da classe
Minha Janelinha = tàtulo da janela
WS_OVERLAPPED = estilo da janela - Fixa
WS_SYSMENU = janela com os botões superiores
300 = posição horizontal (left)
100 = posição vertical (top)
400 = largura da janela
400 = altura da janela
NULL = HWND pai
NULL = O menu criado para janela
Hinstace = instância -> WinMain
NULL = Representa um valor lParam -> caiu em desuso.
if(hwnd == NULL) -> Verifica se a janela foi criada, senão, encerra.
return 0;
ShowWindow(hwnd,SW_SHOW); -> Mostra a janela.
UpdateWindow(hwnd); -> Atualiza-a.
3 Passo - LOOP de Mensagens;
*************************************************
Os programas WIN32, executam enquanto estiverem recebendo "mensagens", que por sua vez, são interpretadas e "filtradas", executando uma certa ação.
O processo é feito pela seguinte trecho:
while(GetMessage(&message,0,0,0)){ -> Enquanto estiver recebendo mensagens..
TranslateMessage(&message); -> "Traduz" a mensagem, para que possar ser lida.
DispatchMessage(&message); -> Envia a menssagem para a função que irí interpretí-la.
}
return message.wParam; -> Retorna um valo, quando o loop é interrompido.
4 Passo - WinProc
*************************************************
Esta função, como jí foi dito, recebe as mensagens enviadas pelo programa e executa uma determinada ação para cada tipo.
LRESULT CALLBACK WinProc(HWND window,UINT msg,WPARAM wParam,LPARAM lParam){
switch(msg)
{
case WM_CLOSE:
DestroyWindow(window);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(window, msg, wParam, lParam); -> Retorna mensagens não geradas para o WinProc.
}
return 0;
}
window - hwnd da nossa janela.
msg - mensagem recebida
WPARAM - parâmetro 1 da mensagem
LPARAM - parâmetro 2 da mensagem
Algumas Constantes, Estilos de Janelas, Cursores e Mensagem
************************************************** ******
Até agora demonstrei valores utilizados no exemplo inicial, listarei agora, outros valores que você podería utilizar.
Estilos de Janela:
Código:
WS_BORDER -> Borda fina
WS_CAPTION -> Barra de tàtulo e borda fina
WS_CHILD/WS_CHILDWINDOW -> Janela filha
WS_DISABLED -> Desabilitada
WS_DLGFRAME -> Borda usada em dialogs.
WS_HSCROLL/WS_VSCROLL -> Adiciona barra de rolagem horizontal(HSCROLL) e vertical(VSCROLL)
WS_MAXIMIZE -> Janela maximizada
WS_MAXIMIZEBOX /WS_MINIMIZEBOX -> Botões maximizar e minimizar
WS_MINIMIZE -> Janela minimizada
WS_OVERLAPPED -> Borda fixa e barra de tàtulo
WS_OVERLAPPEDWINDOW -> Padrão
WS_POPUP -> Janela POPUP
WS_SIZEBOX -> Janela que pode ser redimensionada
WS_SYSMENU -> Define a janela com o menu comum.
WS_TABSTOP -> Define o possàvel recebimento de focus,pela tecla TAB
WS_VISIBLE -> Janela iniciamente visàvel
Cursores:
Código:
IDC_ARROW -> Padrão
IDC_CROSS -> Cruz
IDC_IBEAM -> Cursor editando
IDC_ICON -> Ícone
IDC_NO -> Sem cursor
IDC_SIZE -> Redimesionar
IDC_SIZEALL -> Mover/Redimesionar
IDC_SIZENESW -> Redimensionar
IDC_SIZENS -> Redimensionar
IDC_SIZENWSE -> Redimensionar
IDC_SIZEWE -> Redimensionar
IDC_UPARROW -> Seta para cima
IDC_WAIT -> Ocupado
ÍCONES:
Código:
IDI_APPLICATION -> Padrão
IDI_ASTERISK -> Informação
IDI_EXCLAMATION -> Exclamação
IDI_HAND ->HiperLink
IDI_QUESTION -> Ajuda
IDI_WINLOGO -> Logon
CORES:
Código:
COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT
Mensagens:
Código:
WM_ACTIVATE -> Recebe focus
WM_CLOSE -> Fechar janela
WM_COPY -> Copiar
WM_CREATE -> Criação da janel
WM_CUT -> Recortar
WM_DESTROY -> Sair
WM_ENABLE -> Torna habilitade
WM_KEYDOWN -> Tecla pressionada
WM_LBUTTONDNLCLK -> Botão Esquerdo - 2 cliques
WM_LBUTTONDOWN -> Botão Esquerdo - 1 clique
WM_MBUTTONDBLCLK -> Botão Central - 2 clqiues
WM_MBUTTONDOWN -> Botão Central - 1 clique
WM_MOUSEMOVE -> Movimento do mouse
WM_MOUSEWHEEL -> Rodinha do mouse
WM_MOVE -> Movimento da janela
WM_PAINT -> Implementação dos objetos na janela 
WM_PASTE -> Colar
WM_QUIT -> Sair
WM_RBUTTONDNLCLK -> Botão Direito - 2 Cliques
WM_RBUTTONDOWN -> Botão Direito - 1 Clique
WM_SETFOCUS -> Recebe focus
WM_SIZE -> Janela Redimensionada
1) Crie um novo arquivo : “primeiroButton.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>
//Definimos um nome para os controles
#define t_1 1
#define r_1 2
#define r_2 3
//HWND dos controles
HWND txt;
HWND radio1,radio2;
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","EXEMPLO 1",WS_OVERLAPPED|WS_SYSMENU,200,200,400,120,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
txt = CreateWindowEx(0,"EDIT","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,10,10,370,20,window,(HMENU)t_1,0,0); //Cria nosso textbox
radio1 = CreateWindowEx(0,"BUTTON","Obter nome do usuírio",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,10,50,240,15,window,(HMENU)r_1,0,0); //Cria o primeiro radiobutton
radio2 = CreateWindowEx(0,"BUTTON","Sair do programa" ,WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,240,50,240,15,window,(HMENU)r_2,0,0); //Cria o segundo
break;
case WM_COMMAND: //Mensagem enviada quando se clica em um controle
	switch(wParam) //Verifica o parâmetro
	{
	case r_1: //Caso seja o primeiro radiobutton
//Obtém o nome do usuírio 			
char buffer[256];
DWORD size;
size=256;
			GetUserName(buffer,&size);
			SetWindowText(txt,buffer); //Mostra no textbox
break;
	case r_2: //Caso seja o segundo
		ExitProcess(0); //Encerra
	} break;
default:
	return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}
Muito bem, na primeira parte, aprendemos como um programa Windows é iniciado, alguns argumentos de inicialização, registro de classes, criação da janela e sobre o LOOP de mensagens.Vimos também um exemplo de uma janela vazia.Aprenderemos a seguir, como "enfeitar" nossa janela com os famosos controles do windows: labels, caixas de texto, etc.
Criando e utilizando controles comuns do Windows
************************************************** *
Lembra-se de como criamos a nossa primeira janela?
Utilizamos a função CreateWindowEx. Usaremos essa mesma função para criar nossos controles.
Observe:
Código:
HWND hwnd;
hwnd = CreateWindow(0,CLASSE,TÍTULO/CAPTION,ESTILO,Horizontal,Vertical,Largura,Altura,HWND-PAI,ID,INSTÂNCIA,lParam);
Entendendo:
CLASSE -> Literalmente, é a classe a qual o objeto pertence.
TÍTULO/CAPTION -> Texto/tàtulo do referido objeto.
ESTILO -> Modo de exibição do objeto.
Horizontal -> posição horizontal.
Vertical -> posição vertical.
Altura -> altura do objeto.
HWND-Pai -> Identificação do objeto principal, onde o controle no nosso caso, serí criado.
ID -> Identifação do nosso objeto.
INSTÂNCIA -> Propriedade HINSTANCE do objeto principal. (Opicional)
lParam -> Não utilizado.
Exemplo simples - Criando um Label:
Código:
#define lb1 1
HWND label1;
label1 = CreateWindowEx(0,"STATIC","OLÁ!",WS_CHILD|WS_VISIBLE,0,0,100,20,HWND-MAIN,(HMENU)lb1,NULL,0);
STATIC -> Classe do LABEL
OLÁ -> Tàtulo
WS_CHILD -> Indica que o objeto fica "dentro" de outro.
WS_VISIBLE -> Mostra nosso objeto.
0 -> Posição horizontal
0 -> Posição vertial
100 -> Larguda
20 -> Altura
HWND-MAIN -> HWND do WinProc
(HMENU)lb1 -> Converte o valor de lb1 (nome do nosso objeto) para o dado correto (HMENU).
NULL -> Instância
0 -> lParam
Você deve estar se perguntando: Onde eu coloco isso?
Bem, existem diversas maneiras de você implementí-lo, vou mostrar duas:
1) Logo após a criação da janela principal. Exemplo:
Código:
#define lb1 1
[...]
hwnd = CreateWindowEx(0,"Janela","Minha janelinha",WS_OVERLAPPED|WS_SYSMENU,300,100,400,400,NULL,NULL,hInstance,NULL);
HWND label1;
label1 = CreateWindowEx(0,"STATIC","OLÁ!",WS_CHILD|WS_VISIBLE,0,0,100,20,HWND-MAIN,(HMENU)lb1,NULL,0);
[...]
2) Após o programa receber a mensagem que foi iniciado com sucesso: WM_CREATE. Exemplo:
Código:
#define lb1 1
[...]
switch(msg)
 {
case WM_CREATE:
HWND label1;
label1 = CreateWindow(0,"STATIC","OLÁ!",WS_CHILD|WS_VISIBLE,10,10,100,20,window,(HMENU)lb1,NULL,0);
break;
}
[...]
Muito bem, mostrarei agora, algumas classes e estilos dos controles mais comuns:
Label:
************************
Classe: STATIC
Estilos comuns: 
SS_SIMPLE -> Simples
WS_EX_TRANSPARENT -> Transparente
Caixa de Texto:
************************
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_OEMCONVERT -> Converte caracters DOS para fonte normal.
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)
Botão:
********************
Classe: BUTTON
Estilos comuns:
BS_DEFPUSHBUTTON -> Botão DEFAULT
CheckBox
********************
Classe: BUTTON
Estilos OBRIGATÓRIOS: BS_AUTOCHECKBOX
Estilos comuns:
BS_AUTO3STATE -> 3 Possibilidades: Marcado, Semi-Marcado e Não-Marcado.
RadioButton
********************
Classe: BUTTON
Estilos OBRIGATÓRIOS: BS_RADIOBUTTON
ListBox
********************
Classe: LISTBOX
Estilos comuns:
LBS_MULTICOLUMN -> Múltiplas colunas
LBS_MULTIPLESEL -> Seleção múltipla
LBS_SORT -> Classifica itens por ordem alfabéticaWS_HSCROLL -> Rolagem horizontal
WS_VSCROLL -> Rolagem verticalComboBox
********************
CLASSE: COMBOBOX
Estilos Comuns:
CBS_DROPDOWN -> Seleção/Escrita
CBS_DROPDOWNLIST ->Apenas seleção de itens 
CBS_SORT -> Classifica itens em ordem alfabética
WS_HSCOLL -> Rolagem horizontal
WS_VSCROLL -> Rolagem vertical
Estilos OBRIGATÓRIOS à todos os controles:
WS_VISIBLE -> Torna os controles visàveis, dispensando o uso de ShowWindow().
WS_CHILD -> Aclopam o controle dentro da janela.
Estilos comuns à todos os controles:
WS_BORDER -> Adiciona borda ao controle
WS_DISABLED -> Cria o controle iniciamente disabilitado.
WS_TABSTOP -> Permite que o controle receba FOCO pela tecla TAB.
Bem, temos outros controles, por enquanto aprensentarei apenas estes.
Funções comuns à maioria dos controles:
*******************************************
Habilitando/Desabilitando o controle:
EnableWindow(hwnd,valor);
hwnd -> HWND do controle.
valor -> 1 (true - habilitado) ou 0 (false - disabilitado)
Adicionando/Modificando um texto:
SetWindowText(hwnd,texto);
hwnd -> HWND do controle.
texto -> Texto a ser adicionado.
Obtendo um texto:
char buffer[256];
GetWindowText(hwnd,buffer,256);
hwnd -> HWND do controle.
buffer -> variível que receberí o texto
256 -> tamanho do buffer.
Trabalhando com CheckBox e RadioButtons:
*******************************************
Verificando estados:
int estado;
estado = SendMessage(hwnd,BM_GETCHECK,0,0);
if(x==BST_CHECKED){
//Marcado
}
else
{
//Desmarcado
}
hwnd -> HWND do controle.
BM_GETCHECK -> Mensagem:: Checar estado.
0 -> WPARAM
0 -> Lparam
BST_CHECKED -> Marcado
BST_UNCHECKED -> Desmarcado
Trabalhando com ListBox:
*******************************************
Adicionando um item:
SendMessage(hwnd,LB_ADDSTRING,0,(LPARAM)item);
hwnd -> HWND do controle.
LB_ADDSTRING -> mensagem enviada ao listbox para adicionar um item.
0 -> WPARAM não utilizado.
(LPARAM)item -> converte e adiciona o item desejado.
Obtendo posição de um item selecionado:
int pos;
pos = SendMessage(hwnd,LB_GETCURSEL,0,0);
pos -> Inteiro que receberí a posição do item.
hwnd -> HWND do controle.
LB_GETCURSEL -> Mensagem:: obtém o item selecionado.
0 -> WPARAM
0 -> LPARAM
Obtendo texto de um item:
char buffer[256];
SendMessage(hwnd,LB_GETTEXT,(WPARAM)index,(LPARAM) buffer);
hwnd -> HWND do controle.
LB_GETCURSEL -> Mensagem:: obtém o texto do item.
(WPARAM)index -> Posição do item a receber o texto.
(LPARAM)buffer -> Converte e armazena o texto do item INDEX no buffer.
Deletando um item:
SendMessage(hwnd,LB_DELETESTRING,(WPARAM)index,0);
hwnd -> HWND do controle.
LB_DELETESTRING -> Mensagem:: deleta um item.
(WPARAM)index -> Posição do item a deletar.
Modificando um item:
SendMessage(hwnd,LB_INSERTSTRING,(WPARAM)index,(LP ARAM)valor);
hwnd -> HWND do controle.
LB_DELETESTRING -> Mensagem:: modifica um item.
(WPARAM)index -> Posição do item a modificar.
(LPARAM)valor -> Novo texto do item.
Trabalhando com ComboBox:
*******************************************
Adicionando um item:
SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)item);
hwnd -> HWND do controle.
CB_ADDSTRING -> mensagem enviada ao listbox para adicionar um item.
0 -> WPARAM não utilizado.
(LPARAM)item -> converte e adiciona o item desejado.
Obtendo posição de um item selecionado:
int pos;
pos = SendMessage(hwnd,CB_GETCURSEL,0,0);
pos -> Inteiro que receberí a posição do item.
hwnd -> HWND do controle.
CB_GETCURSEL -> Mensagem:: obtém o item selecionado.
0 -> WPARAM
0 -> LPARAM
Obtendo texto de um item:
char buffer[256];
SendMessage(hwnd,CB_GETTEXT,(WPARAM)index,(LPARAM) buffer);
hwnd -> HWND do controle.
CB_GETCURSEL -> Mensagem:: obtém o texto do item.
(WPARAM)index -> Posição do item a receber o texto.
(LPARAM)buffer -> Converte e armazena o texto do item INDEX no buffer.
Deletando um item:
SendMessage(hwnd,CB_DELETESTRING,(WPARAM)index,0);
hwnd -> HWND do controle.
CB_DELETESTRING -> Mensagem:: deleta um item.
(WPARAM)index -> Posição do item a deletar.
Modificando um item:
SendMessage(hwnd,CB_INSERTSTRING,(WPARAM)index,(LP ARAM)valor);
hwnd -> HWND do controle.
CB_DELETESTRING -> Mensagem:: modifica um item.
(WPARAM)index -> Posição do item a modificar.
(LPARAM)valor -> Novo texto do item.
1) Crie um novo arquivo : “primeiroRadio.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>
//Nomes para os controles
#define lb1 1
#define txtbox 2
#define combo 3
#define btn 4
//HWND do controles
HWND label1;
HWND txt1;
HWND combo1;
HWND bot1;
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","EXEMPLO 1",WS_OVERLAPPED|WS_SYSMENU,200,200,400,100,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: //Processo de criação da janela
label1 = CreateWindowEx(0,"STATIC","Texto:" ,WS_CHILD|WS_VISIBLE,10,10,40,20,window,(HMENU)lb1,0,0);
txt1 = CreateWindowEx(0,"EDIT","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,60,10,140,20,window,(HMENU)txtbox,0,0); //Cria label
combo1 = CreateWindowEx(0,"COMBOBOX","" ,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,230,10,140,400,window,(HMENU)combo,0,0); //Cria ComboBox
bot1 = CreateWindowEx(0,"BUTTON","Adicionar texto..." ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,40,120,20,window,(HMENU)btn,0,0); //Cria botão
break;
case WM_COMMAND: //Mensagem enviada quando um controle é clicado:
	switch(wParam) //Verifica parâmetro
	{
	case btn: //Se for o botão
//Obtém conteúdo do textbox.
		char buffer[256]; 
		GetWindowText(txt1,buffer,256);
	//Adiciona este no combobox.	SendMessage(combo1,CB_ADDSTRING,0,(LPARAM)buffer);
	} break;
default:
	return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}
1) Crie um novo arquivo : “primeiroRadio.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>
//Nomes dos controles
#define check 1
#define list 2
#define btn_add 3
#define btn_del 4
//HWND dos controles
HWND check1;
HWND list1;
HWND bot1,bot2;
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","EXEMPLO 1",WS_OVERLAPPED|WS_SYSMENU,200,200,400,200,NULL,NULL,NULL,NULL);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
	TranslateMessage(&message);
	DispatchMessage(&message);
}
return message.wParam ;
}
LRESULT CALLBACKWinProc(HWND window,UINT msg, WPARAM wParam,LPARAM lParam){
switch(msg)
{
case WM_CLOSE:
	PostQuitMessage(0);
	break;
case WM_CREATE: //Processo de criação da janela
check1 = CreateWindowEx(0,"BUTTON","Manipular ListBox" ,WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,10,10,150,20,window,(HMENU)check,0,0); //Criamos o checkbox
list1 = CreateWindowEx(0,"LISTBOX","" ,WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL,240,10,145,150,window,(HMENU)list,0,0); //Criamos a Listbox
bot1 = CreateWindowEx(0,"BUTTON","Adicionar Item" ,WS_CHILD|WS_VISIBLE|WS_DISABLED,10,35,100,20,window,(HMENU)btn_add,0,0); //Criamos o botão para adicionar item
bot2 = CreateWindowEx(0,"BUTTON","Remover Item" ,WS_CHILD|WS_VISIBLE|WS_DISABLED,120,35,100,20,window,(HMENU)btn_del,0,0); //Criamos o botão para deletar item.
break;
case WM_COMMAND: //Mensagem enviada quando um controle é clicado:
	switch(wParam) //Verifa o parâmetro
	{
	case check: //Se for o checkbox
		int estado; //Variível Retorno
		estado = SendMessage(check1,BM_GETCHECK,0,0); //Verfica estado
		if(estado==BST_CHECKED){ //Se checado, habilita os botões
	EnableWindow(bot1,1);
 EnableWindow(bot2,1);
		}
		else //Se não, os desabilitada.
		{
	EnableWindow(bot1,0);
 EnableWindow(bot2,0);
		}break;
	case btn_add: //Se for o botão para adicionar itens
		SendMessage(list1,LB_ADDSTRING,0,(LPARAM)"ITEM"); //Adicione "ITEM" à Listbox
		break;
	case btn_del: //Se for o botão para deletar
		int pos;//Variível Retorno
		pos = SendMessage(list1,LB_GETCURSEL,0,0); //Verifica posição
		if(pos==-1) //Se for -1 (nenhum item)
			MessageBox(window,"Nenhum item selecionado!","ERRO",MB_OK|MB_ICONINFORMATION);
		else //Se não
			SendMessage(list1,LB_DELETESTRING,(WPARAM)pos,0); //Deleta o item selecionado.
		break;
	} break;
default:
	return DefWindowProc(window,msg,wParam,lParam);
}
return 0;
}
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.
/* 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;
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,2);
 EnableWindow(check2,1);
 EnableWindow(check3,1);
 EnableWindow(check4,0);
 EnableWindow(radio1,1);
 EnableWindow(radio2,1);
 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);
 EnableWindow(radio1,1);
 EnableWindow(radio2,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;
}

Continue navegando