⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winlink.cpp

📁 linux下的任天堂模拟器代码。供大家参考。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
         MouseButton=(dims.rgbButtons[0]>>7)|(dims.rgbButtons[1]>>6)|(dims.rgbButtons[2]>>5)|(dims.rgbButtons[3]>>4);      }      else return FALSE;   }   return TRUE;}void ExitFunction(){   // We need to clean up the debug window if it's running   if (debugWindow) FreeConsole();   IsActivated = 0;   CheckScreenSaver();   ReleaseDirectInput();   ReleaseDirectSound();   ReleaseDirectDraw();   FreeLibrary(hM_dsound);   FreeLibrary(hM_ddraw);   FreeLibrary(hM_dinput8);   DestroyWindow(hMainWindow);}extern "C" { bool ctrlptr = false; }LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){   static bool shiftpr;   bool accept;   int vkeyval = 0;   switch (uMsg)   {      case WM_KEYDOWN:        // sent when user presses a key         if (!((CurKeyPos+1==CurKeyReadPos) || ((CurKeyPos+1==16)            && (CurKeyReadPos==0)))){            accept=false;            if (wParam==16)              shiftpr=true;            else if (wParam==17)              ctrlptr=true;            if (((wParam>='A') && (wParam<='Z')) ||                ((wParam>='a') && (wParam<='z')) || (wParam==27) ||                (wParam==32) || (wParam==8) || (wParam==13) || (wParam==9)) {              accept=true; vkeyval=wParam;            }            if ((wParam>='0') && (wParam<='9')) {              accept=true; vkeyval=wParam;              if (shiftpr) {                switch (wParam) {                  case '1': vkeyval='!'; break;                  case '2': vkeyval='@'; break;                  case '3': vkeyval='#'; break;                  case '4': vkeyval='$'; break;                  case '5': vkeyval='%'; break;                  case '6': vkeyval='^'; break;                  case '7': vkeyval='&'; break;                  case '8': vkeyval='*'; break;                  case '9': vkeyval='('; break;                  case '0': vkeyval=')'; break;                }              }            }            if ((wParam>=VK_NUMPAD0) && (wParam<=VK_NUMPAD9)) {              accept=true; vkeyval=wParam-VK_NUMPAD0+'0';            }            if (!shiftpr){              switch (wParam) {                case 189: vkeyval='-'; accept=true; break;                case 187: vkeyval='='; accept=true; break;                case 219: vkeyval='['; accept=true; break;                case 221: vkeyval=']'; accept=true; break;                case 186: vkeyval=';'; accept=true; break;                case 222: vkeyval=39; accept=true; break;                case 188: vkeyval=','; accept=true; break;                case 190: vkeyval='.'; accept=true; break;                case 191: vkeyval='/'; accept=true; break;                case 192: vkeyval='`'; accept=true; break;                case 220: vkeyval=92; accept=true; break;              }            } else {              switch (wParam) {                case 189: vkeyval='_'; accept=true; break;                case 187: vkeyval='+'; accept=true; break;                case 219: vkeyval='{'; accept=true; break;                case 221: vkeyval='}'; accept=true; break;                case 186: vkeyval=':'; accept=true; break;                case 222: vkeyval='"'; accept=true; break;                case 188: vkeyval='<'; accept=true; break;                case 190: vkeyval='>'; accept=true; break;                case 191: vkeyval='?'; accept=true; break;                case 192: vkeyval='~'; accept=true; break;                case 220: vkeyval='|'; accept=true; break;              }            }            switch (wParam) {              case 33: vkeyval=256+73; accept=true; break;              case 38: vkeyval=256+72; accept=true; break;              case 36: vkeyval=256+71; accept=true; break;              case 39: vkeyval=256+77; accept=true; break;              case 12: vkeyval=256+76; accept=true; break;              case 37: vkeyval=256+75; accept=true; break;              case 34: vkeyval=256+81; accept=true; break;              case 40: vkeyval=256+80; accept=true; break;              case 35: vkeyval=256+79; accept=true; break;              case 107: vkeyval='+'; accept=true; break;              case 109: vkeyval='-'; accept=true; break;              case 106: vkeyval='*'; accept=true; break;              case 111: vkeyval='/'; accept=true; break;              case 110: vkeyval='.'; accept=true; break;            }            if (accept){              KeyBuffer[CurKeyPos]=vkeyval;              CurKeyPos++;              if (CurKeyPos==16) CurKeyPos=0;            }         }         break;      case WM_KEYUP:          // sent when user releases a key         if (wParam==16) shiftpr=false;         else if (wParam==17) ctrlptr=false;         break;      case WM_MOUSEMOVE:         if (MouseInput && GUIOn2) MouseInput->Acquire();         break;      case WM_MOVE:         break;      case WM_PAINT:         ValidateRect(hWnd,NULL);         break;      case WM_ACTIVATE:         if (LOWORD(wParam) != WA_INACTIVE)         {            IsActivated = 1;            if (FirstActivate == 0) initwinvideo();            if (PauseFocusChange) EMUPause = 0;            InputAcquire();            if (FirstActivate == 1) FirstActivate = 0;            if (FullScreen == 1) Clear2xSaIBuffer();            CheckPriority();            CheckScreenSaver();         }         if (LOWORD(wParam) == WA_INACTIVE)         {            IsActivated = 0;            if (PauseFocusChange) EMUPause = 1;            InputDeAcquire();            if (GUIOn || GUIOn2 || EMUPause) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);            CheckScreenSaver();         }         break;      case WM_SETFOCUS:         if (FullScreen == 0) ShowWindow(hMainWindow, SW_SHOWNORMAL);         CheckPriority();         CheckScreenSaver();         InputAcquire();         break;      case WM_KILLFOCUS:         InputDeAcquire();         IsActivated = 0;         if (GUIOn || GUIOn2 || EMUPause) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);         CheckScreenSaver();         break;      case WM_DESTROY:         break;      case WM_CLOSE:         break;   }   return DefWindowProc(hWnd,uMsg,wParam,lParam);;}int RegisterWinClass(void){   if (AllowMultipleInst == 0)   {      HWND hFindWindow;      hFindWindow = FindWindow("ZSNES", NULL);      if (hFindWindow != NULL)      {         ShowWindow(hFindWindow, SW_SHOWNORMAL);         SetForegroundWindow(hFindWindow);         DosExit();      }   }   WNDCLASS wcl;   wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;   wcl.cbClsExtra = 0;   wcl.cbWndExtra = 0;   wcl.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));   wcl.hCursor = NULL;   wcl.hInstance = hInst;   wcl.lpfnWndProc = (WNDPROC)Main_Proc;   wcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);   wcl.lpszMenuName = NULL;   wcl.lpszClassName = "ZSNES";   if (RegisterClass(&wcl) == 0) return FALSE;   return TRUE;}BYTE PrevStereoSound;DWORD PrevSoundQuality;BOOL InitSound(){   WAVEFORMATEX wfx;   DSBCAPS dsbcaps;   SoundEnabled = 0;   if (soundon == 0) return FALSE;   PrevSoundQuality=SoundQuality;   PrevStereoSound=StereoSound;   if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL))   {      lpDirectSound->Initialize(NULL);      if (PrimaryBuffer)      {        if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_WRITEPRIMARY))        {           if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE))              return FALSE;        }        else UsePrimaryBuffer=1;      }      else      {         if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_NORMAL))         {            if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE))               return FALSE;         }         else UsePrimaryBuffer=0;      }   }   else   {      return FALSE;   }   wfx.wFormatTag = WAVE_FORMAT_PCM;   switch (SoundQuality)   {      case 0:         wfx.nSamplesPerSec = 8000;         SoundBufferSize=1024*2;         break;      case 1:         wfx.nSamplesPerSec = 11025;         SoundBufferSize=1024*2;         break;      case 2:         wfx.nSamplesPerSec = 22050;         SoundBufferSize=1024*4;         break;      case 3:         wfx.nSamplesPerSec = 44100;         SoundBufferSize=1024*8;         break;      case 4:         wfx.nSamplesPerSec = 16000;         SoundBufferSize=1024*4;         break;      case 5:         wfx.nSamplesPerSec = 32000;         SoundBufferSize=1024*8;         break;      case 6:         wfx.nSamplesPerSec = 48000;         SoundBufferSize=1024*8;         break;      default:         wfx.nSamplesPerSec = 11025;         SoundBufferSize=1024*2;   }   if (StereoSound==1)   {      wfx.nChannels = 2;      wfx.nBlockAlign = 4;      SoundBufferSize*=2;   }   else   {      wfx.nChannels = 1;      wfx.nBlockAlign = 2;   }   wfx.wBitsPerSample = 16;   wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;   wfx.cbSize=0;   memset(&dsbd, 0, sizeof(DSBUFFERDESC));   dsbd.dwSize = sizeof(DSBUFFERDESC);   dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS;   if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER;   dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize;   dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx;   if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))   {      if(!UsePrimaryBuffer)      {         if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))         {            if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))            {               return FALSE;            }         }         else return FALSE;      }      else      {         lpPrimaryBuffer->SetFormat(&wfx);         dsbcaps.dwSize=sizeof(DSBCAPS);         lpPrimaryBuffer->GetCaps(&dsbcaps);         SoundBufferSize=dsbcaps.dwBufferBytes;         if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING))         {            return FALSE;         }      }      SoundEnabled=1;      FirstSound=0;      return TRUE;   }   else   {      return FALSE;   }}BOOL ReInitSound(){   WAVEFORMATEX wfx;   DSBCAPS dsbcaps;   if (lpSoundBuffer)   {      lpSoundBuffer->Stop();      lpSoundBuffer->Release();      lpSoundBuffer = NULL;   }   if (lpPrimaryBuffer)   {      lpPrimaryBuffer->Stop();      lpPrimaryBuffer->Release();      lpPrimaryBuffer = NULL;   }   if (soundon == 0)   {      SoundEnabled = 0;      ReleaseDirectSound();      return FALSE;   }   else if (SoundEnabled == 0)      return InitSound();   SoundEnabled = 0;   PrevSoundQuality=SoundQuality;   PrevStereoSound=StereoSound;   wfx.wFormatTag = WAVE_FORMAT_PCM;   switch (SoundQuality)   {      case 0:         wfx.nSamplesPerSec = 8000;         SoundBufferSize=1024*2;         break;      case 1:         wfx.nSamplesPerSec = 11025;         SoundBufferSize=1024*2;         break;      case 2:         wfx.nSamplesPerSec = 22050;         SoundBufferSize=1024*4;         break;      case 3:         wfx.nSamplesPerSec = 44100;         SoundBufferSize=1024*8;         break;      case 4:         wfx.nSamplesPerSec = 16000;         SoundBufferSize=1024*4;         break;      case 5:         wfx.nSamplesPerSec = 32000;         SoundBufferSize=1024*8;         break;      case 6:         wfx.nSamplesPerSec = 48000;         SoundBufferSize=1024*8;         break;      default:         wfx.nSamplesPerSec = 11025;         SoundBufferSize=1024*2;   }   if (StereoSound==1)   {      wfx.nChannels = 2;      wfx.nBlockAlign = 4;      SoundBufferSize*=2;   }   else   {      wfx.nChannels = 1;      wfx.nBlockAlign = 2;   }   wfx.wBitsPerSample = 16;   wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;   wfx.cbSize=0;   memset(&dsbd, 0, sizeof(DSBUFFERDESC));   dsbd.dwSize = sizeof(DSBUFFERDESC);   dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS;   if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER;   dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize;   dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx;   if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))   {      if(!UsePrimaryBuffer)      {         if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))         {            if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))            {               return FALSE;            }         }         else return FALSE;      }      else      {         lpPrimaryBuffer->SetFormat(&wfx);         dsbcaps.dwSize=sizeof(DSBCAPS);         lpPrimaryBuffer->GetCaps(&dsbcaps);         SoundBufferSize=dsbcaps.dwBufferBytes;         if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING))         {            return FALSE;         }      }      SoundEnabled=1;      FirstSound=0;      return TRUE;   }   else   {      return FALSE;   }}BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef){   LPDIRECTINPUT8 pdi = (LPDIRECTINPUT8)pvRef;   GUID DeviceGuid = pdinst->guidInstance;   if (CurrentJoy>4)      return DIENUM_CONTINUE;   // Create the DirectInput joystick device.   if (pdi->CreateDevice(DeviceGuid,&JoystickInput[CurrentJoy], NULL) != DI_OK)   {      return DIENUM_CONTINUE;   }   if (JoystickInput[CurrentJoy]->SetDataFormat(&c_dfDIJoystick) != DI_OK)   {      JoystickInput[CurrentJoy]->Release();      return DIENUM_CONTINUE;   }   if (JoystickInput[CurrentJoy]->SetCooperativeLevel(hMainWindow, DISCL_EXCLUSIVE | DISCL_BACKGROUND) != DI_OK)   {      JoystickInput[CurrentJoy]->Release();      return DIENUM_CONTINUE;   }   DIPROPRANGE diprg;   diprg.diph.dwSize = sizeof(diprg);   diprg.diph.dwHeaderSize = sizeof(diprg.diph);   diprg.diph.dwObj = DIJOFS_X;   diprg.diph.dwHow = DIPH_BYOFFSET;   diprg.lMin = joy_sensitivity*-1;   diprg.lMax = joy_sensitivity;   if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))   {      X1Disable[CurrentJoy]=1;      X2Disable[CurrentJoy]=1;   }   diprg.diph.dwObj = DIJOFS_Y;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -