Baixe o app para aproveitar ainda mais
Prévia do material em texto
Ju d so n S an to s S an ti ag o PROGRAMAÇÃO PARA WINDOWS Programação de Computadores Programação no Windows O Windows é um sistema operacional multitarefa Vários programas rodam concorrentemente disputando por recursos: Memória Processador Acesso à periféricos: vídeo, teclado, mouse, disco rígido Programação no Windows Cada programa é executando por uma fração de segundos, fornecendo a falsa impressão de que todos executam simultaneamente Programação no Windows Os programas escritos para Windows não acessam o hardware diretamente Word Paint Calc API (Win32, MFC, .NET) Sistema Operacional Hardware Programação no Windows A interface consistente é o resultado do uso de rotinas padronizadas de uma API As janelas têm a mesma interface porque elas são construídas pelas funções da API Estas funções padronizadas são compartilhadas em arquivos DLL (Dinamic Link Libraries) Programação no Windows Nas versões iniciais, a maior parte do Windows estava em três DLLs. Elas continham os três subsistemas principais: Kernel (kernel32.dll): gerenciamento de memória, entrada/saída de arquivos e escalonamento de tarefas User (user32.dll): interface do usuário e lógica de controle das janelas GDI (gdi32.dll): permite ao programa mostrar texto e gráficos na tela e impressora Programação no Windows Hoje o Windows possui milhares de funções disponibilizadas em suas DLLs As funções são declaradas em arquivos de cabeçalho (Ex.: windows.h) A documentação está disponível no MSDN (Microsoft Developer Network) O uso destas funções é semelhante ao uso de uma função da biblioteca padrão da linguagem C/C++, como strlen() Criando Projeto Windows Criar um projeto no Visual Studio 2012: File > New > Project Criando Projeto Windows Criar um projeto Win32: Visual C++ > Win32 > Win32 Project > ProgWin Criando Projeto Windows Criar um projeto Win32: Next Criando Projeto Windows Criar um projeto Win32: Windows application > Empty project > Finish Criando Projeto Windows Configurando Projeto Win32: Project > Properties Criando Projeto Windows Configurando Projeto Win32: Configuration Properties > General > Character Set > Not Set Primeiro Programa Windows O primeiro programa para Windows: Saída: #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, "Oi Windows!", "Mensagem Oi", 0); return 0; } Os Cabeçalhos A diretiva de pre-processamento #define inclui o arquivo de cabeçalho windows.h Windows.h é um arquivo de cabeçalho mestre que inclui vários outros: Windef.h - definições de tipos básicos Winbase.h - funções do kernel Winuser.h - funções de interface com o usuário Wingdi.h - interface com o dispositivo gráfico #include <windows.h> A Função WinMain WinMain é o ponto de entrada para todo programa Windows, assim como main é o ponto de entrada para programas no console em modo texto WINAPI é definido em windef.h como: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) #define WINAPI __stdcall Os Parâmetros hInstance – manipulador de instância, ou seja, um número para identificar a aplicação hPrevInstance – sempre nulo (parâmetro era usado em Win16 – Windows 3.1) szCmdLine – linha de comando passada na chamada do programa iCmdShow – define como o programa deve ser inicializado (maximizado, minimizado, tela cheia) int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) A Caixa de Mensagem Caixas de mensagens foram projetadas para mostrar mensagens curtas Parâmetros: Manipulador da janela (window handle) String de texto com a mensagem Texto da barra de título da janela Define o estilo da caixa de mensagem MessageBox (NULL, "Oi Windows!", "Mensagem Oi", 0); A Caixa de Mensagem Os estilos da caixa de mensagem podem ser alterados passando uma das constantes abaixo como último argumento MessageBox(NULL, "Iniciar a Instalação?", "Mensagem", MB_OKCANCEL); #define MB_OK 0x00000000L #define MB_OKCANCEL 0x00000001L #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_YESNOCANCEL 0x00000003L #define MB_YESNO 0x00000004L #define MB_RETRYCANCEL 0x00000005L A Caixa de Mensagem As constantes podem ser combinadas com o operador binário OR (|) para indicar qual é o botão padrão MessageBox(NULL, "Cancelar a Instalação?", "Mensagem", MB_YESNO | MB_DEFBUTTON2); #define MB_DEFBUTTON1 0x00000000L #define MB_DEFBUTTON2 0x00000100L #define MB_DEFBUTTON3 0x00000200L #define MB_DEFBUTTON4 0x00000300L A Caixa de Mensagem É possível também mostrar um ícone na caixa de mensagem MessageBox( NULL, "Prosseguir com a operação?", "Mensagem", MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION); #define MB_ICONHAND 0x00000010L #define MB_ICONQUESTION 0x00000020L #define MB_ICONEXCLAMATION 0x00000030L #define MB_ICONASTERISK 0x00000040L A Caixa de Mensagem A função MessageBox retorna o valor 1 se o botão OK for clicado, mas é mais correto dizer que ela retorna IDOK MessageBox (NULL, "Operação Inválida!", "Mensagem", MB_OK | MB_ICONWARNING); #define IDOK 1 #define IDCANCEL 2 #define IDABORT 3 #define IDRETRY 4 #define IDIGNORE 5 #define IDYES 6 #define IDNO 7 A Caixa de Mensagem #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int resp; resp = MessageBox(NULL, "Presseguir com a operação?", "Mensagem", MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION); if (resp == IDYES) { MessageBox(NULL, "Operação Inválida!", "Mensagem", MB_OK | MB_ICONWARNING); } return 0 ; } Criação de Janelas A caixa de mensagens é uma janela de propósito especial Para criar uma janela de propósito geral é preciso chamar a função CreateWindow Toda janela é baseada numa WindowClass Name Toda janela precisa de uma Window Procedure Para entender os argumentos da função CreateWindow é preciso conhecer a arquitetura do Windows Criação de Janelas msg 1 msg 2 msg 3 msg 4 ... msg n Fila de mensagens do sistema Fila de mensagens locais Fila de mensagens locais WinProc() WinMain() { } WinProc() WinMain() { } Criação de Janelas A função Principal WinMain int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // - Defina uma Window Class Name // - Registre a Window Class Name // - Cria uma janela baseada na Window Class Name while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } Criação de Janelas Definindo uma Window Class Name WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WinProc; wndclass.cbClsExtra = 0; // bytes extra wndclass.cbWndExtra = 0; // bytes extra wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "SimpleClass"; if (!RegisterClass (&wndclass)) { MessageBox(NULL, "Erro na criação da janela!", "Aplicação", MB_ICONERROR) ; return 0 ; }Criação de Janelas A função CreateWindow HWND hwnd; hwnd = CreateWindow( "SimpleClass", // window class name "Aplicação", // título da janela WS_OVERLAPPEDWINDOW, // tipo da janela CW_USEDEFAULT, // posição x inicial CW_USEDEFAULT, // posição y inicial CW_USEDEFAULT, // largura inicial CW_USEDEFAULT, // altura inicial NULL, // identificador da janela pai NULL, // identificador do menu hInstance, // identificador do programa NULL); // parâmetros de criação Criação de Janelas A função CreateWindow cria uma janela cuja interação pode ser capturada e tratada numa Window Procedure Fila de mensagens locais WinProc() WinMain() { } Criação de Janelas Definindo uma Window Procedure LRESULT CALLBACK WinProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: return 0; case WM_PAINT: HDC hdc = BeginPaint(hwnd, &ps); GetClientRect (hwnd, &rect); DrawText (hdc, "Minha Janela!", -1, &rect, DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps) ; return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } Criação de Janelas Uma lista resumida de mensagens: Mensagem Significado WM_ACTIVATE Enviado quando uma janela recebe o foco WM_CLOSE Enviado quando uma janela é fechada WM_CREATE Enviado quando uma janela é criada WM_DESTROY Enviado quando uma janela está para ser destruída WM_MOVE Enviado quando uma janela foi movida WM_MOUSEMOVE Enviado quando o mouse é movimentado WM_KEYUP Enviado quando uma tecla é solta WM_KEYDOWN Enviado quando uma tecla é pressionada WM_PAINT Enviado quando a janela precisa ser redesenhada WM_SIZE Enviado quando uma janela mudou de tamanho Criação de Janelas O código apresentado pode ser usado como ponto de partida para qualquer programa Windows A função CreateWindow é usada também para criar janelas filhas: Label, botão, barra de rolagem, caixa de texto, checkbox, groupbox, listbox, picturebox, radiobutton, etc. Exercício Construir um aplicativo para descobrir se uma palavra é um palíndromo Conclusão O Windows é o sistema operacional dominante no segmento de desktop Para criar aplicativos para Windows o programador deve usar as funções e o modelo de programação da API escolhida A API Win32 permite a criação de programas em linguagem C/C++ através da ligação dinâmica do aplicativo às bibliotecas da API
Compartilhar