Hallo,
ich versuche per DirectInput8 ein Inputinterface zu schreiben, mein iface sieht wie folgt aus
class IInput
{public:
virtual void GetMousePos( int* Maus_X, int* Maus_Y ) = 0;
virtual DWORD GetMouseButtons( void ) = 0;
};
meine implementierung der GetMousPos(…) sieht wie folgt aus:
IInput::GetMousePos( int* Maus_X, int* Maus_Y )
if (Mauspuffer == TRUE)
bGepufferte_Maus = TRUE;
else
bGepufferte_Maus = FALSE;
//////////////////MAUS OBJEKT ERSTELLEN///////////////////////////////////////////////////////
cinput.m_hr = Cinput.lpDI->CreatDeviceEx (GUID_SysMouse,IID_IDirecInputDevice7,
(LPVOID*)&lpDIMaus, NULL);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
/////////////DATENFORMAT FESTLEGEN//////////////////////////////////////////////////////////
cinput.m_hr = lpDIMaus->SetDataFormat(&c_dfDIMouse);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
//////////////kooperation mit windows festlegen////////////////////////////////////////////
Cinput.m_hr = lpDIMaus ->SetCooperativeLevel (hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSICE);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
/////////////////////////puffer für maus aktivierung erzeugen/////////////////////////////
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = DINPUT_BUFFERSIZE;
Cinput.m_hr = = lpDIMaus->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
/////////////////////////MAUS OBJEKT AKTIVIEREN///////////////////////////////////////////
if (lpDIMaus)
{
Cinput.m_hr = lpDIMaus->Acquire();
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
inline BOOL Cinput::Maus_Update(void)
{
BOOL bFertig = FALSE;
DIMOUSESTATE ms;
// Gepuffert: Langsam, bearbeitet aber ALLE Maus-Aktionen
if (bGepufferte_Maus == TRUE)
{
while (!bFertig)
{
DIDEVICEOBJECTDATA od; // Speichert Mauszustand
DWORD dwElemente = 1; // Elemente die abgefragt werden sollen
Cinput.m_hr = lpDIMaus->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
&od, &dwElemente, 0);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
lpDIMaus->Acquire();
if (Cinput.m_hr != DI_OK)
{
DI_Term();
return FALSE;
}
else
{
Cinput.m_hr = lpDIMaus->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
&od, &dwElemente, 0);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
DI_Term();
return FALSE;
}
} // else
} // if INPUTLOST
// Das hier kommt öfters vor, also nicht abbrechen
else if (Cinput.m_hr != DI_OK)
{
bFertig = TRUE;
return FALSE;
} // else [anderer Fehler]
// Keine Elemente wurden verändert
if (dwElemente == 0)
bFertig = TRUE;
// Feld ‚dwOfs‘ enthält Maus-Aktion:
switch (od.dwOfs)
{
// Horizontale Bewegung
case DIMOFS_X:
Maus_x += od.dwData;
bFertig = TRUE;
break;
// Vertikale Bewegung
case DIMOFS_Y:
Maus_y += od.dwData;
bFertig = TRUE;
break;
// Knopf 0 gedrückt
case DIMOFS_BUTTON0:
// Knopf gedrück
if (od.dwData & 0x80)
{
bMaus_Buttons[0] = TRUE;
bFertig = TRUE;
}
// Knopf losgelassen
else
{
bMaus_Buttons[0] = FALSE;
bFertig = TRUE;
}
break;
// Knopf 1 gedrückt
case DIMOFS_BUTTON1:
// Knopf gedrück
if (od.dwData & 0x80)
{
bMaus_Buttons[1] = TRUE;
bFertig = TRUE;
}
// Knopf losgelassen
else
{
bMaus_Buttons[1] = FALSE;
bFertig = TRUE;
}
break;
}; // switch
} // while
} // if [bGepufferte_Maus]
// Ungepuffert: Schnell, verpasst aber ab und zu Maus-Aktionen:
else
{
Cinput.m_hr = lpDIMaus->GetDeviceState(sizeof(DIMOUSESTATE),
(LPVOID)&ms);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
lpDIMaus->Acquire();
if (Cinput.m_hr != DI_OK)
{
DI_Term();
return FALSE;
}
else
{
Cinput.m_hr = lpDIMaus->GetDeviceState(sizeof(DIMOUSESTATE),
(LPVOID)&ms);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
DI_Term();
return FALSE;
}
} // else
} // if INPUTLOST
// Das hier kommt öfters vor, also nicht abbrechen
else if (Cinput.m_hr != DI_OK)
{
return FALSE;
} // else [anderer Fehler]
Maus_x += ms.lX;
Maus_y += ms.lY;
if (ms.rgbButtons[0] & 0x80)
bMaus_Buttons[0] = TRUE;
else
bMaus_Buttons[0] = FALSE;
if (ms.rgbButtons[1] & 0x80)
bMaus_Buttons[1] = TRUE;
else
bMaus_Buttons[1] = FALSE;
} // else [!bGepufferte_Maus]
} // ::Maus_Update
wie bekomm ich nun Maus_x und Maus_y als Parameter an die funktion,
mit return (Maus_x Maus_y) ???
muss die implementierung von di eigentlich innerhalb der funktion erfolgen, oder reicht es, wenn sie innerhalb der class erfolgt ???
gruss
sven