Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2009, 22:37   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию окно уничтоженно, а процесс висит...почему?

использую 2008 студию.

Код:
// GL2.cpp: определяет точку входа для приложения.
//

#include <windows.h>
//#include <GL\GL.h>
//#include <GL\glu.h>
//#pragma comment(lib,"opengl32.lib")

WNDCLASS MWC;
HWND WH;
MSG M;

LRESULT CALLBACK WProc(
    HWND hwnd,	// handle of window
    UINT uMsg,	// message identifier
    WPARAM wParam,	// first message parameter
    LPARAM lParam 	/*second message parameter*/)
{
	switch(uMsg)
	{
		case WM_DESTROY: 
			PostQuitMessage(0);
			break;
		default:return DefWindowProc(hwnd,uMsg,wParam,lParam);
	}
	return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	MWC.style=CS_HREDRAW|CS_VREDRAW;
	MWC.cbWndExtra=0;
	MWC.hInstance=hInstance;
	MWC.hIcon=LoadIcon(NULL, IDI_APPLICATION);;
	MWC.hbrBackground=(HBRUSH)COLOR_BACKGROUND+1;
	MWC.lpfnWndProc=&WProc;
	MWC.lpszClassName="MyWindow";
	MWC.cbClsExtra=0;
	MWC.hCursor=LoadCursor(NULL, IDC_ARROW);
	MWC.lpszMenuName=0;
	if(!RegisterClass(&MWC))
	{
		MessageBox(0,"Не удалось зарегистрировать класс","Ошибка!",MB_OK);
		return 1;
	}
	WH=CreateWindow("MyWindow","OpenGL",WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_OVERLAPPEDWINDOW,0,0,640,480,0,0,hInstance,0);
	if(!WH)
	{
		MessageBox(0,"Не удалось создать окно","Ошибка!",MB_OK);
		return 1;
	}
	ShowWindow(WH,SW_SHOW);
	while(GetMessage(&M,WH,0,0))
	{
		TranslateMessage(&M);
		DispatchMessage(&M);
	}
	return 0;
}
вот весь код...что не так то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2009, 22:51   #2
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Мне тоже интересно узнать ответ.

Вот этот код у меня работал вроде нормально, посмотри может быть поможет.

Код:
#include "windows.h"
#include "windowsx.h"


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

int APIENTRY WinMain(
		HINSTANCE hInstance,
		HINSTANCE hPrevInstance,
		LPSTR lpCmdLine,
		int nCmdShow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS w;
		memset(&w,0,sizeof(WNDCLASS));
	w.style = CS_HREDRAW | CS_VREDRAW;
	w.lpfnWndProc = WndProc;
	w.hInstance = hInstance;
	w.hbrBackground = GetStockBrush(WHITE_BRUSH);
	w.lpszClassName = "C Windows";
	RegisterClass(&w);
	hwnd = CreateWindow("C Windows","C Windows", WS_OVERLAPPEDWINDOW,
		10,10,600,480,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
	if (Message == WM_DESTROY )
	{
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,Message,wparam,lparam);
}
MasterGH вне форума Ответить с цитированием
Старый 13.11.2009, 23:00   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вообще говоря особо не углублялся в этот вопрос, но проблема в вызове GetMessage. В Вашем коде указан второй параметр, который говорит чьи сообщения брать( то есть он будет получать только сообщения для WH ), с другой стороны окно разрушается и GetMessage, не найдя окна возвращает ошибку(-1), так как это не 0, то получаем бесконечный цикл =). Выйти из положения можно заменив второй параметр GetMessage нулём, либо отдельно обрабатывать ситуацию, когда эта ф-ция возвращает -1. Во всяком случае я так понял, как всегда, подробнее на мсдн
http://msdn.microsoft.com/en-us/libr...36(VS.85).aspx
netrino вне форума Ответить с цитированием
Старый 14.11.2009, 03:34   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

netrino, спасибо, не догодался я про PostQuitMessage почитать

ЗЫ: отзыв добавить не могу..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процес Excel висит постоянно Dozent Общие вопросы Delphi 2 24.09.2009 16:52
Почему мой код не завершает процесс? Stilet Win Api 1 24.07.2008 20:28
Висит процесс, как его можно убрать? HAMMAN Помощь студентам 5 16.05.2008 08:55
Все висит пока выполняется процедура XPAiN Общие вопросы Delphi 3 07.05.2008 15:03
Программа висит при действии Lonix Работа с сетью в Delphi 1 21.04.2007 19:30