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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2012, 18:38   #1
roma20231
Пользователь
 
Регистрация: 03.05.2012
Сообщений: 11
По умолчанию Не завершается приложение.

Здравствуйте. Недавно начал изучать WinApi. И столкнулся с такой проблемой: при запуске приложение невозможно закрыть (имею ввиду нажатие на крестик), пока не перетащить в другое место.

Вот сам код:
Код:
#include <windows.h>

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

HINSTANCE hInst;
HWND hwnd;
LPCWSTR szClassName = L"WindowAppClass";

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;
	MSG        msg;

    memset(&msg,0,sizeof(msg));

	wc.lpszClassName = szClassName;
	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.style         =  CS_DROPSHADOW;
	wc.lpfnWndProc   = WindowProc;
	wc.hInstance     = hInstance;
	wc.hIcon	     = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm	     = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
	wc.lpszMenuName  = NULL;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	if( !RegisterClassEx(&wc) )
		return E_FAIL;
	
	hwnd = CreateWindowEx( NULL, szClassName,
		L"Тест", WS_OVERLAPPEDWINDOW, 0, 0, 
		680, 400, NULL, NULL, hInstance, NULL);

	if( hwnd == NULL)
		return E_FAIL;

    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );

	while(GetMessage(&msg, hwnd, 0, 0 ))
	{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
	}

	UnregisterClass( szClassName, wc.hInstance );
	return msg.wParam;
}

LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch(msg) {
    case WM_DESTROY:
		{
			PostQuitMessage(0);
		}
	break;
	case WM_CLOSE:
		{
			PostQuitMessage(0);
		}
	break;
	case WM_QUIT:
		{
			PostQuitMessage(0);
		}
	break;
	default:
		{
			return DefWindowProc( hwnd, msg, wParam, lParam );
		}
	break;
	}
	return 0;
}
roma20231 вне форума Ответить с цитированием
Старый 11.05.2012, 19:20   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Объясняю:
PostQuitMessage - кладет сообщение WM_QUIT в очередь потока и адресат этого сообщения не окно а сам поток. Можно даже так его послать:
PostThreadMessage (GetCurrentThreadId(),WM_QUIT, 0,0)

Но фишка в том, что у Вас это сообщение принудительно заблокировано
Код:
while(GetMessage(&msg, hwnd, 0, 0 ))
и не обрабатывается циклом.

Вместо hwnd поставить NULL.
EUGY вне форума Ответить с цитированием
Старый 11.05.2012, 19:36   #3
roma20231
Пользователь
 
Регистрация: 03.05.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Объясняю:
PostQuitMessage - кладет сообщение WM_QUIT в очередь потока и адресат этого сообщения не окно а сам поток. Можно даже так его послать:
PostThreadMessage (GetCurrentThreadId(),WM_QUIT, 0,0)

Но фишка в том, что у Вас это сообщение принудительно заблокировано
Код:
while(GetMessage(&msg, hwnd, 0, 0 ))
и не обрабатывается циклом.

Вместо hwnd поставить NULL.
Да, да. Только что сам разобрался (случайно :D). Но все равно большое спасибо за разъяснение. Впредь буду знать.
Тему можно закрыть.
roma20231 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приложение ALEX777a Фриланс 5 14.03.2012 13:27
GetMailslotInfo завершается с ошибкой. tamTam C# (си шарп) 0 26.12.2011 14:42
Программа стартует и сразу же завершается IceExecutioner Общие вопросы Delphi 1 03.03.2011 13:18
Синий кружок должен двигаться треугольной траектории, программа завершается нажатием любой клавиши. Pan_rust Паскаль, Turbo Pascal, PascalABC.NET 3 24.05.2010 23:02
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05