Blokada myszy (by nie wychodziła poza okno)

0

Jak zablokować mysz, by nie dało się nią wyjść poza obszar roboczy okna?

0

czytaj komunikaty WM_MOUSEMOVE.
Przyklad:
Twoj kursor jest 5 pikseli od brzegu okna. Czytaj komunikaty WM_MOUSEMOVE i jak twoj kursor jest blisko brzegu zmieniaj jego pozycje oddalajac go.
Poszukaj troszke na google bo o ile pamietam przy tworzeniu okna mozna ustawic odpowiednia flage ograniczajaca poruszanie sie kursora

0

Już ok, napisali mi na sąsiednim forum: jedną z możliwości jest użycie funkcji ClipCursor().
:D

0

Jak się okazuje, funkcja ClipCursor(RECT rc) powoduje, że nie da się wyjść kursorem poza okno.

Tworzę program w DirectX 9 i pracuję nad obrotem kamery podczas ruchu myszy. Kamera jest jak w grze TPP (czyli widzimy z perspektywy 3-ciej osoby). Jednak gdy mysz dochodzi do krawędzi ekranu - kamera grzęźnie - jedynym sposobem aby ruszać kamerą jest ruch w inną stronę (o ile nie jesteśmy w rogu).

Słyszałem, że żeby sobie z tym poradzić trzeba ustawiać mysz na środek ekranu. Jak jednak to zrobić, aby animacja się nie cięła?

#include <Windows.h>
#include <WindowsX.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <math.h>

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

void initD3D(HWND hWnd);
void cleanD3D(void);
void render_frame(void);
void init_graphics(void);
void init_mouse_pos(void);

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;
LPDIRECT3DINDEXBUFFER9 i_buffer = NULL;
float x = 0.0f, y = 0.0f, z = 20.0f;
float phi = 0.0f, theta = D3DXToRadian(90);
const float r = 20.0f;
int oldMouseX = 0, oldMouseY = 0;

struct CUSTOMVERTEX
{
	FLOAT X, Y, Z;
	DWORD COLOR;
};

#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;

	ZeroMemory(&wc, sizeof (WNDCLASSEX));

	wc.cbSize = sizeof (WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.lpszClassName = L"Moja klasa";

	RegisterClassEx(&wc);

	HWND hWnd = CreateWindowEx(NULL, L"Moja klasa", L"Moje okno", WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInstance, NULL);

	ShowWindow(hWnd, nCmdShow);

	initD3D(hWnd);
	init_mouse_pos();

	RECT rect = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT};
	ClipCursor(&rect);

	MSG msg;

	while (TRUE)
	{
		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		if (msg.message == WM_QUIT)
			break;

		render_frame();
	}

	cleanD3D();

	return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_MOUSEMOVE:
		int curMousePosX = LOWORD(lParam);
		int curMousePosY = HIWORD(lParam);

		if (curMousePosX != oldMouseX)
			phi += (curMousePosX - oldMouseX) * 0.009f;

		if (curMousePosY != oldMouseY)
			theta -= (curMousePosY - oldMouseY) * 0.009f;

		oldMouseX = curMousePosX;
		oldMouseY = curMousePosY;

		if (theta > D3DXToRadian(180))
			theta = D3DXToRadian(179);
		if (theta < D3DXToRadian(0))
			theta = D3DXToRadian(1);

		z = r * sin(theta) * cos(phi);
		x = r * sin(theta) * sin(phi);
		y = r * cos(theta);

		return 0;
	}

	return DefWindowProc(hWnd, message, wParam, lParam);
}

void init_mouse_pos(void)
{
	POINT p;
	GetCursorPos(&p);
	oldMouseX = p.x;
	oldMouseY = p.y;
}

void initD3D(HWND hWnd)
{
	d3d = Direct3DCreate9(D3D_SDK_VERSION);

	D3DPRESENT_PARAMETERS d3dpp;

	ZeroMemory(&d3dpp, sizeof (D3DPRESENT_PARAMETERS));
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.hDeviceWindow = hWnd;
	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
	d3dpp.BackBufferWidth = SCREEN_WIDTH;
	d3dpp.BackBufferHeight = SCREEN_HEIGHT;
	d3dpp.EnableAutoDepthStencil = TRUE;
	d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

	d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

	init_graphics();

	d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
	d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);
	d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
}

void render_frame(void)
{
	d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
	d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

	d3ddev->BeginScene();
	
		d3ddev->SetFVF(CUSTOMFVF);

		D3DXMATRIX matView;
		D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(x, y, z), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
		d3ddev->SetTransform(D3DTS_VIEW, &matView);

		D3DXMATRIX matProjection;
		D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), (FLOAT) SCREEN_WIDTH / (FLOAT) SCREEN_HEIGHT, 1.0f, 100.0f);
		d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection);

		d3ddev->SetStreamSource(0, v_buffer, 0, sizeof (CUSTOMVERTEX));
		d3ddev->SetIndices(i_buffer);

		d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

	d3ddev->EndScene();
	
	d3ddev->Present(NULL, NULL, NULL, NULL);
}

void cleanD3D(void)
{
	v_buffer->Release();
	i_buffer->Release();
	d3ddev->Release();
	d3d->Release();
}

void init_graphics(void)
{
	CUSTOMVERTEX verticies[] = 
	{
		{-3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255)},
		{3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0)},
		{3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0)},
		{-3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255)},
		{-3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 255)},
		{3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 255, 0)},
		{3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(255, 255, 255)},
		{-3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 0)}
	};

	d3ddev->CreateVertexBuffer(8 * sizeof (CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &v_buffer, NULL);

	VOID * pVoid;

	v_buffer->Lock(0, 0, (VOID **)&pVoid, 0);
	memcpy(pVoid, verticies, sizeof (verticies));
	v_buffer->Unlock();

	short indices[] = 
	{
		0, 1, 2,
		0, 2, 3,
		1, 5, 6,
		1, 6, 2, 
		3, 2, 6, 
		3, 6, 7, 
		0, 1, 5,
		0, 5, 4,
		4, 5, 6,
		4, 6, 7,
		0, 4, 7,
		0, 7, 3
	};

	d3ddev->CreateIndexBuffer(36 * sizeof (short), 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &i_buffer, NULL);

	i_buffer->Lock(0, 0, (VOID **)&pVoid, 0);
	memcpy(pVoid, indices, sizeof (indices));
	i_buffer->Unlock();
}

Mam taki kod. Jak go zmodyfikować, aby kamera chodziła płynnie, jak w grach?

0

A ja mam podobny problem. nie moge wyjsc kursorem myszki poza aktywne okno np. jesli klikne przycisk start to moge nim polatac jedynie na obszarze paska startu albo włacze jakies okno to też tylko w jego granicach najgorsze jest to że jak wyskoczy mi jakies okienko na środku ekranu a kursor bedzie gdzies powiedzmy na dole ekranu to nie moge wykonac nim zadnego ruchu. stało sie to nagle nic nie zmnienialem czy instalowalem dodam ze mam win7 myszke sprawdzalem w innym komputerze i dziala dobrze

1 użytkowników online, w tym zalogowanych: 0, gości: 1