#include #include // _T #include FILE *estoque; // 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; HWND gItemField2; // 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("a"); LPTSTR szPassword = _T("b"); // 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 + 2); wcex.hCursor = LoadCursor(NULL, 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); gItemField2 = CreateWindowEx(0, _T("EDIT"), _T(""), WS_CHILD | WS_VISIBLE, 260, 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) { 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: { estoque = fopen ("estoque.txt","r"); SendMessage(gProductList, LB_ADDSTRING, 0, (LPARAM)estoque); fclose(estoque); } break; case IDC_BUTTON_BACK: { ShowWindow(gAddProductWindow, SW_HIDE); ShowWindow(gListWindow, SW_SHOW); } break; case IDC_BUTTON_SEND: { estoque = fopen ("estoque.txt","a+"); TCHAR bufferItemField[FIELD_LENGTH]; TCHAR bufferItemField2[FIELD_LENGTH]; GetWindowText(gItemField, bufferItemField, FIELD_LENGTH); GetWindowText(gItemField2, bufferItemField2, FIELD_LENGTH); SendMessage(gProductList, LB_ADDSTRING, 0, (LPARAM)bufferItemField); fprintf(estoque,"\n"); fprintf(estoque,"PRODUTO: "); fprintf(estoque,bufferItemField); fprintf(estoque," PREÇO: "); fprintf(estoque,bufferItemField2); fclose(estoque); } break; } } break; case WM_DESTROY: { PostQuitMessage(0); } break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }