Ir ao conteúdo
  • Cadastre-se

Gustavo Andretto

Membro Pleno
  • Posts

    120
  • Cadastrado em

  • Última visita

  1. @HebertCleiton cout e cin fazem parte do namespace std, então você deve usar std::cout, std::cin.
  2. @BrunaW Cada camada você adiciona +1 espaço no começo e retira 1 número no final. 1 2 3 4 5 6 7 8 9 [] 2 3 4 5 6 7 8 [] <= espaço no início, 9 retirado no final [] [] 3 4 5 6 7 [] [] <= +2 espaço no início, -2 números no final ......
  3. @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. 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; }
  4. @Xaws os objetos que estão dentro do escopo de #include "janela2.c" e #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.
  5. @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.
  6. 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.
  7. @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.
  8. @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);
  9. @EmersonFerreiraBjj vou presumir que você está usando a biblioteca std::chrono. Armazene o time_point ao iniciar e só limpe-o quando você quiser reiniciar. #include <iostream> #include <thread> #include <chrono> using std::chrono::steady_clock; using std::chrono::time_point; using std::chrono::duration; using std::chrono::duration_cast; using namespace std::literals::chrono_literals; class timer { public: void start() { started_in = steady_clock::now(); } void stop() { stopped_in = steady_clock::now(); } // tempo decorrido desde o inicio do timer ao tempo da chamada deste método std::chrono::nanoseconds get_time_lapsed() const { return (steady_clock::now() - started_in); } // tempo decorrido desde o inicio do timer ao tempo da chamada do método 'stop' std::chrono::nanoseconds get_timer_interval() const { return(stopped_in - started_in); } // reseta o timer void reset() { started_in = time_point<steady_clock>(); stopped_in = time_point<steady_clock>(); } timer() {} protected: time_point<steady_clock> started_in; time_point<steady_clock> stopped_in; }; int main() { timer test; test.start(); std::this_thread::sleep_for(100ms); test.stop(); std::cout << ((double)test.get_time_lapsed().count() / 1000000) << "ms" << std::endl; std::this_thread::sleep_for(300ms); test.stop(); std::cout << ((double)test.get_time_lapsed().count() / 1000000) << "ms" << std::endl; test.reset(); test.start(); std::this_thread::sleep_for(1000ms); test.stop(); std::cout << ((double)test.get_time_lapsed().count() / 1000000) << "ms" << std::endl; return 0; }
  10. @Benjamin Breeg double valor = 0; // muda pra int
  11. recomendo o blender, sculptris ou zbrush blender para objetos sculptris/zbrush para personagens
  12. // essa query retornará apenas 1 resultado caso o nome de usuário seja unique, ou seja, não tenha dois 'username' iguais query -> "SELECT * FROM login WHERE username='nome_de_usuario'" //sql_store_result... //row = sql_fetch_row... // ex: table login: // id, username, password. row* size = 3 if(row[posicao do username]/*row[1] = username*/ != input.username) { // conta nao encontrada } if(row[posicao da senha]/*row[2] = senha*/ != input.password) { // senha incorreta } @Getúlio Melo
  13. @Lucas Da Silva Rezende opa, erro meu, acabei te confundindo. ali onde está TAMANHO_LISTA você coloca o tamanho da sua struct LISTA, a quantidade de cadastros que cabem. struct LISTA lista_pessoa[30 /*<- TAMANHO_LISTA*/]; // aqui você tem que checar se retorno de strcmp foi 0(isequal) if(strcmp(chave, pCons->ps[i].nome) == 0) ou use o operador ! if(!strcmp(chave, pCons->ps[i].nome)) segue meu rascunho #include <stdio.h> #include <string.h> #define QUANTIDADE_PESSOA 50 #define TAMANHO_NOME 32 typedef struct pessoa { char nome[TAMANHO_NOME]; int idade; //... } pessoa_t; typedef struct lista { pessoa_t ps[QUANTIDADE_PESSOA]; } LISTA; void consultarDados(char *chave, LISTA *pCons) { int i; for (i = 0; i < QUANTIDADE_PESSOA; i++) { if (!strcmp(chave, pCons->ps[i].nome)) { printf("Nome: %s\n", pCons->ps[i].nome); printf("Idade: %d\n", pCons->ps[i].idade); //printf("Logradouro: %s", pCons->ps[i].logr); //printf("Número da casa: %d", pCons->ps[i].numCasa); //printf("CEP: %s", pCons->ps[i].CEP); //printf("Bairro: %s", pCons->ps[i].bairro); //printf("Cidade: %s", pCons->ps[i].city); //printf("Telefone: %s", pCons->ps[i].fone); //printf("Nome do Pai: %s", pCons->ps[i].pai); //printf("Nome da Mãe: %s", pCons->ps[i].mae); } } } int main() { LISTA lista; strcpy(lista.ps[0].nome, "joao"); lista.ps[0].idade = 15; strcpy(lista.ps[20].nome, "joao"); lista.ps[20].idade = 26; consultarDados("joao", &lista); return 0; }
  14. use strcmp() pra verificar o nome que você busca com os nomes na lista. exemplo: // laço para procurar pelo nome na lista, TAMANHO_LISTA é o tamanho de sua lista for (int i = 0; i < TAMANHO_LISTA; i++) { // condição que verifica se o nome à ser procurado é igual ao nome que está na lista // strcmp() -> 1 parâmetro recebe o nome à ser procuraro, 2 parâmetro recebe a posição do nome que esta a ser comparado no momento // strcmp retorna 0 se os valores passados são iguais if (strcmp("joao", lista[i].nome) == 0) printf("Encontrado, pos: [%d]\n", i); }
  15. é só seguir a tabulação que não tem erro, e sempre que se perder você pode dar um clique em uma das chaves que o compilador ira realçar a outra chave.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...