CDirectInputBase.cpp

説明を見る。
00001 #include "../ZakiLib.hpp"
00002 
00003 using namespace std;
00004 
00005 //============================================================================
00006 //静的メンバ
00007 //============================================================================
00008 LPDIRECTINPUT8 CDirectInputBase::g_lpDInput;
00009 list<GUID> CDirectInputBase::g_lstUseDeviceGuid;
00010 //list<DIDEVICEINSTANCE> CDirectInputBase::g_lstUseDeviceGuid;
00011 
00012 //============================================================================
00013 //デバイス列挙コールバック関数
00014 //引数                :デバイスのインスタンス(定義済)
00015 //戻り値     :任意の引数(定義済)
00016 //処理内容  :
00017 //                       デバイスの列挙
00018 //                       列挙したデバイスの登録
00019 //============================================================================
00020 BOOL CALLBACK CDirectInputBase::EnumDeviceCallback(const DIDEVICEINSTANCE *lpDdi,LPVOID lpContext)
00021 {
00022         //テスト表示
00023         //MessageBox(NULL,lpDdi->tszProductName,lpDdi->tszInstanceName,0);
00024 
00025         //デバイスの重複チェック
00026         //list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin();
00027         //for(;it != g_lstUseDeviceGuid.end();it++)
00028         //{
00029         //      if(strcmp(lpDdi->tszInstanceName,(*it).tszInstanceName) == 0)
00030         //              return DIENUM_CONTINUE;
00031         //}
00032 
00033         list<DIDEVICEINSTANCE> *lstInst = (list<DIDEVICEINSTANCE> *)lpContext;
00034         if(lstInst == NULL)
00035                 return DIENUM_STOP;
00036 
00037         //GUIDの記憶
00038         lstInst->push_back(*lpDdi);
00039 
00040         return DIENUM_CONTINUE;
00041 }
00042 /*
00043 //============================================================================
00044 //デバイス列挙コールバック関数
00045 //引数                :デバイスのインスタンス(定義済)
00046 //戻り値     :任意の引数(定義済)
00047 //処理内容  :
00048 //                       デバイスの列挙
00049 //============================================================================
00050 BOOL CALLBACK CDirectInputBase::EmunJoysticksCallback(const DIDEVICEINSTANCE *lpDdi,LPVOID lpContext)
00051 {
00052         HRESULT hr;
00053         CDirectInputBase *lpCDInput = (CDirectInputBase *)lpContext;
00054 
00055         if(lpCDInput == NULL)
00056                 return DIENUM_STOP;
00057 
00058         //デバイスの重複チェック
00059         list<GUID>::iterator it = g_lstUseDeviceGuid.begin();
00060         for(;it != g_lstUseDeviceGuid.end();it++)
00061         {
00062                 if(lpDdi->guidInstance == (*it))
00063                         return DIENUM_CONTINUE;
00064                 else
00065                         break;
00066         }
00067 
00068         //初期化したいデバイスか
00069         if(strcmp(lpCDInput->GetInstanceInfo().tszInstanceName,lpDdi->tszInstanceName) != 0)
00070                 return DIENUM_CONTINUE;
00071 
00072         //デバイスの作成
00073 //      hr = lpDInput->CreateDevice(lpDdi->guidInstance,&lpDIdev,NULL);
00074         hr = lpCDInput->DeviceCreate(lpDdi);
00075         if(FAILED(hr))
00076                 return DIENUM_CONTINUE;
00077 
00078         //GUIDの記憶
00079         g_lstUseDeviceGuid.push_back(lpDdi->guidInstance);
00080 //      lpCDInput->SetGuid(lpDdi->guidInstance);
00081 //      g_lstUseDeviceGuid.push_back(*lpDdi);
00082 
00083         return DIENUM_STOP;
00084 }
00085 */
00086 //============================================================================
00087 //デバイスのオブジェクト(ボタンなど)の列挙
00088 //引数                :定義済み
00089 //戻り値     :定義済み
00090 //処理概要  :
00091 //                       デバイスのオブジェクト(ボタンなど)の列挙
00092 //============================================================================
00093 BOOL CALLBACK CDirectInputBase::EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpDdoi,LPVOID pvRef)
00094 {
00095         HRESULT hr;
00096 
00097         CDirectInputBase *lpCDInput = (CDirectInputBase *)(pvRef);
00098 
00099         if(lpCDInput == NULL)
00100                 return DIENUM_STOP;
00101 
00102         //オブジェクトの設定
00103         hr = lpCDInput->DeviceAxes(lpDdoi);
00104         if(FAILED(hr))
00105                 return DIENUM_STOP;
00106 
00107         return DIENUM_CONTINUE;
00108 }
00109 
00110 //============================================================================
00111 //記憶したGUIDの削除
00112 //引数                :削除するGUID
00113 //戻り値     :成否
00114 //処理概要  :
00115 //                       記憶したGUIDをリストから削除する
00116 //============================================================================
00117 int CDirectInputBase::RemoveGuid(GUID guid)
00118 {
00119         list<GUID>::iterator it = g_lstUseDeviceGuid.begin();
00120         for(;it != g_lstUseDeviceGuid.end();it++)
00121         {
00122                 if(guid == (*it))
00123                 {
00124                         g_lstUseDeviceGuid.erase(it);
00125                         return 1;
00126                 }
00127         }
00128 
00129         return 0;
00130 }
00131 //============================================================================
00132 //デバイスの列挙
00133 //引数                :インスタンス構造体を集めるリスト
00134 //                      :列挙するデバイスの種類(DI8DEVCLASS_ALL)
00135 //                      :列挙するデバイスの状態(DIEDFL_ATTACHEDONLY)
00136 //戻り値     :なし
00137 //処理概要  :
00138 //                       列挙されたデバイスをリストへ登録して返す
00139 //============================================================================
00140 VOID CDirectInputBase::GetDeviceInstance(list<DIDEVICEINSTANCE> *lstInst,DWORD dwDevFilter,DWORD dwEnumFlag)
00141 {
00142         g_lpDInput->EnumDevices(dwDevFilter,EnumDeviceCallback,(LPVOID)lstInst,dwEnumFlag);     
00143 }
00144 
00145 //============================================================================
00146 //デバイスの重複チェック
00147 //引数                :チェックするGUID
00148 //戻り値     :重複しているならTRUE
00149 //処理概要  :
00150 //                       GUIDが既に使用されているか調べる
00151 //============================================================================
00152 BOOL CDirectInputBase::CheckDeviceGuid(GUID guid)
00153 {
00154         list<GUID>::iterator it = g_lstUseDeviceGuid.begin();
00155         for(;it != g_lstUseDeviceGuid.end();it++)
00156         {
00157                 if((*it) == guid)
00158                         return TRUE;
00159         }
00160 
00161         return FALSE;
00162 }
00163 
00164 /*
00165 //============================================================================
00166 //デバイスの数の取得
00167 //引数                :数えるデバイスのタイプ
00168 //戻り値     :デバイスの数
00169 //処理概要  :
00170 //                       デバイスのタイプ別の数を調べる
00171 //============================================================================
00172 DWORD CDirectInputBase::GetDeviceNum(DWORD dwCntDevType)
00173 {
00174         DWORD dwCnt = 0;
00175         DWORD dwDevType,dwSubDevType;
00176 
00177         list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin();
00178         for(;it != g_lstUseDeviceGuid.end();it++)
00179         {
00180                 //デバイスタイプ取得
00181                 dwDevType = GET_DIDEVICE_TYPE((*it).dwDevType);
00182                 dwSubDevType = GET_DIDEVICE_SUBTYPE((*it).dwDevType);
00183 
00184                 //デバイスがあるか
00185                 if(dwCntDevType == dwDevType || dwCntDevType == dwSubDevType)
00186                         dwCnt++;
00187         }
00188 
00189         return dwCnt;
00190 }
00191 
00192 //============================================================================
00193 //製品名の取得
00194 //引数                :取得する文字列へのポインタ
00195 //                      :取得するインデックス
00196 //戻り値     :成否
00197 //処理概要  :
00198 //                       インデックスを元にデバイスの製品名を取得する
00199 //============================================================================
00200 int CDirectInputBase::GetDeviceName(TCHAR *szDeviceName,DWORD dwGetDevType,UINT uIdx)
00201 {
00202         DWORD dwDevType,dwSubDevType;
00203 
00204         if(g_lstUseDeviceGuid.size() <= uIdx)
00205                 return 0;
00206 
00207         list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin();
00208         if(dwGetDevType)
00209         {
00210                 //同一デバイスタイプの中のインデックス
00211                 for(;it != g_lstUseDeviceGuid.end();it++)
00212                 {
00213                         //デバイスタイプ取得
00214                         dwDevType = GET_DIDEVICE_TYPE((*it).dwDevType);
00215                         dwSubDevType = GET_DIDEVICE_SUBTYPE((*it).dwDevType);
00216 
00217                         //デバイスがあるか
00218                         if(dwGetDevType == dwDevType || dwGetDevType == dwSubDevType)
00219                         {
00220                                 if(!uIdx)
00221                                 {
00222                                         //製品名をコピー
00223                                         strcpy(szDeviceName,(*it).tszProductName);
00224                                         return 1;
00225                                 }
00226                                 uIdx--;
00227                         }
00228                 }
00229         }
00230         else
00231         {
00232                 //全てのデバイスのインデックス
00233                 advance(it,uIdx);//itをidx分進める
00234                 //製品名をコピー
00235                 strcpy(szDeviceName,(*it).tszProductName);
00236                 return 1;
00237         }
00238 
00239         return 0;
00240 }
00241 
00242 //============================================================================
00243 //デバイス名からインスタンスを取得
00244 //引数                :デバイスインスタンスを受け取るアドレス
00245 //                      :デバイス名(製品名)
00246 //戻り値     :成否
00247 //処理内容  :
00248 //                       インスタンスのリストからデバイス名を元にインスタンスを探して返す
00249 //============================================================================
00250 int CDirectInputBase::GetDevInst(DIDEVICEINSTANCE *lpDdInst,TCHAR *szDeviceName)
00251 {
00252         list<DIDEVICEINSTANCE>::iterator it = g_lstUseDeviceGuid.begin();
00253         for(;it != g_lstUseDeviceGuid.end();it++)
00254         {
00255                 if(strcmp(szDeviceName,(*it).tszProductName) == 0)
00256                 {
00257                         *lpDdInst = (*it);
00258                         return 1;
00259                 }
00260         }
00261 
00262         return 0;
00263 }
00264 */

FPStestに対してWed Nov 14 09:55:20 2007に生成されました。  doxygen 1.5.2