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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2013, 13:39   #1
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию Косяки в работе окна просмотра 3d-графики

Здравствуйте! Проблема такая: есть окно, в котором можно просматривать 3d объект следующим образом:
- зажали лев. кнопку мыши и перемещаем - вращение камеры
- зажали правую кнопку и перемещаем - смещение вида
- зажали обе кнопки и перемещаем - движение камеры вдоль линии взгляда.
Все работает если курсор находится в пределах окна просмотра. Но если зажать какую-нибудь кнопку мыши и переместить курсор за пределы, то изменение вида прекратится и если за пределами окна отпустить зажатую кнопку, то программа не распознает это событие и в дальнейшем когда курсор снова будет в пределах окна просмотра выполнение команды продолжится. Алгоритм должен быть такой:
- зажали нужную кнопку, начинаем выполнять соответствующую операцию
- перемещаем курсор - операция выполняется, при этом курсор может выходить за пределы окна просмотра и операция должна продолжать выполняться
- отпустили зажатую кнопку, операция должна прекратить выоплняться. даже в том случае если мы отпустили кнопку когда курсор находился за пределами окна.

В общем должно быть как в 3ds max ). Но на деле все не так, чтобы было понятнее выкладываю саму программу и код
скрин1.jpg
http://rghost.ru/47565645

Код:
case WM_LBUTTONDOWN:{
		//Получаем координаты курсора
		int mousex = LOWORD(lParam);
		int mousey = HIWORD(lParam);
		
		//Если курсор находится в окне просмотра, то устанавливаем на него фокус ввода
		if(leftMouseDown == 0){
			leftMouseDown = 1;
			oldMouseX = LOWORD(lParam);
			oldMouseY = HIWORD(lParam);
			if(rightMouseDown == 1){
				navigationType = WALK;
			}
			else{
				navigationType = ROTATE;
			}
		}
		}
		break;

	case WM_LBUTTONUP:
		leftMouseDown = 0;
		if(rightMouseDown == 0){
			navigationType = NONE;
		}
		else{
			navigationType = PAN;
			oldMouseX = LOWORD(lParam);
			oldMouseY = HIWORD(lParam);
		}
		break;

	case WM_RBUTTONDOWN:{
		//Получаем координаты курсора
		int mousex = LOWORD(lParam);
		int mousey = HIWORD(lParam);
		
		//Если курсор находится в окне просмотра, то устанавливаем на него фокус ввода
		if(rightMouseDown == 0){
			rightMouseDown = 1;
			oldMouseX = LOWORD(lParam);
			oldMouseY = HIWORD(lParam);
			if(leftMouseDown == 1){
				navigationType = WALK;
			}
			else{
				navigationType = PAN;
			}
		}
		}break;

	case WM_RBUTTONUP:
		rightMouseDown = 0;
		if(leftMouseDown == 0){
			navigationType = NONE;
		}
		else{
			navigationType = ROTATE;
			oldMouseX = LOWORD(lParam);
			oldMouseY = HIWORD(lParam);
		}
		break;

	case WM_MOUSEMOVE:{
		switch(navigationType){
		case WALK:{
			//Идем вперед или назад
			int newMouseY = HIWORD(lParam);
			int diffy = newMouseY - oldMouseY;
			g_pCam->walk(float(diffy) * g_walkSens);
			oldMouseY = newMouseY;
			}break;
	
		case PAN:{
			//Прокручиваем область просмотра
			int newMouseX = LOWORD(lParam);
			int newMouseY = HIWORD(lParam);
			int diffx = newMouseX - oldMouseX;
			int diffy = newMouseY - oldMouseY;
			g_pCam->fly(float(diffy) * g_panSens);
			g_pCam->strafe(-float(diffx) * g_panSens);
			oldMouseX = newMouseX;
			oldMouseY = newMouseY;
			}break;

		case ROTATE:{
			//Вращаем камеру
			int newMouseX = LOWORD(lParam);
			int newMouseY = HIWORD(lParam);
			int diffx = newMouseX - oldMouseX;
			int diffy = newMouseY - oldMouseY;
			g_pCam->rotate(float(diffx) * g_rotSens, float(diffy) * g_rotSens);
			oldMouseX = newMouseX;
			oldMouseY = newMouseY;
			}break;
		}
		}break;
Trinock вне форума Ответить с цитированием
Старый 21.07.2013, 15:11   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сообщения о событиях мыши передаются окну *под* курсором.
Во избежание, воспользуйтесь SetCapture() и не забывайте про ReleaseCapture()
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Косяки в видеодрайвере kertisman Windows 0 18.01.2013 23:31
JavaScript и расположение окна предварительного просмотра(QuickView) siyogi Помощь студентам 0 14.11.2012 16:30
Выполнить код при закрытии окна просмотра segail Microsoft Office Excel 7 08.02.2010 11:22
Создание собственного окна просмотра отчета J[OGR]A Помощь студентам 2 20.03.2009 04:54