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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2012, 11:00   #1
rengen
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 12
По умолчанию Мышка в приложении постоянно в состоянии загрузки

В общем, пишу небольшую игру, если важно, с применением DirectX, и в начале запуска естественно меню мышка постоянно кружком(Win 7), как при загрузке. Так вот, как избавиться от состояния загрузки, то есть заставить мышку отображаться в нормальном состоянии.
И за одно как прикрепить свою мышку?Через:
Код:
...
wnd.hCursor=LoadCursorFromFile(L"Menu.cur");
...
?А то из-за состояния загрузки mousы не могу увидеть правильно или не правильно делаю.

Последний раз редактировалось rengen; 28.03.2012 в 11:15.
rengen вне форума Ответить с цитированием
Старый 28.03.2012, 12:07   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

покажите как окно создаете, чтото там видимо не так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.03.2012, 23:21   #3
rengen
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 12
По умолчанию

Код:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{


	MSG Msg;
	wnd.cbSize=sizeof(WNDCLASSEX);
	wnd.style=CS_HREDRAW|CS_VREDRAW;
	wnd.lpfnWndProc=WndMenuProc;
	wnd.cbClsExtra=0;
	wnd.cbWndExtra=0;
	wnd.hInstance=hInstance;
	wnd.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
	wnd.hCursor=LoadCursor(hInstance,IDC_CROSS);
	wnd.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wnd.lpszMenuName=NULL;
	wnd.lpszClassName=L"WINDOWCLASS";
	wnd.hIconSm=LoadIcon(hInstance,IDI_APPLICATION);

	if(!RegisterClassEx(&wnd))
	{
		MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
		return 0;
	}

	if(!(hWnd=CreateWindowEx(NULL,L"WINDOWCLASS",L"Gauss Tank",WS_POPUP,300,150,
		600,500,NULL,NULL,hInstance,NULL)))
	{
		MessageBox(NULL,L"Cannot create window",L"Error",MB_OK);
		return 0;
	}

	SetTimer(hWnd,TIMER_RESP,TIME_RESP,NULL);

	if(SUCCEEDED(InitialDirect3D(hWnd,hInstance)))	//если инициализация интерфейса Direct3D прокатила
	{
		if(SUCCEEDED(InitialMesh() )) //и если буфер создан
		{
			ShowWindow(hWnd,SW_SHOWDEFAULT);
			UpdateWindow(hWnd);
			ZeroMemory(&Msg,sizeof(Msg));
			while(Msg.message!=WM_QUIT) //ждем пока не придет QUIT
			{
				if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))	//Обрабатываем если есть сообщение
				{
					TranslateMessage(&Msg);
					DispatchMessage(&Msg);
				}
				else
				{
					switch(SetGameProc)
					{
					case MENU_PROC:	
						MenuProc();
						break;
					case GAME_PROC:
						GameProc();
						break;
					case OPTIONS_PROC:
						break;
					case SCORES_PROC:
						break;
					}
				}

			}
		}
	}
	return 0;
}
rengen вне форума Ответить с цитированием
Старый 28.03.2012, 23:58   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

где оконная процедура?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.03.2012, 01:22   #5
rengen
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 12
По умолчанию

Код:
LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
	switch(Msg)
	{
	case WM_SETCURSOR:
		ShowCursor(0);
		break;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			{
				SetGameProc=MENU_PROC;
				DeltaTime=timeGetTime();
				wnd.lpfnWndProc=WndMenuProc;
				pMouse->Unacquire();
				break;
			}
		case VK_F1:
			{
			displmode=D3DFILL_WIREFRAME;
			break;
			}
		case VK_F2:
			{
			displmode=D3DFILL_SOLID;
			break;
			}
		case VK_F3:
			{
			displmode=D3DFILL_POINT;
			break;
			}
		}
		break;
	case WM_TIMER:
		switch(wParam)
		{
		case TIMER_RESP:
			{
				new MOB();
			}
		}
		break;
	case WM_QUIT:
		{
		SendMessage(hWnd,WM_DESTROY,NULL,NULL);
		break;
		}
	case WM_DESTROY:
		{
		DeleteDirect3D();
		PostQuitMessage(0);
		return 0;
		break;
		}
	}
	return DefWindowProc(hWnd,Msg,wParam,lParam);
}

LRESULT CALLBACK WndMenuProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
	switch(Msg)
	{
	case WM_MOUSEMOVE:
		{
			int MouseX;
			int MouseY;
			MouseY=HRESULT(lParam);
			MouseX=LRESULT(lParam);
			if((MouseX>Rec.left) && (MouseX<Rec.right))
			{
				if((MouseY>Rec.top) && (MouseY<(Rec.top+60)))
				{
					OnNewGame=TRUE;
				}
				else
				{
					OnNewGame=FALSE;
				}
			}
			else
			{
				OnNewGame=FALSE;
			}
			break;
		}
	case WM_LBUTTONDOWN:
		{
			if(OnNewGame)
			{
				SetGameProc=GAME_PROC;
				DeltaTime=timeGetTime()-DeltaTime;
				wnd.lpfnWndProc=WndProc;
				while(FAILED(pMouse->Acquire()));
				if(pFirstMob)
				{
					pNowMob=pFirstMob;
					while(pNowMob)
					{
						pNowMob->LastTime+=DeltaTime;
						pNowMob=pNowMob->pNext;
					}
				}
				if(pFirstBullet)
				{
					pNowBullet=pFirstBullet;
					while(pNowBullet)
					{
						pNowBullet->StartTime+=DeltaTime;
						pNowBullet=pNowBullet->pNext;
					}
				}
			}
			if(OnOptions)
			{
				SetGameProc=OPTIONS_PROC;
			}
			if(OnScores)
			{
				SetGameProc=SCORES_PROC;

			}
			if(OnExit)
			{
				SendMessage(hWnd,WM_QUIT,0,0);
			}
		}
	case WM_SETCURSOR:
		{
			ShowCursor(1);
			break;
		}
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			SendMessage(hWnd,WM_DESTROY,0,0);
			break;
		}
		break;
	case WM_QUIT:
		SendMessage(hWnd,WM_DESTROY,NULL,NULL);
		break;
	case WM_DESTROY:
		DeleteDirect3D();
		PostQuitMessage(0);
		return 0;
		break;
	}
	return DefWindowProc(hWnd,Msg,wParam,lParam);
}
Верхняя для самой игры, а нижняя для меню. Они ещё не дописаны, но работают. И надо сказать, что непосредственно в игре мышку обрабатываю через DirectInput, а в меню стандартным способом. Но отпускать мышь не забываю. И при инициализации мыши никаких дополнительных команд инициализации и управления в DirectInput не использовал.
rengen вне форума Ответить с цитированием
Старый 29.03.2012, 15:15   #6
rengen
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 12
По умолчанию

Что-то я не уверен что называется оконной процедурой, но по-моему, то что выложил и называется. Но выложу ещё остатки обработчика хотя там над мышкой ни-каких действий. А то что-то все молчат.
Код:
void MenuProc()
{
	Rec.top=GetSystemMetrics(SM_CYSCREEN)/3;
	Rec.left=GetSystemMetrics(SM_CXSCREEN)/3;
	Rec.right=Rec.left*2;
	Rec.bottom=Rec.top*2;
	MenuRender();
}
Код:
void MenuRender()
{
	pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
	pDirect3DDevice->BeginScene();
	if(OnNewGame)
	{
		pBigMenuFont->DrawText(NULL,L"New Game",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	else
	{
		pMenuFont->DrawText(NULL,L"New Game",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	if(OnOptions)
	{
		pBigMenuFont->DrawText(NULL,L"Options",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	else
	{
		pMenuFont->DrawText(NULL,L"Options",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	if(OnScores)
	{
		pBigMenuFont->DrawText(NULL,L"Scores",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	else
	{
		pMenuFont->DrawText(NULL,L"Scores",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	if(OnExit)
	{
		pBigMenuFont->DrawText(NULL,L"Exit",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	else
	{
		pMenuFont->DrawText(NULL,L"Exit",-1,&Rec,DT_CENTER,D3DCOLOR_ARGB(250,250,250,50));
		Rec.top+=MENU_TEXT_INTERVAL;
	}
	
	pDirect3DDevice->EndScene();
	pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
	Rec.top=GetSystemMetrics(SM_CYSCREEN)/3;
}
rengen вне форума Ответить с цитированием
Старый 30.03.2012, 11:11   #7
rengen
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 12
По умолчанию

Все. Методом тыка и создания маленького проекта и постепенного его расширения выяснил - виной всему создание окна. А именно я его создавал так:
Код:
if(!(hWnd=CreateWindowEx(NULL,L"WINDOWCLASS",L"Gauss Tank",WS_POPUP,300,150,
		600,500,NULL,NULL,hInstance,NULL)))
А следовало бы так
Код:
if(!(hWnd=CreateWindowEx(NULL,L"WINDOWCLASS",L"Gauss Tank",WS_OVERLAPPED,300,150,
		600,500,NULL,NULL,hInstance,NULL)))
сам задал вопрос, обсудил и ответил.:rofl:
rengen вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мышка компьютера Alex-Kunfuman Компьютерное железо 4 03.02.2012 17:56
форма находится в закрытом состоянии segail Microsoft Office Excel 2 07.05.2010 17:38
Мышка ПроГрам Win Api 0 29.04.2010 20:58