📄 winlink.cpp
字号:
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;
break;
case WM_MOUSEMOVE:
if (MouseInput) 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();
InputAcquire();
if (FirstActivate == 1) FirstActivate = 0;
CheckScreenSaver();
}
if (LOWORD(wParam) == WA_INACTIVE)
{
IsActivated = 0;
CheckScreenSaver();
}
break;
case WM_SETFOCUS:
if (FullScreen == 0) ShowWindow(hMainWindow, SW_SHOWNORMAL);
InputAcquire();
break;
case WM_KILLFOCUS:
InputDeAcquire();
IsActivated = 0;
CheckScreenSaver();
break;
case WM_DESTROY:
break;
case WM_CLOSE:
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return 0;
}
int RegisterWinClass(void)
{
if (AllowMultipleInst == 0)
{
HWND hFindWindow;
hFindWindow = FindWindow("ZSNESWIN", 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(NULL,IDI_APPLICATION);
wcl.hCursor = NULL;
wcl.hInstance = hInst;
wcl.lpfnWndProc = (WNDPROC)Main_Proc;
wcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcl.lpszMenuName = NULL;
wcl.lpszClassName = "ZSNESWIN";
if (RegisterClass(&wcl) == 0) return FALSE;
return TRUE;
}
BYTE PrevStereoSound;
DWORD PrevSoundQuality;
InitSound()
{
WAVEFORMATEX wfx;
if (!SoundEnabled) return FALSE;
PrevSoundQuality=SoundQuality;
PrevStereoSound=StereoSound;
if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL))
{
if (ExclusiveSound == 0)
{
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_NORMAL))
{
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE))
{
SoundEnabled=0;
return FALSE;
}
}
}
else
{
if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE))
{
SoundEnabled=0;
return FALSE;
}
}
}
else
{
SoundEnabled=0; 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_STICKYFOCUS; // | DSBCAPS_PRIMARYBUFFER;
dsbd.dwBufferBytes = SoundBufferSize;
dsbd.lpwfxFormat = &wfx;
if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))
{
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
{
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING))
{
SoundEnabled=0; return FALSE;
}
FirstSound=0;
return TRUE;
}
else
{
SoundEnabled=0; return FALSE;
}
}
else
{
SoundEnabled=0; return FALSE;
}
}
ReInitSound()
{
WAVEFORMATEX wfx;
if (!SoundEnabled) return FALSE;
lpSoundBuffer->Stop();
lpSoundBuffer->Release();
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 (LargeSoundBuf == 1)
{
SoundBufferSize*=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_STICKYFOCUS;
dsbd.dwBufferBytes = SoundBufferSize;
dsbd.lpwfxFormat = &wfx;
if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL))
{
if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer))
{
if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING ))
{
return FALSE;
}
LastUsedPos=0;
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef)
{
LPDIRECTINPUT8 pdi = (LPDIRECTINPUT8)pvRef;
GUID DeviceGuid = pdinst->guidInstance;
if (CurrentJoy>3)
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_NONEXCLUSIVE | DISCL_FOREGROUND) != 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 = -1000;
diprg.lMax = +1000;
if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))
{
X1Disable[CurrentJoy]=1;
X2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_Y;
if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))
{
Y1Disable[CurrentJoy]=1;
Y2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_Z;
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
Z1Disable[CurrentJoy]=1;
Z2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_RX;
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
RX1Disable[CurrentJoy]=1;
RX2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_RY;
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
RY1Disable[CurrentJoy]=1;
RY2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_RZ;
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
RZ1Disable[CurrentJoy]=1;
RZ2Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_SLIDER(0);
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
S01Disable[CurrentJoy]=1;
S02Disable[CurrentJoy]=1;
}
diprg.diph.dwObj = DIJOFS_SLIDER(1);
if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)))
{
S11Disable[CurrentJoy]=1;
S12Disable[CurrentJoy]=1;
}
DIDEVCAPS didc;
didc.dwSize = sizeof(DIDEVCAPS);
if (JoystickInput[CurrentJoy]->GetCapabilities(&didc) != DI_OK)
{
JoystickInput[CurrentJoy]->Release();
return DIENUM_CONTINUE;
}
if (didc.dwButtons <= 16)
NumBTN[CurrentJoy] = didc.dwButtons;
else
NumBTN[CurrentJoy] = 16;
if (didc.dwPOVs)
NumPOV[CurrentJoy] = didc.dwPOVs;
else
POVDisable[CurrentJoy] = 1;
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(dipdw.diph);
dipdw.diph.dwHow = DIPH_BYOFFSET;
dipdw.dwData = 2500;
dipdw.diph.dwObj = DIJOFS_X;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_Y;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_Z;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_RX;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_RY;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_RZ;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_SLIDER(0);
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwObj = DIJOFS_SLIDER(1);
JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(dipdw.diph);
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = DIPROPAXISMODE_ABS;
dipdw.diph.dwObj = 0;
JoystickInput[CurrentJoy]->SetProperty(DIPROP_AXISMODE, &dipdw.diph);
CurrentJoy+=1;
return DIENUM_CONTINUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -