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

📄 sdl_dibevents.c

📁 SDL库 在进行视频显示程序spcaview安装时必须的库文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997-2006 Sam Lantinga    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public    License along with this library; if not, write to the Free Software    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA    Sam Lantinga    slouken@libsdl.org*/#include "SDL_config.h"#define WIN32_LEAN_AND_MEAN#include <windows.h>#include "SDL_main.h"#include "SDL_events.h"#include "SDL_syswm.h"#include "../../events/SDL_sysevents.h"#include "../../events/SDL_events_c.h"#include "../wincommon/SDL_lowvideo.h"#include "SDL_dibvideo.h"#include "SDL_vkeys.h"#ifndef WM_APP#define WM_APP	0x8000#endif#ifdef _WIN32_WCE#define NO_GETKEYBOARDSTATE#endif/* The translation table from a Microsoft VK keysym to a SDL keysym */static SDLKey VK_keymap[SDLK_LAST];static SDL_keysym *TranslateKey(WPARAM vkey, UINT scancode, SDL_keysym *keysym, int pressed);/* Masks for processing the windows KEYDOWN and KEYUP messages */#define REPEATED_KEYMASK	(1<<30)#define EXTENDED_KEYMASK	(1<<24)/* DJM: If the user setup the window for us, we want to save his window proc,   and give him a chance to handle some messages. */#ifdef STRICT#define WNDPROCTYPE	WNDPROC#else#define WNDPROCTYPE	FARPROC#endifstatic WNDPROCTYPE userWindowProc = NULL;#ifdef _WIN32_WCEWPARAM rotateKey(WPARAM key,SDL_ScreenOrientation direction) {	if (direction != SDL_ORIENTATION_LEFT)		return key;	switch (key) {		case 0x26: /* up */			return 0x27;		case 0x27: /* right */			return 0x28;		case 0x28: /* down */			return 0x25;		case 0x25: /* left */			return 0x26;	}	return key;}#endif /* The main Win32 event handler */LRESULT DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){	extern int posted;	switch (msg) {		case WM_SYSKEYDOWN:		case WM_KEYDOWN: {			SDL_keysym keysym;#ifdef _WIN32_WCE			// Drop GAPI artefacts			if (wParam == 0x84 || wParam == 0x5B)				return 0;			// Rotate key if necessary			if (this->hidden->orientation != SDL_ORIENTATION_UP)				wParam = rotateKey(wParam, this->hidden->orientation);	#endif 			/* Ignore repeated keys */			if ( lParam&REPEATED_KEYMASK ) {				return(0);			}			switch (wParam) {				case VK_CONTROL:					if ( lParam&EXTENDED_KEYMASK )						wParam = VK_RCONTROL;					else						wParam = VK_LCONTROL;					break;				case VK_SHIFT:					/* EXTENDED trick doesn't work here */					{					Uint8 *state = SDL_GetKeyState(NULL);					if (state[SDLK_LSHIFT] == SDL_RELEASED && (GetKeyState(VK_LSHIFT) & 0x8000)) {						wParam = VK_LSHIFT;					} else if (state[SDLK_RSHIFT] == SDL_RELEASED && (GetKeyState(VK_RSHIFT) & 0x8000)) {						wParam = VK_RSHIFT;					} else {						/* Win9x */						int sc = HIWORD(lParam) & 0xFF;						if (sc == 0x2A)							wParam = VK_LSHIFT;						else						if (sc == 0x36)							wParam = VK_RSHIFT;						else							wParam = VK_LSHIFT;					}					}					break;				case VK_MENU:					if ( lParam&EXTENDED_KEYMASK )						wParam = VK_RMENU;					else						wParam = VK_LMENU;					break;			}#ifdef NO_GETKEYBOARDSTATE			/* this is the workaround for the missing ToAscii() and ToUnicode() in CE (not necessary at KEYUP!) */			if ( SDL_TranslateUNICODE ) {				MSG m;				m.hwnd = hwnd;				m.message = msg;				m.wParam = wParam;				m.lParam = lParam;				m.time = 0;				if ( TranslateMessage(&m) && PeekMessage(&m, hwnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {					GetMessage(&m, hwnd, 0, WM_USER);			    		wParam = m.wParam;				}			}#endif /* NO_GETKEYBOARDSTATE */			posted = SDL_PrivateKeyboard(SDL_PRESSED,				TranslateKey(wParam,HIWORD(lParam),&keysym,1));		}		return(0);		case WM_SYSKEYUP:		case WM_KEYUP: {			SDL_keysym keysym;#ifdef _WIN32_WCE			// Drop GAPI artifacts			if (wParam == 0x84 || wParam == 0x5B)				return 0;			// Rotate key if necessary			if (this->hidden->orientation != SDL_ORIENTATION_UP)				wParam = rotateKey(wParam, this->hidden->orientation);	#endif			switch (wParam) {				case VK_CONTROL:					if ( lParam&EXTENDED_KEYMASK )						wParam = VK_RCONTROL;					else						wParam = VK_LCONTROL;					break;				case VK_SHIFT:					/* EXTENDED trick doesn't work here */					{					Uint8 *state = SDL_GetKeyState(NULL);					if (state[SDLK_LSHIFT] == SDL_PRESSED && !(GetKeyState(VK_LSHIFT) & 0x8000)) {						wParam = VK_LSHIFT;					} else if (state[SDLK_RSHIFT] == SDL_PRESSED && !(GetKeyState(VK_RSHIFT) & 0x8000)) {						wParam = VK_RSHIFT;					} else {						/* Win9x */						int sc = HIWORD(lParam) & 0xFF;						if (sc == 0x2A)							wParam = VK_LSHIFT;						else						if (sc == 0x36)							wParam = VK_RSHIFT;						else							wParam = VK_LSHIFT;					}					}					break;				case VK_MENU:					if ( lParam&EXTENDED_KEYMASK )						wParam = VK_RMENU;					else						wParam = VK_LMENU;					break;			}			/* Windows only reports keyup for print screen */			if ( wParam == VK_SNAPSHOT && SDL_GetKeyState(NULL)[SDLK_PRINT] == SDL_RELEASED ) {				posted = SDL_PrivateKeyboard(SDL_PRESSED,					TranslateKey(wParam,HIWORD(lParam),&keysym,1));			}			posted = SDL_PrivateKeyboard(SDL_RELEASED,				TranslateKey(wParam,HIWORD(lParam),&keysym,0));		}		return(0);#if defined(SC_SCREENSAVE) && defined(SC_MONITORPOWER)		case WM_SYSCOMMAND: {			const DWORD val = (DWORD) (wParam & 0xFFF0);			if ((val == SC_SCREENSAVE) || (val == SC_MONITORPOWER)) {				if (!this->hidden->allow_screensaver) {					/* Note that this doesn't stop anything on Vista					   if the screensaver has a password. */					return(0);				}			}		}		/* Fall through to default processing */#endif /* SC_SCREENSAVE && SC_MONITORPOWER */		default: {			/* Only post the event if we're watching for it */			if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) {			        SDL_SysWMmsg wmmsg;				SDL_VERSION(&wmmsg.version);				wmmsg.hwnd = hwnd;				wmmsg.msg = msg;				wmmsg.wParam = wParam;				wmmsg.lParam = lParam;				posted = SDL_PrivateSysWMEvent(&wmmsg);			/* DJM: If the user isn't watching for private				messages in her SDL event loop, then pass it				along to any win32 specific window proc.			 */			} else if (userWindowProc) {				return CallWindowProc(userWindowProc, hwnd, msg, wParam, lParam);			}		}		break;	}	return(DefWindowProc(hwnd, msg, wParam, lParam));}void DIB_PumpEvents(_THIS){	MSG msg;	while ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) {		if ( GetMessage(&msg, NULL, 0, 0) > 0 ) {			DispatchMessage(&msg);		}	}}static HKL hLayoutUS = NULL;void DIB_InitOSKeymap(_THIS){	int	i;#ifndef _WIN32_WCE	char	current_layout[KL_NAMELENGTH];	GetKeyboardLayoutName(current_layout);	//printf("Initial Keyboard Layout Name: '%s'\n", current_layout);	hLayoutUS = LoadKeyboardLayout("00000409", KLF_NOTELLSHELL);	if (!hLayoutUS) {		//printf("Failed to load US keyboard layout. Using current.\n");		hLayoutUS = GetKeyboardLayout(0);	}	LoadKeyboardLayout(current_layout, KLF_ACTIVATE);#else#if _WIN32_WCE >=420	TCHAR	current_layout[KL_NAMELENGTH];

⌨️ 快捷键说明

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