Ir ao conteúdo
  • Cadastre-se
Xaws

C: Sistema de login em UI

Recommended Posts

 Fiz uma GUI,clico pra ir pra área do usuário, na área do usuário criei um botão (combobox) onde a pessoa coloca seu login e em case 4 faz a comparação pra ver se o login é o mesmo cadastrado no código... O problema é que não está reconhecendo o login apenas rejeita, o que pode ser??

Código do botão (esse botão fica na segunda tela)

CreateWindowEx(0,"COMBOBOX","LOGIN" ,WS_CHILD|WS_VISIBLE ,140,40,120,20,hwnd,(HMENU)4,0,0); 
CreateWindowEx(0,"BUTTON","Logar" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,120,120,20,hwnd,(HMENU)4,0,0);

Código da tela principal

 

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define icone 101
//HWND do controles
HWND bot1;
HWND bot2;
HWND bot3;
HWND bot4;
char login[20] = "LOGIN_AQUI";
char login1[20];
char senha[20] = "SENHA_AQUI";
char senha1[20];
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 wc2;
wc2.cbClsExtra=0;
wc2.cbSize=sizeof(wc2);
wc2.cbWndExtra=0;
wc2.hbrBackground=(HBRUSH) COLOR_BACKGROUND;
wc2.hCursor=LoadCursor(NULL,IDC_ARROW);
wc2.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(icone));
wc2.hIconSm       = LoadIcon(hInstance, "wk.bmp");
wc2.lpszMenuName = NULL;
wc2.lpfnWndProc=WinProc;
wc2.lpszClassName="Janela";
wc2.style=0;
RegisterClassEx(&wc2);
hwnd = CreateWindowEx(0,"Janela","                                                                                                                L&A Contábil",WS_OVERLAPPED|WS_SYSMENU,300,100,900,400,NULL,NULL,NULL,NULL);
bot1 = CreateWindowEx(0,"BUTTON","Area do Usuario" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,40,120,20,hwnd,(HMENU)1,0,0); //Cria botão
bot2 = CreateWindowEx(0,"BUTTON","Area do Contador" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,80,120,20,hwnd,(HMENU)2,0,0);
bot3 = CreateWindowEx(0,"BUTTON","SAIR" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,120,120,20,hwnd,(HMENU)3,0,0);
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_CREATE: //Processo de criação da janela
case WM_COMMAND: //Mensagem enviada quando um controle é clicado:
switch(wParam) //Verifica parâmetro
{
case 1: //Se for o botão
 system ("start www.google.com");
 exit(0);
 break;
 
 case 2:
#include "area2.c"

 case 3:
 exit(0);
 
 case 4: // Esse é o case dos botões do login
scanf("%s",&login1);
if(strcmp(login1,login) == 0)
{
	MessageBox(0,"LOGIN ACEITO","",0);
}
else
{
	MessageBox(0,"LOGIN REJEITADO","",0);
}
break;

 case 5:
exit (0);
} 
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}

 

 O que pode ser? Ele não está checando o login apenas da como login rejeitado

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 Esquece já percebi que ninguém aqui manja de GUI puro em C kkk

Consegui arrumar já vou deixar aqui pra quem estiver estudando.

 

Primeiro se cria os botões

bot1 = CreateWindowEx(0,"COMBOBOX","" ,WS_CHILD|WS_VISIBLE|WS_BORDER,60,10,140,20,hwnd ,(HMENU)2,0,0);
bot2 = CreateWindowEx(0,"BUTTON","Logar" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,120,120,20,hwnd,(HMENU)2,0,0);

Agora no case referente ao botão você faz assim!
 

char buffer[256];
GetWindowText(bot1,login1,256);

bot1 é o botão criado onde o usuário escreve o login
login1 é o char referente ao login que você define no começo do código
e abaixo disso vem o código que fara a comparação do login

 

Editado por Xaws
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Xaws    seu código funcionou bem, tem como colocar um texto em cima do combobox  para informar que ali é onde  se coloca o login ?     eu estava tentando usar um EDIT e sendmessage para pegar  o login  e funcionou mas não muito bem pois ele pega a primeira informação e se digitar outra coisa ele não pega, mas mantem a primeira.  veja esse código  que eu estava tentando fazer funcionar :

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
//SERÁ OS BOTÕES,FUNCIONA SEM NOME TAMBÉM,USE COM NOMES ASSIM PRA EVITAR SE PERDER!
char login[20] = "LOGIN_AQUI";
char login1[20];
char senha[20] = "SENHA_AQUI";
char senha1[20];
HWND bot1;
HWND bot2;
HWND bot3;
HWND bot4;
HWND bot5;
HDC hdc;
HINSTANCE g_inst;
HWND EditNum1,EditTotal;
char s_valor1[20] = "0";
char texto[100],buffer[10];
int tt;
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 wc2;
    wc2.cbClsExtra=0;
    wc2.cbSize=sizeof(wc2);
    wc2.cbWndExtra=0;
    wc2.hbrBackground=(HBRUSH) COLOR_BACKGROUND;
    wc2.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc2.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc2.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    wc2.lpfnWndProc=WinProc;
    wc2.lpszClassName="Janela";
    wc2.lpszMenuName=NULL;
    wc2.style=0;
    RegisterClassEx(&wc2);
    hwnd = CreateWindowEx(0,"Janela"," AQUI O NOME DA SUA JANELA",WS_OVERLAPPED|WS_SYSMENU,300,100,900,400,NULL,NULL,NULL,NULL);/*Janela*/
    bot1 = CreateWindowEx(0,"BUTTON","Area do Usuario" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,40,120,20,hwnd,(HMENU)1,0,0);
    bot2 = CreateWindowEx(0,"BUTTON","Area do Contador" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,80,120,20,hwnd,(HMENU)2,0,0);
    bot3 = CreateWindowEx(0,"BUTTON","SAIR" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,120,120,20,hwnd,(HMENU)3,0,0);
    bot4 = CreateWindowEx(0,"BUTTON","login" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,160,120,20,hwnd,(HMENU)4,0,0);
    bot5 = CreateWindowEx(0,"BUTTON","YOUTUBE" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,200,120,20,hwnd,(HMENU)5,0,0);

    EditNum1 = CreateWindowEx (
        WS_EX_CLIENTEDGE,
        "EDIT",
        "insira o login aqui",
        WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT ,
        350, 30, 150, 30,
        hwnd,
        NULL,
        g_inst,
        NULL
        );
    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow(hwnd);
    while(GetMessage(&message,NULL,0,0)){
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam){
    switch(msg){
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
        case WM_CREATE: //Processo de criação da janela
        case WM_COMMAND: //Mensagem enviada quando um controle é clicado:
            if ((HIWORD(wParam) == BN_CLICKED)){
                SendMessage(
                    (HWND) EditNum1,
	                (UINT) EM_GETLINE,
	                (WPARAM) 1,
	                (LPARAM) &s_valor1
                    );
            }
            switch(LOWORD(wParam)){ //Verifica parâmetro
                case 1: //Se for o botão
                    system ("start www.google.com");
                    break;
                case 2:
                    #include "c:/Dev-Cpp/area3.c"
                case 3:
                    exit(0);
                case 4: // Esse é o case dos botões do login
                    SendMessage(
                    (HWND) EditNum1,
                    (UINT) EM_GETLINE,
	                (WPARAM)hwnd,
                    (LPARAM) &s_valor1);
                    strcpy(login1,s_valor1);

                    if(strcmp(login1,login) == 0){
                        MessageBox(0,"LOGIN ACEITO","",0);
                    }
                    else{
                        MessageBox(0,"LOGIN REJEITADO","",0);
                    }
                    break;
                case 5:
                    system ("start www.youtube.com");
                    break;
            }
            break;
            default:
                return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

9 minutos atrás, devair1010 disse:

@Xaws    seu código funcionou bem, tem como colocar um texto em cima do combobox  para informar que ali é onde  se coloca o login ?     eu estava tentando usar um EDIT e sendmessage para pegar  o login  e funcionou mas não muito bem pois ele pega a primeira informação e se digitar outra coisa ele não pega, mas mantem a primeira.  veja esse código  que eu estava tentando fazer funcionar :


#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
//SERÁ OS BOTÕES,FUNCIONA SEM NOME TAMBÉM,USE COM NOMES ASSIM PRA EVITAR SE PERDER!
char login[20] = "LOGIN_AQUI";
char login1[20];
char senha[20] = "SENHA_AQUI";
char senha1[20];
HWND bot1;
HWND bot2;
HWND bot3;
HWND bot4;
HWND bot5;
HDC hdc;
HINSTANCE g_inst;
HWND EditNum1,EditTotal;
char s_valor1[20] = "0";
char texto[100],buffer[10];
int tt;
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 wc2;
    wc2.cbClsExtra=0;
    wc2.cbSize=sizeof(wc2);
    wc2.cbWndExtra=0;
    wc2.hbrBackground=(HBRUSH) COLOR_BACKGROUND;
    wc2.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc2.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc2.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    wc2.lpfnWndProc=WinProc;
    wc2.lpszClassName="Janela";
    wc2.lpszMenuName=NULL;
    wc2.style=0;
    RegisterClassEx(&wc2);
    hwnd = CreateWindowEx(0,"Janela"," AQUI O NOME DA SUA JANELA",WS_OVERLAPPED|WS_SYSMENU,300,100,900,400,NULL,NULL,NULL,NULL);/*Janela*/
    bot1 = CreateWindowEx(0,"BUTTON","Area do Usuario" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,40,120,20,hwnd,(HMENU)1,0,0);
    bot2 = CreateWindowEx(0,"BUTTON","Area do Contador" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,80,120,20,hwnd,(HMENU)2,0,0);
    bot3 = CreateWindowEx(0,"BUTTON","SAIR" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,120,120,20,hwnd,(HMENU)3,0,0);
    bot4 = CreateWindowEx(0,"BUTTON","login" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,160,120,20,hwnd,(HMENU)4,0,0);
    bot5 = CreateWindowEx(0,"BUTTON","YOUTUBE" ,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,140,200,120,20,hwnd,(HMENU)5,0,0);

    EditNum1 = CreateWindowEx (
        WS_EX_CLIENTEDGE,
        "EDIT",
        "insira o login aqui",
        WS_VISIBLE|WS_CHILD|WS_BORDER|ES_RIGHT ,
        350, 30, 150, 30,
        hwnd,
        NULL,
        g_inst,
        NULL
        );
    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow(hwnd);
    while(GetMessage(&message,NULL,0,0)){
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam){
    switch(msg){
        case WM_CLOSE:
            PostQuitMessage(0);
            break;
        case WM_CREATE: //Processo de criação da janela
        case WM_COMMAND: //Mensagem enviada quando um controle é clicado:
            if ((HIWORD(wParam) == BN_CLICKED)){
                SendMessage(
                    (HWND) EditNum1,
	                (UINT) EM_GETLINE,
	                (WPARAM) 1,
	                (LPARAM) &s_valor1
                    );
            }
            switch(LOWORD(wParam)){ //Verifica parâmetro
                case 1: //Se for o botão
                    system ("start www.google.com");
                    break;
                case 2:
                    #include "c:/Dev-Cpp/area3.c"
                case 3:
                    exit(0);
                case 4: // Esse é o case dos botões do login
                    SendMessage(
                    (HWND) EditNum1,
                    (UINT) EM_GETLINE,
	                (WPARAM)hwnd,
                    (LPARAM) &s_valor1);
                    strcpy(login1,s_valor1);

                    if(strcmp(login1,login) == 0){
                        MessageBox(0,"LOGIN ACEITO","",0);
                    }
                    else{
                        MessageBox(0,"LOGIN REJEITADO","",0);
                    }
                    break;
                case 5:
                    system ("start www.youtube.com");
                    break;
            }
            break;
            default:
                return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    return 0;
}

 

 Também só sei com o EDIT man,faz que nem eu e cria um botão informando onde coloca o login,eu fiz no meu e ficou legalzinho.
 To morrendo de sono por isso nem vou tentar mais amanhã eu tento e se conseguir te mando como fiz.
Olha o meu atualmente!

a.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  é so usar a class static:

	hwnd label = createwindowex(0, "static", "login",
                                ws_child | ws_visible | ss_center | ss_centerimage,
                                25, 25, 100, 25, hwnd, null, null, null);

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 se for aquele fundo cinza no label, você tem q criar um callback para o botão igual o da janela, e trocar a cor do fundo usando WM_PAINT.

OBS: vocês também podem montar o layout da janela usando um arquivo de resource que é muito mais fácil.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gustavo Andretto  Man você que entende poderia fazer um tutorial depois passo a passo como modificar janelas,icones etc... Ajudaria demais os novatos como eu :lol:
 

se for aquele fundo cinza no label, você tem q criar um callback para o botão igual o da janela, e trocar a cor do fundo usando WM_PAINT.
OBS: vocês também podem montar o layout da janela usando um arquivo de resource que é muito mais fácil.


  Poderia me dar um exemplo? Desde já obrigado pela ajuda 



 

@devair1010  Não sei se você quer ou já tem mais segue o link de um tutorial muito bom

http://www.forum-invaders.com.br/vb/archive/index.php/t-8290.html GUI
E esse não tinha olhado ainda mais vi que estava salvo aqui nos favoritos,ele tem varias funções ...
http://www.kydsoft.com/winui/pt/index.htm

Editado por Xaws
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Window Example.7z

@devair1010 @Xaws fiz uma janela usando o arquivo de resource pra você's darem uma olhada.

 

Código abaixo, também anexei o projeto do visual studio.

Main.cpp

~~

Resource.h

~~

Resource.rc

~~

resultado:

~~

próxima coisa a fazer é limpar a tela atual e fazer a tela do usuário.

como fazer:

- crie uma nova janela na resource.

- crie o callback para essa janela

- faça com que quando a validação do login for bem sucedida a janela do

login desapareça ShowWindow() e para aparecer a outra janela.

acho que é só hehe.

 

Recomendo você dar uma olhada depois no ImGui,  da pra fazer muito mais coisas

que não da pra fazer usando a api do windows.

Editado por Gustavo Andretto
retirar código
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gustavo Andretto  Eu fiz dessa forma no meu ontem,ao fazer o login ele puxa a segunda tela e um ShowWindow(FindWindow(NULL,"NOME DA JANELA AQUI"),SW_HIDE) ;no código da segunda janela faz a primeira sumir ^^

 Legal você postar seu código,vou estudar ele depois pra ver como modificar o icone,tenho dificuldade nisso só consegui colocar um icone no meu porque o próprio compilador (devc++) faz isso pra mim :P 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gustavo Andretto  Ei cara me ajuda,tipo... Eu crio a Janela 1 normal,ai em um arquivo.C eu crio uma segunda janela e em outro arquivo uma terceira janela.

 

 Eu estava tentando fazer o seguinte,na janela 2 tem um LISTBOX e um botão que leva pra janela 3 (incluir),eu clico nesse botão e na janela 3 tem um botão edit pra escrever e um BUTTON pra enviar...ele captura o que eu escrevo e era pra mandar pro listbox.
 O problema é que quando eu faço em janelas separadas assim ele não funciona,mais quando eu faço na mesma janela ele funciona.

 O que pode ser, você sabe? (lembrando,eu uso o DevC++) 

Editado por Xaws
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Xaws você precisa salvar os valores do listbox em um local onde as outras janelas também tenham acesso.

Poste seu código para darmos uma olhada.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include "includes.c"
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;
HWND login;
HWND senha;
WNDCLASSEX wc2;
wc2.cbClsExtra=0;
wc2.cbSize=sizeof(wc2);
wc2.cbWndExtra=0;
wc2.hbrBackground=(HBRUSH) COLOR_WINDOW+0;
wc2.lpszMenuName = NULL;
wc2.lpfnWndProc=WinProc;
wc2.lpszClassName="Janela";
wc2.style=0;
RegisterClassEx(&wc2);
hwnd = CreateWindowEx(1,"Janela","CONTROLE DE ESTOQUE",WS_CAPTION|WS_SYSMENU,350,200,900,400,NULL,NULL,NULL,NULL);
CreateWindowEx(0,"BUTTON","",WS_CHILD|WS_VISIBLE|WS_DISABLED,290,88,300,160,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"STATIC","USUARIO" ,WS_CHILD|WS_VISIBLE,350,132,200,50,hwnd,(HMENU)0,0,0); 
login = CreateWindowEx(0,"EDIT","",WS_CHILD|WS_VISIBLE,420,130,100,20,hwnd,(HMENU)1,0,0);
CreateWindowEx(0,"STATIC"," SENHA" ,WS_CHILD|WS_VISIBLE,352,162,200,20,hwnd,(HMENU)0,0,0);
senha = CreateWindowEx(0,"EDIT","",WS_CHILD|WS_VISIBLE,420,162,100,20,hwnd,(HMENU)1,0,0);
CreateWindowEx(0,"BUTTON","LOGAR",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,420,195,100,20,hwnd,(HMENU)1,0,0);
//-------------------------------------------------------------------------------------------------------------------------------
CreateWindowEx(0,"STATIC","Versão 1.0" ,WS_CHILD|WS_VISIBLE,785,342,200,20,hwnd,(HMENU)0,0,0);

ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&message,0,0,0)){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
PostQuitMessage(0);
break;
case WM_CREATE: 
case WM_COMMAND:
switch(wParam) 
{
case 0:
break;

case 1:
voltar:
#include "janela2.c"
 break;
 
 case 2:
#include "incluir.c"
break;

case 3:
char buffer[256];
SendMessage(listbox,LB_ADDSTRING,0,(LPARAM)buffer);
break;

case 4:
goto voltar;
}
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}

 

Janela 2 (onde fica o listbox)

 

ShowWindow(hwnd,SW_HIDE);
MSG message;
WNDCLASSEX wc2;
wc2.cbClsExtra=0;
wc2.cbSize=sizeof(wc2);
wc2.cbWndExtra=0;
wc2.hbrBackground=(HBRUSH) COLOR_WINDOW+0;
wc2.lpszMenuName = NULL;
wc2.lpfnWndProc=WinProc;
wc2.lpszClassName="Janela2";
wc2.style=0;
RegisterClassEx(&wc2);
hwnd = CreateWindowEx(1,"Janela2","CONTROLE DE ESTOQUE",WS_OVERLAPPED|WS_SYSMENU,350,200,900,400,NULL,NULL,NULL,NULL);
CreateWindowEx(0,"STATIC","ENTRADA:",WS_CHILD|WS_VISIBLE,30,68,100,100,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"STATIC","SAIDA:",WS_CHILD|WS_VISIBLE,30,98,100,100,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"STATIC","CANCELADA:",WS_CHILD|WS_VISIBLE,30,128,100,100,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"STATIC","PRODUTOS",WS_CHILD|WS_VISIBLE,600,10,100,100,hwnd,(HMENU)0,0,0);
listbox = CreateWindowEx(0,"LISTBOX","",WS_CHILD|WS_BORDER|WS_VISIBLE,420,30,450,300,hwnd,(HMENU)3,0,0);
CreateWindowEx(0,"BUTTON","INCLUIR",WS_CHILD|WS_VISIBLE,435,323,100,30,hwnd,(HMENU)2,0,0);
CreateWindowEx(0,"BUTTON","EDITAR",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,540,323,100,30,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"BUTTON","REMOVER",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,645,323,100,30,hwnd,(HMENU)0,0,0);
CreateWindowEx(0,"BUTTON","LISTAR",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,750,323,100,30,hwnd,(HMENU)0,0,0);
//-------------------------------------------------------------------------------------------------------------------------------
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);

Janela 3 (onde fica o botão pra escrever o item e envia-lo pro listbox)

 

ShowWindow(hwnd,SW_HIDE);
MSG message3;
WNDCLASSEX wc3;
wc3.cbClsExtra=0;
wc3.cbSize=sizeof(wc3);
wc3.cbWndExtra=0;
wc3.hbrBackground=(HBRUSH) COLOR_WINDOW+0;
wc3.lpszMenuName = NULL;
wc3.lpfnWndProc=WinProc;
wc3.lpszClassName="Janela3";
wc3.style=0;
RegisterClassEx(&wc3);
hwnd = CreateWindowEx(1,"Janela3","CONTROLE DE ESTOQUE",WS_OVERLAPPED|WS_SYSMENU,350,200,900,400,NULL,NULL,NULL,NULL);
box = CreateWindowEx(0,"EDIT","ITEM",WS_CHILD|WS_VISIBLE,90,68,60,60,hwnd,(HMENU)3,0,0);
CreateWindowEx(0,"BUTTON","ENVIAR",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,30,108,60,60,hwnd,(HMENU)3,0,0);
CreateWindowEx(0,"BUTTON","VOLTAR",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,30,168,60,60,hwnd,(HMENU)4,0,0);
//-------------------------------------------------------------------------------------------------------------------------------
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);

 

Janela com os valores como você disse
 

#include <windows.h>
#include <stdio.h>
HWND box;
HWND listbox;


 E não deu certo

Editado por Xaws
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Xaws os objetos que estão dentro do escopo de #include "janela2.c"#include "incluir.c" não possuem acesso às variáveis um do outro, você precisa fazer com que todos os handles estejam no mesmo escopo ou precisar fazer uma forma de acessar as variaveis do outro escopo passando-os por referência ou usando ponteiro. A forma que você está modularizando seu código não é correta. assim que eu tiver um tempo eu dou uma organizada no seu código e posto aqui.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gustavo Andretto  Fico no aguardo :P ,nem precisa arrumar ... Só me mostra um exemplo de como eu posso fazer :thumbsup:

Editado por Xaws

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Xaws bom vamos la,

 - Não modularize seu código da forma que você estava fazendo usando includes, em vez disso faça

um arquivo de cabeçalho .h que ficará os protótipos das sua funções e depois faça as implementações no arquivo .c

exemplo:

// Arquivo .h
#ifndef _MEUARQIVO_H // isso aqui evita que o codigo abaixo seja incluído mais de uma vez
#define _MEUARQUIVO_H
  
// prototipo da função, sua implementação deverá ficar no arquivo de mesmo nome .c
int retornar_dez();

#endif // _MEUARQUIVO_H
  
// Arquivo .c
#include "meuarquivo.h"

int retornar_dez()
{
  return 10;
}

- Não use goto, não que seja errado usá-lo, mas existe lugar certo para usá-lo e da forma que estás a fazer acaba complicando a leitura do seu código.

 

Segue abaixo o seu código organizado, está todo comentado, qualquer coisa é só perguntar.:thumbsup:

obs: vou retirar o código do meu post mais acima pois senão este tópico ficará gigantesco hehe.

#include <windows.h>
#include <tchar.h> // _T
#include <stdio.h>

// Aqui fica todos os comandos dos botões que serão tratados em WM_COMMAND
// geralmente isso é adicionado no arquivo de resource
// por padrão é representado por um número hexadecimal, mas pode ser qualquer valor dec/hex
#define IDC_BUTTON_LOGIN 0x10 
#define IDC_BUTTON_INCLUDE 0x12
#define IDC_BUTTON_EDIT 0x14
#define IDC_BUTTON_REMOVE 0x16
#define IDC_BUTTON_LIST 0x18
#define IDC_BUTTON_SEND 0x20
#define IDC_BUTTON_BACK 0x22

// Handles das janelas
HWND gLoginWindow,
gListWindow,
gAddProductWindow;

// Handles dos componentes da janela de login
HWND gUsernameField,
gPasswordField,
gButtonLogin;

// Handles dos componentes da janela de produtos
HWND gProductList;

// Handles dos components da janela de incluir produto
HWND gItemField;

// O nome da classe usada em MyRegisterClass()
LPTSTR szWindowClass = _T("MyWindowClass");

// Os titulos das janelas do programa
LPTSTR szLoginWindowTitle = _T("CONTROLE DE ESTOQUE");
LPTSTR szListWindowTitle = _T("CONTROLE DE ESTOQUE: Lista de Produtos");
LPTSTR szAddProductWindowTitle = _T("CONTROLE DE ESTOQUE: Adicionar Produto");

// Login e senha do usuário
LPTSTR szUsername = _T("admin");
LPTSTR szPassword = _T("password");

// Tamanho do buffer dos campos de escrita
#define FIELD_LENGTH 128

// Aqui ficam os protótipos das funções que estão abaixo de WinMain
ATOM MyRegisterClass(const LPTSTR szClass, HINSTANCE hInstance);
BOOL InitializeComponents(HINSTANCE hInstance, INT cmdShow);
LRESULT CALLBACK WndProc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE/*hPrevInstance*/, LPSTR/*lpCmdLine*/, INT nShowCmd)
{
	if (!InitializeComponents(hInstance, nShowCmd))
		return EXIT_FAILURE;

	MSG message;
	while (GetMessage(&message, 0, 0, 0))
	{
		TranslateMessage(&message);
		DispatchMessage(&message);
	}

	return (INT)message.wParam;
}

ATOM MyRegisterClass(const LPTSTR szClass, HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	// Precisamos usar ZeroMemory() aqui pois não estamos
	// inciando todos os valores da struct WNDCLASSEX
	ZeroMemory(&wcex, sizeof(wcex));

	wcex.cbSize = sizeof(wcex);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 0);
	wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
	wcex.lpszMenuName = NULL;
	wcex.lpfnWndProc = WndProc;
	wcex.lpszClassName = szClass;

	return RegisterClassEx(&wcex);
}

BOOL InitializeComponents(HINSTANCE hInstance, INT cmdShow)
{
	// Vamos criar a classe para a janela,
	// esta classe apenas define o estilo da janela e a sua função de callback,
	// podemos usar esta classe para todas as demais janelas que serão criadas logo após
	if (!MyRegisterClass(szWindowClass, hInstance))
	{
		MessageBox(NULL, _T("MyRegisterClass() Failed!"), NULL, MB_OK | MB_ICONERROR);
		return FALSE;
	}

	// Janela de login
	gLoginWindow = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szWindowClass, szLoginWindowTitle, 
		WS_CAPTION | WS_SYSMENU, 350, 200, 900, 400, NULL, NULL, hInstance, NULL);

	CreateWindowEx(0, _T("BUTTON"), NULL, WS_CHILD | WS_VISIBLE | WS_DISABLED,
		290, 88, 300, 160, gLoginWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("USUARIO"), WS_CHILD | WS_VISIBLE,
		350, 132, 200, 50, gLoginWindow, NULL, NULL, NULL);

	gUsernameField = CreateWindowEx(0, _T("EDIT"), _T(""), WS_TABSTOP | WS_CHILD | WS_VISIBLE,
		420, 130, 100, 20, gLoginWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T(" SENHA"), WS_CHILD | WS_VISIBLE,
		352, 162, 200, 20, gLoginWindow, NULL, NULL, NULL);

	gPasswordField = CreateWindowEx(0, _T("EDIT"), _T(""), ES_PASSWORD | WS_TABSTOP | WS_CHILD | WS_VISIBLE,
		420, 162, 100, 20, gLoginWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("LOGAR"), WS_TABSTOP | WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		420, 195, 100, 20, gLoginWindow, (HMENU)IDC_BUTTON_LOGIN, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("Versão 1.0"), WS_CHILD | WS_VISIBLE,
		785, 342, 200, 20, gLoginWindow, NULL, NULL, NULL);

	// Agora vamos iniciar as outras janelas aqui MAS não vamos usar deixa-las visíveis ainda.
	// Obs: como estamos usando a mesma função de callback para toda as janelas, não podemos usar
	// o mesmo valor para HMENU, mesmo estando em janelas diferentes serão tratados pela mesma função(WndProc)

	// Janela da lista de produtos
	gListWindow = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, szWindowClass, szListWindowTitle,
		WS_OVERLAPPED | WS_SYSMENU, 350, 200, 900, 400, NULL, NULL, hInstance, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("ENTRADA:"), WS_CHILD | WS_VISIBLE,
		30, 68, 100, 100, gListWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("SAIDA:"), WS_CHILD | WS_VISIBLE,
		30, 98, 100, 100, gListWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("CANCELADA:"), WS_CHILD | WS_VISIBLE,
		30, 128, 100, 100, gListWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("STATIC"), _T("PRODUTOS"), WS_CHILD | WS_VISIBLE,
		600, 10, 100, 100, gListWindow, NULL, NULL, NULL);

	gProductList = CreateWindowEx(0, _T("LISTBOX"), _T(""), WS_CHILD | WS_BORDER | WS_VISIBLE,
		420, 30, 450, 300, gListWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("INCLUIR"), WS_CHILD | WS_VISIBLE,
		435, 323, 100, 30, gListWindow, (HMENU)IDC_BUTTON_INCLUDE, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("EDITAR"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		540, 323, 100, 30, gListWindow, (HMENU)IDC_BUTTON_EDIT, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("REMOVER"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		645, 323, 100, 30, gListWindow, (HMENU)IDC_BUTTON_REMOVE, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("LISTAR"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		750, 323, 100, 30, gListWindow, (HMENU)IDC_BUTTON_LIST, NULL, NULL);

	// Janela Incluir produto
	gAddProductWindow = CreateWindowEx(0, szWindowClass, szAddProductWindowTitle,
		WS_OVERLAPPED | WS_SYSMENU | WS_CLIPCHILDREN, 350, 200, 900, 400, gListWindow, NULL, hInstance, NULL);

	gItemField = CreateWindowEx(0, _T("EDIT"), _T(""), WS_CHILD | WS_VISIBLE,
		120, 60, 150, 20, gAddProductWindow, NULL, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("ENVIAR"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		30, 108, 60, 60, gAddProductWindow, (HMENU)IDC_BUTTON_SEND, NULL, NULL);

	CreateWindowEx(0, _T("BUTTON"), _T("VOLTAR"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
		30, 168, 60, 60, gAddProductWindow, (HMENU)IDC_BUTTON_BACK, 0, 0);

	// Por fim, iniciaremos a janela usando ShowWindow()
	ShowWindow(gLoginWindow, cmdShow);
	UpdateWindow(gLoginWindow);

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_COMMAND:
		{
			switch (LOWORD(wParam))
			{
			case IDC_BUTTON_LOGIN:
				{
					TCHAR bufferUsernameField[FIELD_LENGTH];
					TCHAR bufferPasswordField[FIELD_LENGTH];

					GetWindowText(gUsernameField, bufferUsernameField, FIELD_LENGTH);
					GetWindowText(gPasswordField, bufferPasswordField, FIELD_LENGTH);

					if (lstrcmp(szUsername, bufferUsernameField) == 0)
					{
						if (lstrcmp(szPassword, bufferPasswordField) == 0)
						{
							// Login bem succedido!
							// agora vamos ocultar a janela de login e mostrar a janela de produto
							ShowWindow(gLoginWindow, SW_HIDE);
							ShowWindow(gListWindow, SW_SHOW);
						}
						else
						{
							MessageBox(NULL, _T("Invalid password!"), _T("Login Message"), MB_OK);
						}
					}
					else
					{
						MessageBox(NULL, _T("Invalid login!"), _T("Login Message"), MB_OK);
					}
				}
				break;
			case IDC_BUTTON_INCLUDE:
				{
					ShowWindow(gListWindow, SW_HIDE);
					ShowWindow(gAddProductWindow, SW_SHOW);
				}
				break;
			case IDC_BUTTON_EDIT:
				{
					// Implementação do botão editar item
				}
				break;
			case IDC_BUTTON_REMOVE:
				{
					// Aqui vai a implementação do botão remover
				}
				break;
			case IDC_BUTTON_LIST:
				{
					// Aqui vai a implementação de quando pressionar o botao Listar
				}
				break;
			case IDC_BUTTON_BACK:
				{
					ShowWindow(gAddProductWindow, SW_HIDE);
					ShowWindow(gListWindow, SW_SHOW);
				}
				break;
			case IDC_BUTTON_SEND:
				{
					TCHAR bufferItemField[FIELD_LENGTH];

					GetWindowText(gItemField, bufferItemField, FIELD_LENGTH);

					SendMessage(gProductList, LB_ADDSTRING, NULL, (LPARAM)bufferItemField);
				}
				break;
			}
		}
		break;
	case WM_DESTROY:
		{
			PostQuitMessage(0);
		}
		break;
	default:
		return DefWindowProc(hwnd, msg, wParam, lParam);
	}

	return 0;
}

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gustavo Andretto  Muito obrigado,funcionou perfeitamente. 
 Me ajudou demais,código complexo já vai servir pra eu estudar :lol: e com certeza vai ajudar demais quem está começando com GUI

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×