Tag: recursos win32
sessão 10 – Programação gráfica orientada a eventos (os recursos win32)
O uso de recursos vem ajudar a construir elementos gráficos e sem ter que os desenhar!
Para fazer uso, é adicionar a um projeto vazio o recurso:
Existem vários tipos:
Sendo que uma das primeiras opções podem ser o Icon:
O ícone pode ser desenhado, pelo que é recomendado que primeiro se eliminem os que já existem, quando faltar um, adicionamos um vazio de 24 bits para termos o máximo de cores disponíveis, e de seguida voltamos a eliminar o ultimo ícone que ficou e que existia por defeito.
Usando a barra de desenho no topo podemos alterar este ícone
Nas propriedades podemos alterar o nome do ID, por exemplo para IDI_ICON_APP
Outro recurso pode ser o uso de menus..
Nas propriedades podemos indicar que as opções na barra de menus sejam de ação ao invés de mostrar outras opções no menu:
Popup -> FALSE
E as opções das caixas de diálogo:
Static Text
Edit Control
Button
Accelerator (para lidar com as teclas de atalho)
String Table
(…)
Nos Accelerator são definidas os comportamentos das teclas de atalho:
As Strings table (definir ID e definir um texto para eles):
e ainda o cursor, sendo que no final:
e os comportamentos dos componentes..
#include <windows.h> #include <Windowsx.h> #include <tchar.h> #include "resource.h" //importante para acesso aos IDs.. #define NUM_CLIENTES 3 #define LIST_SIZE 8 TCHAR* LIST_ITENS[] = { TEXT("10€"), TEXT("20€"), TEXT("40€"), TEXT("60€"), TEXT("80€"), TEXT("100€"), TEXT("150€"), TEXT("200€") }; //três soluções para tratamentos de eventos de janelas: dialog boxes LRESULT CALLBACK TrataEventos(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK TrataEventosLogin(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK TrataEventosLevantar(HWND, UINT, WPARAM, LPARAM); TCHAR szProgName[] = TEXT("Ficha8"); typedef struct { unsigned int ID; TCHAR username[16]; TCHAR password[16]; unsigned int saldo; } cliente; typedef struct { unsigned int tipo; // 1 = depósito, 2 = levantamento unsigned int quantia; unsigned int ID; } operacao; //estrutura agreagadora para nao usar variaveis globais typedef struct { cliente clientes[NUM_CLIENTES]; operacao historico[200]; unsigned int numOperacoes; } dados; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { HWND hWnd; MSG lpMsg; WNDCLASSEX wcApp; HANDLE hAccel; dados dadosPartilhados; wcApp.cbSize = sizeof(WNDCLASSEX); wcApp.hInstance = hInst; wcApp.lpszClassName = szProgName; wcApp.lpfnWndProc = TrataEventos; wcApp.style = CS_HREDRAW | CS_VREDRAW; wcApp.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_APP)); // ID wcApp.hIconSm = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_APP)); wcApp.hCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_POINTER)); wcApp.lpszMenuName = MAKEINTRESOURCE(IDR_MENU_PRINCIPAL); wcApp.cbClsExtra = sizeof(dados); //janela tem espaço extra wcApp.cbWndExtra = 0; wcApp.hbrBackground = CreateSolidBrush(RGB(220, 220, 220)); if (!RegisterClassEx(&wcApp)) return(0); hWnd = CreateWindow( szProgName, TEXT("SO2 - win 32"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 150, (HWND)HWND_DESKTOP, (HMENU)NULL, (HINSTANCE)hInst, 0); dadosPartilhados.numOperacoes = 5; // Apenas para testar... LONG_PTR x = SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)&dadosPartilhados); //obter da janela bytes da struct de dados ShowWindow(hWnd, nCmdShow); //processamento dos atalhos hAccel = LoadAccelerators(NULL, MAKEINTRESOURCE(IDR_ACCELERATOR)); while (GetMessage(&lpMsg, NULL, 0, 0)) { if (!TranslateAccelerator(hWnd, hAccel, &lpMsg)) { TranslateMessage(&lpMsg); DispatchMessage(&lpMsg); } } return((int)lpMsg.wParam); } LRESULT CALLBACK TrataEventos(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { TCHAR str1[512], str2[512]; dados* dadosPartilhados; dadosPartilhados = (dados*)GetWindowLongPtr(hWnd, GWLP_USERDATA); switch (messg) { case WM_CREATE: EnableMenuItem(GetMenu(hWnd), ID_CONSULTA, MF_DISABLED | MF_GRAYED); EnableMenuItem(GetMenu(hWnd), ID_LEVANTAMENTO, MF_DISABLED | MF_GRAYED); break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_LOGIN: DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG_LOGIN), hWnd, TrataEventosLogin); EnableMenuItem(GetMenu(hWnd), ID_CONSULTA, MF_ENABLED); //ficam disponiveis EnableMenuItem(GetMenu(hWnd), ID_LEVANTAMENTO, MF_ENABLED); //ficam disponiveis break; case ID_CONSULTA: case ID_ACCELERATOR_C: LoadString(NULL, IDS_STR_CONSULTA, str1, 512); _stprintf_s(str2, 512, TEXT("%s (%d)"), str1, dadosPartilhados->numOperacoes); MessageBox(hWnd, str2, TEXT("String Table"), MB_OK | MB_ICONINFORMATION); break; case ID_ACCELERATOR_L: case ID_LEVANTAMENTO: DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG_LEVANTAMENTO), NULL, TrataEventosLevantar); break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, messg, wParam, lParam); break; } return(0); } LRESULT CALLBACK TrataEventosLogin(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { TCHAR username[16]; switch (messg) { //lidar com clique no menu case WM_COMMAND: if (LOWORD(wParam) == IDOK) { GetDlgItemText(hWnd, IDC_LEVANTAMENTO_LOGIN, username, 16); MessageBox(hWnd, username, TEXT("Username"), MB_OK | MB_ICONINFORMATION); } else if (LOWORD(wParam) == IDCANCEL) { EndDialog(hWnd, 0); return TRUE; } break; case WM_CLOSE: EndDialog(hWnd, 0); return TRUE; } return FALSE; } LRESULT CALLBACK TrataEventosLevantar(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam) { int i; switch (messg) { case WM_INITDIALOG: HWND hwndList = GetDlgItem(hWnd, IDC_LIST_MONTANTES); SendMessage(hwndList, LB_RESETCONTENT, 0, 0); for (i = 0; i < LIST_SIZE; i++) SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)LIST_ITENS[i]); break; case WM_COMMAND: if (LOWORD(wParam) == IDC_LIST_MONTANTES) { switch (HIWORD(wParam)) { case LBN_DBLCLK: HWND hwndList = GetDlgItem(hWnd, IDC_LIST_MONTANTES); i = (int)SendMessage(hwndList, LB_GETCURSEL, 0, 0); MessageBox(hWnd, LIST_ITENS[i], TEXT("ListBox"), MB_OK | MB_ICONINFORMATION); break; } } break; case WM_CLOSE: EndDialog(hWnd, 0); return TRUE; } return FALSE; }