Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wanderson Regis Silva

[Resolvido] windows.h

Recommended Posts

Alguém ai pode me ajudar a resolver? Estou começando com C++ e estou estudando a biblioteca windows.h, minha intenção é desenvolver jogos então tô tentando usar no loop principal PeekMessage ao invés de GetMessage. Só que eu estou com um problema: o programa não finaliza completamente, a janela fecha mas o compilador (Dev-C++) fica "travado" não compila mais nade se eu alterar o código e se aperto Ctrl + Alt + Del o programa ainda está na lista de processos. O código atual é o seguinte:

wgui.cpp

CODE
#include <windows.h>

#include "wgui.h"

 

const char szClassName[] = "WinGUI";

 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR comandos, int show)

{

HWND hwnd;

MSG msg;

WNDCLASSEX wincl;

 

wincl.style = 0;

wincl.cbSize = sizeof(WNDCLASSEX);

wincl.hInstance = hInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure;

 

wincl.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));

wincl.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);

wincl.hCursor = LoadCursor(NULL, IDC_ARROW);

wincl.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);

wincl.cbClsExtra = 0;

wincl.cbWndExtra = 0;

 

wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

 

if(!RegisterClassEx(&wincl))

{

MessageBox(NULL, "Erro ao registrar a classe.", "Erro", MB_OK | MB_ICONERROR);

return 0;

}

 

hwnd = CreateWindowEx(0, szClassName, "Título da janela", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 480, 320,

NULL, NULL, hInstance, NULL);

 

if(hwnd == NULL)

{

MessageBox(NULL, "Erro ao criar janela.", "Erro", MB_OK | MB_ICONERROR);

return 0;

}

 

ShowWindow(hwnd, show);

 

while(TRUE)

{

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)

{

if(msg.message == WM_CLOSE)

{

break;

}

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return msg.wParam;

}

 

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch(msg)

{

case WM_COMMAND:

switch(LOWORD(wParam))

{

case ID_ARQUIVO_SAIR:

SendMessage(hwnd, WM_CLOSE, 0, 0);

break;

}

break;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

break;

default:

return DefWindowProc(hwnd, msg, wParam, lParam);

}

return 0;

}

wgui.h

#define IDI_MYICON 101
#define IDR_MYMENU 201

#define ID_ARQUIVO_SAIR 7001
wgui.rc

#include "wgui.h"

IDR_MYMENU MENU
{
	 POPUP "&Arquivo"
	 {
		  MENUITEM "&Sair", ID_ARQUIVO_SAIR
	 }
}

IDI_MYICON ICON "icone.ico"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola amigo.

 

Já tentou fazer isso?

 

while(TRUE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
{
if(msg.message == WM_CLOSE)
{
return msg.wParam;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou, mas deu certo quando na função WindowProcedure eu deixei assim:

...
case WM_CLOSE:
	 DestroyWindow(hwnd);
break;
case WM_DESTROY:
	 PostQuitMessage(0);
break;
E no loop principal:

...
	 while(TRUE)
	 {
		  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
		  {
			   if(msg.message == WM_QUIT)
			   {
					break;
			   }
			   TranslateMessage(&msg);
			   DispatchMessage(&msg);

		  }
	 }
	 return msg.wParam;
Mesmo assim valeu pela ajuda!!! XD

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.