インクルードディレクトリ:「C:\Program Files (x86)\Microsoft Research KinectSDK\inc」
ライブラリディレクトリ :「C:\Program Files (x86)\Microsoft Research KinectSDK\lib」
x86なら「C:\Program Files (x86)\〜」→「C:\Program Files\〜」
「追加の依存ファイル」に「MSRKinectNUI.lib」を追加
ライブラリディレクトリ :「C:\Program Files (x86)\Microsoft Research KinectSDK\lib」
x86なら「C:\Program Files (x86)\〜」→「C:\Program Files\〜」
「追加の依存ファイル」に「MSRKinectNUI.lib」を追加
#pragma comment( lib, "MSRKinectNUI.lib" )公式ドキュメント:http://research.microsoft.com/en-us/um/redmond/pro...
#include <MSR_NuiApi.h> // 全てのNUIAPI、基本的な初期化とアクセス定義 #include <MSR_NuiImageCamera.h> // NUI画像とカメラサービス関係のAPI定義( NuiCameraXxx, NuiImageXxx ) #include <MSR_NuiProps.h> // NUIプロパティ列挙のためのAPI定義 #include <MSR_NuiSkeleton.h> // NUIスケルトンのためのAPI定義( NuiSkeletonXxx, NuiTransformXxx ) #include <MSRKinectAudio.h> // オーディオAPI定義 #include <NuiImageBuffer.h> // DirextX9テクスチャに似た作用のためのフレームバッファを定義
// ハンドル HANDLE m_hNextVideoFrameEvent; HANDLE m_hNextDepthFrameEvent; HANDLE m_hNextSkeletonEvent; HRESULT hr; // キネクトセンサ初期化(RGB,デプス,スケルトン使用) hr = NuiInitialize( NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON | NUI_INITIALIZE_FLAG_USES_COLOR); if( FAILED( hr ) ){ /*エラー処理*/ } // RGB画像の出力ストリーム開放 hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, m_hNextVideoFrameEvent, &m_pVideoStreamHandle ); if( FAILED( hr ) ){ /*エラー処理*/ } // デプス画像の出力ストリーム解放 hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX, NUI_IMAGE_RESOLUTION_320x240, 0, 2, m_hNextDepthFrameEvent, &m_pDepthStreamHandle ); if( FAILED( hr ) ){ /*エラー処理*/ } // スケルトン hr = NuiSkeletonTrackingEnable( m_hNextSkeletonEvent, 0 ); if( FAILED( hr ) ){ /*エラー処理*/ }
NuiShutdown( ); if( m_hNextSkeletonEvent && ( m_hNextSkeletonEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextSkeletonEvent ); m_hNextSkeletonEvent = NULL; } if( m_hNextDepthFrameEvent && ( m_hNextDepthFrameEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextDepthFrameEvent ); m_hNextDepthFrameEvent = NULL; } if( m_hNextVideoFrameEvent && ( m_hNextVideoFrameEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextVideoFrameEvent ); m_hNextVideoFrameEvent = NULL; }
一応動いた(筈)。現時点ではOpenNIの方が優れている為、学習中断中
#include "myKinectNUI.h" MY_KINECT_NUI myKnNUI; void InitKinectNUI() { myKnNUI.InitSensor(); myKnNUI.OpenImageStream(); myKnNUI.OpenDepthStream(); myKnNUI.EnableSkeletonTracking(); myKnNUI.InitCVImg(); } void MainLoop() { int key = 0; while (key!='q'){ myKnNUI.GotVideoAlertCVImg( ); myKnNUI.GotDepthAlertCVImg(); //myKnNUI.GotSkeletonAlertCVImg(); key = waitKey(33); } } void main() { InitKinectNUI(); MainLoop(); // 終了処理 myKnNUI.Release(); }
#ifndef MY_KINECT_NUI_H #define MY_KINECT_NUI_H #include <iostream> #include <windows.h> #include <MSR_NuiApi.h> // 全てのNUIAPI、基本的な初期化とアクセス定義 #include <MSR_NuiImageCamera.h> // NUI画像とカメラサービス関係のAPI定義( NuiCameraXxx, NuiImageXxx ) #include <MSR_NuiProps.h> // NUIプロパティ列挙のためのAPI定義 #include <MSR_NuiSkeleton.h> // NUIスケルトンのためのAPI定義( NuiSkeletonXxx, NuiTransformXxx ) #include <MSRKinectAudio.h> // オーディオAPI定義 #include <NuiImageBuffer.h> // DirextX9テクスチャに似た作用のためのフレームバッファを定義 #pragma comment( lib, "MSRKinectNUI.lib" ) #include <opencv2/opencv.hpp> #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"opencv_core220d.lib") // opencv_core #pragma comment(lib,"opencv_imgproc220d.lib") // opencv_imgproc #pragma comment(lib,"opencv_highgui220d.lib") // opencv_highgui #pragma comment(lib,"opencv_objdetect220d.lib") // opencv_objdetect #else //Releaseモードの場合 #pragma comment(lib,"opencv_core220.lib") // opencv_core #pragma comment(lib,"opencv_imgproc220.lib") // opencv_imgproc #pragma comment(lib,"opencv_highgui220.lib") // opencv_highgui #pragma comment(lib,"opencv_objdetect220.lib") // opencv_objdetect #endif using namespace cv; #define IDC_MYICON 2 #define IDD_SKELETALVIEWER_DIALOG 102 #define IDS_APP_TITLE 103 #define IDD_ABOUTBOX 103 #define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDI_SKELETALVIEWER 107 #define IDC_SKELETALVIEWER 109 #define IDD_APP 110 #define IDR_MAINFRAME 128 #define IDS_APPTITLE 129 #define IDS_ERROR_D3DCREATE 130 #define IDS_ERROR_D3DVIDEOTYPE 131 #define IDS_ERROR_NUIINIT 132 #define IDS_ERROR_SKELETONTRACKING 133 #define IDS_ERROR_DEPTHSTREAM 134 #define IDS_STRING135 135 #define IDS_ERROR_VIDEOSTREAM 135 #define IDC_DEPTHVIEWER 1001 #define IDC_SKELETALVIEW 1002 #define IDC_VIDEOVIEW 1003 #define IDC_FPS 1004 #define IDC_STATIC -1 static const CvScalar g_CVJointColorTable[NUI_SKELETON_POSITION_COUNT] = { cvScalar(155, 176, 169), // NUI_SKELETON_POSITION_HIP_CENTER cvScalar(155, 176, 169), // NUI_SKELETON_POSITION_SPINE cvScalar( 29, 230, 168), // NUI_SKELETON_POSITION_SHOULDER_CENTER cvScalar( 0, 0, 200), // NUI_SKELETON_POSITION_HEAD cvScalar( 33, 84, 79), // NUI_SKELETON_POSITION_SHOULDER_LEFT cvScalar( 42, 33, 84), // NUI_SKELETON_POSITION_ELBOW_LEFT cvScalar( 0, 126, 255), // NUI_SKELETON_POSITION_WRIST_LEFT cvScalar( 0, 86, 215), // NUI_SKELETON_POSITION_HAND_LEFT cvScalar( 84, 79, 33), // NUI_SKELETON_POSITION_SHOULDER_RIGHT cvScalar( 84, 33, 3), // NUI_SKELETON_POSITION_ELBOW_RIGHT cvScalar(243, 109, 77), // NUI_SKELETON_POSITION_WRIST_RIGHT cvScalar(243, 69, 37), // NUI_SKELETON_POSITION_HAND_RIGHT cvScalar(243, 109, 77), // NUI_SKELETON_POSITION_HIP_LEFT cvScalar( 84, 33, 69), // NUI_SKELETON_POSITION_KNEE_LEFT cvScalar(122, 170, 229), // NUI_SKELETON_POSITION_ANKLE_LEFT cvScalar( 0, 126, 255), // NUI_SKELETON_POSITION_FOOT_LEFT cvScalar(213, 165, 181), // NUI_SKELETON_POSITION_HIP_RIGHT cvScalar( 76, 222, 71), // NUI_SKELETON_POSITION_KNEE_RIGHT cvScalar(156, 228, 245), // NUI_SKELETON_POSITION_ANKLE_RIGHT cvScalar(243, 109, 77), // NUI_SKELETON_POSITION_FOOT_RIGHT }; class MY_KINECT_NUI{ public: // thread handling // ハンドル HANDLE m_hNextVideoFrameEvent; HANDLE m_hNextDepthFrameEvent; HANDLE m_hNextSkeletonEvent; HANDLE m_pVideoStreamHandle; HANDLE m_pDepthStreamHandle; HANDLE m_hThNuiProcess; HANDLE m_hEvNuiProcessStop; HRESULT hr; HINSTANCE g_hInst; TCHAR g_szAppTitle[256]; HWND m_hWnd; int m_LastSkeletonFoundTime; bool m_bScreenBlanked; HDC m_SkeletonDC; HPEN m_Pen[6]; int m_PensTotal; POINT m_Points[NUI_SKELETON_POSITION_COUNT]; CvScalar m_CVPen[6]; // OpenCV用Pen IplImage* DepthImg; IplImage* VideoImg; IplImage* SkeletonImg; IplImage* PlayerImg; // 初期化系 void InitSensor(); // キネクトセンサ初期化(RGB,デプス,スケルトン使用) void OpenImageStream(); // RGB画像の出力ストリーム開放 void OpenDepthStream(); // デプス画像の出力ストリーム解放 void EnableSkeletonTracking(); // スケルトントラッキング void InitCVImg(); // void InitNUI(); int MessageBoxResource(HWND hwnd,UINT nID,UINT nType); // エラーメッセージ用 void Release(); // 終了処理 void GotVideoAlertCVImg( ); void GotDepthAlertCVImg(); void DrawSkeletonSegmentCVImg( IplImage* Skeleton, int StartPoint, int EndPoint, int ColorIndex); void DrawSkeletonCVImg( IplImage* Skeleton, NUI_SKELETON_DATA * pSkel, HWND hWnd, int WhichSkeletonColor ); void GotSkeletonAlertCVImg( ); }; #endif
#include "myKinectNUI.h" void MY_KINECT_NUI::InitNUI() { } void MY_KINECT_NUI::InitSensor() { hr = NuiInitialize( NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON | NUI_INITIALIZE_FLAG_USES_COLOR); if( FAILED( hr ) ){ MessageBoxResource(m_hWnd,IDS_ERROR_NUIINIT,MB_OK | MB_ICONHAND); //return hr; exit(1); } } void MY_KINECT_NUI::OpenImageStream() { // RGB画像の出力ストリーム開放 hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, m_hNextVideoFrameEvent, &m_pVideoStreamHandle ); if( FAILED( hr ) ){ MessageBoxResource(m_hWnd,IDS_ERROR_VIDEOSTREAM,MB_OK | MB_ICONHAND); //return hr; exit(1); } } void MY_KINECT_NUI::OpenDepthStream() { // デプス画像の出力ストリーム解放 hr = NuiImageStreamOpen( NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX, NUI_IMAGE_RESOLUTION_320x240, 0, 2, m_hNextDepthFrameEvent, &m_pDepthStreamHandle ); if( FAILED( hr ) ){ MessageBoxResource(m_hWnd,IDS_ERROR_DEPTHSTREAM,MB_OK | MB_ICONHAND); //return hr; exit(1); } } void MY_KINECT_NUI::EnableSkeletonTracking() { // スケルトン hr = NuiSkeletonTrackingEnable( m_hNextSkeletonEvent, 0 ); if( FAILED( hr ) ){ MessageBoxResource(m_hWnd,IDS_ERROR_SKELETONTRACKING,MB_OK | MB_ICONHAND); //return hr; exit(0); } } void MY_KINECT_NUI::Release() { NuiShutdown( ); if( m_hNextSkeletonEvent && ( m_hNextSkeletonEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextSkeletonEvent ); m_hNextSkeletonEvent = NULL; } if( m_hNextDepthFrameEvent && ( m_hNextDepthFrameEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextDepthFrameEvent ); m_hNextDepthFrameEvent = NULL; } if( m_hNextVideoFrameEvent && ( m_hNextVideoFrameEvent != INVALID_HANDLE_VALUE ) ){ CloseHandle( m_hNextVideoFrameEvent ); m_hNextVideoFrameEvent = NULL; } // 全ウィンドウの破棄 cvDestroyAllWindows(); // メモリの解放 if (DepthImg != NULL) cvReleaseImage(&DepthImg); if (PlayerImg != NULL) cvReleaseImage(&PlayerImg); if (VideoImg != NULL) cvReleaseImage(&VideoImg); if (SkeletonImg != NULL) cvReleaseImage(&SkeletonImg); } void MY_KINECT_NUI::InitCVImg() { cvNamedWindow("Depth"); cvNamedWindow("Player"); cvNamedWindow("Video"); //cvNamedWindow("Skeleton"); VideoImg = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 4); DepthImg = cvCreateImage(cvSize(320, 240), IPL_DEPTH_16U, 1); PlayerImg = cvCreateImage(cvSize(320, 240), IPL_DEPTH_8U, 1); //SkeletonImg = cvCreateImage(cvSize(480, 390), IPL_DEPTH_8U, 3); } /*****************************************************************************/ /* int MessageBoxResourceV(HWND hwnd,UINT nID,UINT nType, ... ) /* /* Superset of MessageBox functionality allowing a user to specify a String /* table loaded string /*****************************************************************************/ int MY_KINECT_NUI::MessageBoxResource(HWND hwnd,UINT nID,UINT nType) { static TCHAR szRes[512]; int nRet; LoadString(g_hInst,nID,szRes,sizeof(szRes)/sizeof(szRes[0])); nRet=::MessageBox(hwnd,szRes,g_szAppTitle,nType); return (nRet); } // イメージフレームの取得・CV形式に変換 void MY_KINECT_NUI::GotVideoAlertCVImg( ) { const NUI_IMAGE_FRAME * pImageFrame = NULL; HRESULT hr = NuiImageStreamGetNextFrame( m_pVideoStreamHandle, 0, &pImageFrame ); if( FAILED( hr ) ){ return; } NuiImageBuffer * pTexture = pImageFrame->pFrameTexture; KINECT_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ){ BYTE * pBuffer = (BYTE*) LockedRect.pBits; // データのコピー if (VideoImg != NULL){ memcpy( VideoImg->imageData, pBuffer, VideoImg->widthStep * VideoImg->height ); cvShowImage("Video", VideoImg); } } else{ OutputDebugString( L"Buffer length of received texture is bogus\r\n" ); } NuiImageStreamReleaseFrame( m_pVideoStreamHandle, pImageFrame ); } void MY_KINECT_NUI::GotDepthAlertCVImg( ) { const NUI_IMAGE_FRAME * pImageFrame = NULL; HRESULT hr = NuiImageStreamGetNextFrame( m_pDepthStreamHandle, 0, &pImageFrame ); if( FAILED( hr ) ){ return; } NuiImageBuffer * pTexture = pImageFrame->pFrameTexture; KINECT_LOCKED_RECT LockedRect; pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( LockedRect.Pitch != 0 ){ BYTE * pBuffer = (BYTE*) LockedRect.pBits; // pBufferRunの上位13bitが深度データ、下位3bitがPlayer番号 // Playerデータ (DepthImgを処理用に一時使用) if ((PlayerImg != NULL) && (DepthImg != NULL)){ memcpy( DepthImg->imageData, pBuffer, DepthImg->widthStep * DepthImg->height ); // 16bit中、下位3bitを取得 cvAndS(DepthImg, cvScalarAll(7), DepthImg); cvConvertScale(DepthImg, PlayerImg, 32); cvShowImage("Player", PlayerImg); } // Depthデータ if (DepthImg != NULL){ memcpy( DepthImg->imageData, pBuffer, DepthImg->widthStep * DepthImg->height ); // 16bit中、上位13bitを取得 cvAndS(DepthImg, cvScalarAll(0xfff8), DepthImg); cvShowImage("Depth", DepthImg); } } else{ OutputDebugString( L"Buffer length of received texture is bogus\r\n" ); } NuiImageStreamReleaseFrame( m_pDepthStreamHandle, pImageFrame ); } void MY_KINECT_NUI::DrawSkeletonSegmentCVImg( IplImage* Skeleton, int StartPoint, int EndPoint, int ColorIndex) { cvLine(Skeleton, cvPoint(m_Points[StartPoint].x, m_Points[StartPoint].y), cvPoint(m_Points[EndPoint].x, m_Points[EndPoint].y), m_CVPen[ColorIndex], 4); } void MY_KINECT_NUI::DrawSkeletonCVImg( IplImage* Skeleton, NUI_SKELETON_DATA * pSkel, HWND hWnd, int WhichSkeletonColor ) { HGDIOBJ hOldObj = SelectObject(m_SkeletonDC,m_Pen[WhichSkeletonColor % m_PensTotal]); RECT rct; //GetClientRect(hWnd, &rct); int width = 640;//rct.right; int height = 480;//rct.bottom; if( Skeleton ){ //PatBlt( m_SkeletonDC, 0, 0, width, height, BLACKNESS ); cvZero(Skeleton); } int scaleX = width; //scaling up to image coordinates int scaleY = height; float fx=0,fy=0; int i; for (i = 0; i < NUI_SKELETON_POSITION_COUNT; i++){ NuiTransformSkeletonToDepthImageF( pSkel->SkeletonPositions[i], &fx, &fy ); m_Points[i].x = (int) ( fx * scaleX + 0.5f ); m_Points[i].y = (int) ( fy * scaleY + 0.5f ); } DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_SPINE, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SPINE, NUI_SKELETON_POSITION_SHOULDER_CENTER, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_HEAD, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SHOULDER_LEFT, NUI_SKELETON_POSITION_ELBOW_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_ELBOW_LEFT, NUI_SKELETON_POSITION_WRIST_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_WRIST_LEFT, NUI_SKELETON_POSITION_HAND_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_SHOULDER_RIGHT, NUI_SKELETON_POSITION_ELBOW_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_ELBOW_RIGHT, NUI_SKELETON_POSITION_WRIST_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_WRIST_RIGHT, NUI_SKELETON_POSITION_HAND_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_HIP_LEFT, NUI_SKELETON_POSITION_KNEE_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_KNEE_LEFT, NUI_SKELETON_POSITION_ANKLE_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_ANKLE_LEFT, NUI_SKELETON_POSITION_FOOT_LEFT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_HIP_RIGHT, NUI_SKELETON_POSITION_KNEE_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_KNEE_RIGHT, NUI_SKELETON_POSITION_ANKLE_RIGHT, WhichSkeletonColor%m_PensTotal); DrawSkeletonSegmentCVImg(Skeleton, NUI_SKELETON_POSITION_ANKLE_RIGHT, NUI_SKELETON_POSITION_FOOT_RIGHT, WhichSkeletonColor%m_PensTotal); // Draw the joints in a different color for (i = 0; i < NUI_SKELETON_POSITION_COUNT; i++){ cvCircle(Skeleton, cvPoint(m_Points[i].x, m_Points[i].y), 5, g_CVJointColorTable[i], -1); } return; } void MY_KINECT_NUI::GotSkeletonAlertCVImg( ) { if (SkeletonImg == NULL) return; NUI_SKELETON_FRAME SkeletonFrame; HRESULT hr = NuiSkeletonGetNextFrame( 0, &SkeletonFrame ); bool bFoundSkeleton = true; for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ ){ if( SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED ){ bFoundSkeleton = false; } } // no skeletons! // if( bFoundSkeleton ){ return; } // smooth out the skeleton data NuiTransformSmooth(&SkeletonFrame,NULL); // we found a skeleton, re-start the timer m_bScreenBlanked = false; m_LastSkeletonFoundTime = -1; // draw each skeleton color according to the slot within they are found. // bool bBlank = true; for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ ){ if( SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED ){ DrawSkeletonCVImg( SkeletonImg, &SkeletonFrame.SkeletonData[i], GetDlgItem( m_hWnd, IDC_SKELETALVIEW ), i ); bBlank = false; } } cvShowImage("Skeleton", SkeletonImg); //Nui_DoDoubleBuffer(GetDlgItem(m_hWnd,IDC_SKELETALVIEW), m_SkeletonDC); }
このページへのコメント
Oe2NQ7 Awesome blog post.Much thanks again. Awesome.
BHWfPf <a href="http://ddbopwxvshix.com/">ddbopwxvshix</a>, [url=http://bepaugtohzix.com/]bepaugtohzix[/url], [link=http://hnzsllfycxxx.com/]hnzsllfycxxx[/link], http://fbsatqcbxnjj.com/
lz2ej2 <a href="http://lqmrdidglldc.com/">lqmrdidglldc</a>, [url=http://telzqhytejcf.com/]telzqhytejcf[/url], [link=http://vtzmsxprqgsn.com/]vtzmsxprqgsn[/link], http://vdkqvfsojqlr.com/