DAVIFN 0 Denunciar post Postado Novembro 10, 2012 Muito bem pessoal, aqui vou-lhes ensinar a criar janelas em C++ com a GUI do Windows. Primeiramente declararemos um HWND, que é nada mais nada menos do que o coração da janela. Para isto, utilizaremos: HWND hwnd HWND (Nome do HWND) é a função para isto. Já declaramos, então vamos para as mensagens. A mensagem é quando, alguém utiliza a janela, retorna uma mensagem para a verificação no CALLBACK, portanto: MSG messages; Agora, criaremos uma classe para alojar a janela. WNDCLASSEX wincl; Vamos registrar esta classe. wincl.hInstance = hThisInstance; wincl.lpszClassName = "a"; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_WINDOW; if (!RegisterClassEx (&wincl)) return 0; // Caso não seja possivel registrar, encerra-se o programa. Agora, criaremos a janela utilizando o HWND. hwnd=CreateWindowEx ( 0, "a", "Windows App", WS_OVERLAPPEDWINDOW|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); Janela criada, agora, para mantê-la ativa, vamos precisar desta função: while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } Agora, precisaremos de um CALLBACK para receber as mensagens. declararemos um CALLBACK como variável global, antes do início do programa. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); Nosso código, está assim: #include <windows.h> LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = "a"; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx ( 0, "a", "Título", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } } Criaremos agora o CALLBACK, colocando isto no fim do código. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_DESTROY: return 0; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } Agora, caso compilarmos, veremos uma janela sem nada, branca. Vamos criar agora, um botão para ela. Basta trocar nosso CALLBACK por: LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch(wParam) { case 1: MessageBox(NULL,"O botão foi clicado com sucesso! Criado por DAVIFN!","Mensagem!",MB_OK); } return 0; case WM_CREATE: HWND Botao=Minimizar=CreateWindow("BUTTON","Botão",WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,96,100,100,54,hwnd,HMENU(1),NULL, NULL); return 0; case WM_DESTROY: return 0; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } Caso compilarmos, aparecerá um botão na janela, e, caso clicarmos neste botão aparecerá uma mensagem. Espero ter ajudado. Compartilhar este post Link para o post Compartilhar em outros sites
Mário Monteiro 179 Denunciar post Postado Novembro 11, 2012 Parabéns por compartilhar Compartilhar este post Link para o post Compartilhar em outros sites
Mateus GP 13 Denunciar post Postado Novembro 19, 2012 Muito bom o tutorial, apesar de não ser muito bem detalhado como o nome da classe ou sua função. Há muito tempo abandonei o desenvolvimento exclusivo para Windows, mas reconheço que em parte sinto falta das API's, por serem mais intuitivas a primeira vista, mas por motivos de portabilidade do código não as uso mais. Tenho em vista frameworks como: wxWidgets, GTK, Qt, etc. Não querendo abusar deixo uma dica: Use GetSysColorBrush para a janela se adequar ao tema do sistema. Exemplo: //... wincl.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); // Cor de fundo de caixas de dialogo //... Visite para mais detalhes: http://msdn.microsoft.com/en-us/library/windows/desktop/dd144927%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577%28v=vs.85%29.aspx Compartilhar este post Link para o post Compartilhar em outros sites