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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 20:38   #1
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию Как закрыть диалоговое окно, связанное с DirectX

Проблема такая: приложение работает в полноэкранном режиме, для вывода графики используется диалоговое окно, к которому привязан DirectX. Когда я нажимаю ESC диалоговое окно должно закрываться и пользователь должен возвращаться на рабочий стол. На деле же получается так, что иногда окно закрывается и все нормально, а иногда картинка зависает и остается на экране, при этом появляется курсор. Наверное я что-то упускаю, когда закрываю окно, подскажите, как нужно делать правильно. Вот код диалоговой процедуры:

Код:
BOOL CALLBACK SessionDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static int mouseX, mouseY;
	switch(message){
	case WM_INITDIALOG:{
		ShowCursor(0);
		//Инициализируем DirectX по параметрам приложения и переключаемся в полноэкранный режим
		SetWindowPos(hWnd, hWnd, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
		InitD3D(hWnd, &g_pd3dDevice);
		//Устанавливаем таймер
		SetTimer(hWnd, 1, 30, NULL);
		gSession = new BasicSession(g_pd3dDevice, SCREEN_WIDTH, SCREEN_HEIGHT, *pActInit);
		}break;

	case WM_TIMER:{
		gTime += 30.0/1000.0;
		//Проверяем, что устройство находится с нами
		HRESULT Result = g_pd3dDevice->TestCooperativeLevel();

		if(FAILED(Result)){
			if(Result == D3DERR_DEVICELOST){
				return 0;
			}
			if(Result == D3DERR_DEVICENOTRESET){
				//Удаляем ресурсы
				gSession->DeleteAllResources();
				gSession->RestoreAllResources(g_pd3dDevice);
				//Восстанавливаем устройство
				InitD3D(hWnd, &g_pd3dDevice);
				gSession->SetD3DDevice(g_pd3dDevice);
				//Восстанавливаем ресурсы
				gSession->RestoreAllResources(g_pd3dDevice);
			}
		}

		
                  //Рисуем сцену
		if(gSession != NULL){
			gSession->Operate(hWnd, mouseX, mouseY, 0);
		}

		}break;

	case WM_KEYUP:
		switch(wParam){
		case VK_ESCAPE:
			ShowCursor(1);
			delete gSession;
			gSession = NULL;
			KillTimer(hWnd, 1);
			EndDialog(hWnd, 0);
			DestroyWindow(hWnd);
			return TRUE;
		}
		break;

	case WM_MOUSEMOVE:
        mouseX = LOWORD(lParam);
        mouseY = HIWORD(lParam);
        break;
	}

	return 0;
}
Trinock вне форума Ответить с цитированием
Старый 04.04.2012, 23:47   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

может нужно интерфейс освободить g_pd3dDevice->Release(), да за одно и рабочий стол обновить UpdateWindow(GetDesktopWindow()).
microbit вне форума Ответить с цитированием
Старый 05.04.2012, 18:43   #3
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию

Нет, не помогает. Причем обнаружил еще один глюк - при первом запуске полноэкранного сеанса DirectX окно нормально сворачивается из полноэкранного режима и разворачивается обратно, а при последующих не хочет.
Trinock вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диалоговое окно как на Gmail или что-то подобное по дизайну zargandr1 HTML и CSS 9 11.12.2011 20:19
Как закрыть наглое активное окно? MotoArhangel Общие вопросы Delphi 8 09.03.2011 21:32
Закрыть всплывающее окно - как? fezilk25 Общие вопросы Delphi 4 17.11.2010 19:22
Диалоговое окно Beggins Общие вопросы C/C++ 3 09.05.2008 05:03
Как закрыть окно подключения к инету dial-up? Vladimir K. Работа с сетью в Delphi 4 12.02.2008 19:13