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

📄 main.c

📁 Evc编的一个在wince5.0上运行的flash播放器
💻 C
📖 第 1 页 / 共 2 页
字号:
				break;

			case ID_TOOLS_SHOWALL:
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'A', 0);
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'C', 0);
				break;

			case ID_HELP_PANLEFT:
				SendMessage(movie, WM_KEYDOWN, (WPARAM)VK_LEFT, 0);
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'C', 0);
				break;
			case ID_HELP_PANRIGHT:
				SendMessage(movie, WM_KEYDOWN, (WPARAM)VK_RIGHT, 0);
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'C', 0);
				break;
			case ID_HELP_PANUP:
				SendMessage(movie, WM_KEYDOWN, (WPARAM)VK_UP, 0);
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'C', 0);
				break;
			case ID_HELP_PANDOWN:
				SendMessage(movie, WM_KEYDOWN, (WPARAM)VK_DOWN, 0);
				SendMessage(movie, WM_KEYDOWN, (WPARAM)'C', 0);
				break;

			case ID_HELP_ABOUT:
			   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hwnd, (DLGPROC)About);
			   break;

			case IDM_FILE_CLOSE:
				SendMessage(movie, WM_UNLOADFLASH, 0, 0);
				InvalidateRect(movie, NULL, TRUE);
				break;

			case ID_FILE_EXIT:
			   PostMessage(hwnd, WM_CLOSE, 0, 0);
			   break;
			//case ID_FILE_OPEN:
			//   break;

			default:
			   return DefWindowProc(hwnd, msg, wp, lp);
		}
	} else if (msg == WM_KEYDOWN || msg == WM_KEYUP || msg == WM_CHAR) {
		PostMessage(movie, msg, wp, lp);
	} else if (msg == WM_CLOSE) {
		SendMessage(movie, WM_UNLOADFLASH, 0, 0);
		DestroyWindow(hwnd);
	} else if (msg == WM_DESTROY) {
        PostQuitMessage (0);
	} else {
		return DefWindowProc(hwnd, msg, wp, lp);
	}

	return FALSE;

}


void DrawDelay(HWND hwnd, int wakeUp, struct timeval * wd) {
	long delay;
	TCHAR buf[80];
	HDC hdc = GetDC(hwnd);
	RECT rect;

	delay = (wd->tv_sec)*1000 + (wd->tv_usec)/1000;  // delay in milliseconds


	GetClientRect(hwnd, &rect);

	wsprintf(buf, _T("wakeUp=%d delay=%d frametime=%dms                          "), wakeUp, delay, framerate);

	SelectObject(hdc, GetStockObject(BLACK_PEN));
	SelectObject(hdc, GetStockObject(WHITE_BRUSH));

	ExtTextOut(hdc, 0, rect.bottom - 14, 0, NULL, buf, lstrlen(buf), NULL);

	ReleaseDC(hwnd, hdc);

}

void FlashBlitWin32() {
	BitBlt(wc->hdc, wc->fd.clip_x, wc->fd.clip_y, wc->fd.clip_width, wc->fd.clip_height, wc->bmpDC, wc->fd.clip_x, wc->fd.clip_y, SRCCOPY);
}


LRESULT movieWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
	static struct timeval wd,de,now;
	MSG event;
	long cmd;
	//fd_set fdset;
	//int status;
	static long delay = 0;
	static long wakeUp = 0;
	static long yieldToMessage = 0;
	static long z = 20;
	static long x = 0;
	static long y = 0;
	long timeToDrawFrame = 0;

	static FlashHandle flashHandle = NULL;

	static BOOL eatMouseDown = FALSE;
	static BOOL eatMouseUp = FALSE;

	LRESULT ret = 0;

	yieldToMessage = 0;

	if (wc->fd.flash_refresh) {
		wc->fd.flash_refresh = 0;
		FlashBlitWin32();
	}

	switch(msg) {
	case WM_TIMER:
		KillTimer(hwnd, wp);
		PostMessage(hwnd, WM_FLASHWAKEUP, 0, 0);
		break;
	case WM_CREATE:
		flashHandle = ((LPCREATESTRUCT)lp)->lpCreateParams;
		//SetTimer(hwnd, 1, 50, NULL);
		break;
	case WM_FLASHWAKEUP:
		cmd = FLASH_WAKEUP;
		wakeUp = 1;
		while (wakeUp) {
			MSG mymsg;
			if (flashHandle) wakeUp = FlashTick(flashHandle, cmd, 0, &wd, &framerate);

			if (PeekMessage(&mymsg, hwnd, 0, 0, PM_NOREMOVE | PM_NOYIELD)) {
				yieldToMessage = 1;
				break;
			} else {
				if (wc->fd.flash_refresh) {
					wc->fd.flash_refresh = 0;
					FlashBlitWin32();
				}
			}

			delay = (wd.tv_sec)*1000 + (wd.tv_usec)/1000;  // delay in milliseconds
			delay -= framerate;	// subtract out how long it took to draw last frame, or else we're just waiting around for nothing.
			if (delay <= 0) {
				// go again!
			} else {
				break;
			}

		}
		break;
	case WM_KEYUP:
		switch(wp) {
		case VK_F24:
			eatMouseDown = FALSE;
			eatMouseUp = FALSE;
			break;
		}
		break;

	case WM_UNLOADFLASH:
		if (flashHandle) FlashClose(flashHandle);
		flashHandle = NULL;
		KillTimer(hwnd, 23);
		//InvalidateRect(hwnd, NULL, TRUE);
		//UpdateWindow(hwnd);
		break;

	case WM_SETFLASHHANDLE:
		z = 20;
		x = y = 0;
		flashHandle = (FlashHandle)lp;
		wakeUp = 1;
		break;

	case WM_KEYDOWN:
		{
			FlashEvent fe;
			switch(wp) {
			case VK_F24:
				eatMouseDown = TRUE;
				eatMouseUp = TRUE;
				break;
			case VK_UP:
				fe.key = FeKeyUp;
				break;
			case VK_DOWN:
				fe.key = FeKeyDown;
				break;
			case VK_LEFT:
				fe.key = FeKeyLeft;
				break;
			case VK_RIGHT:
				fe.key = FeKeyRight;
				break;
			case VK_RETURN:
				fe.key = FeKeyEnter;
				break;
			case VK_TAB:
				fe.key = FeKeyNext;
				break;

#if 0
			case VK_UP:
				y -= 10;
				if (flashHandle) FlashOffset(flashHandle,x,y);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case VK_DOWN:
				y += 10;
				if (flashHandle) FlashOffset(flashHandle,x,y);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case VK_LEFT:
				x -= 10;
				if (flashHandle) FlashOffset(flashHandle,x,y);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case VK_RIGHT:
				x += 10;          
				if (flashHandle) FlashOffset(flashHandle,x,y);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
#endif
			case 'Z':
				if (flashHandle) FlashZoom(flashHandle,++z);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case 'X':
				if (flashHandle) FlashZoom(flashHandle,--z);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case 'A':
				z = 20;
				x = 0;          
				y = 0;          
				if (flashHandle) FlashZoom(flashHandle,z);
				if (flashHandle) FlashOffset(flashHandle,x,y);
				break;

			case 'C':
				cmd = FLASH_CONT;
				if (flashHandle) wakeUp = FlashTick(flashHandle, cmd, 0, &wd, &framerate);
				break;
			case 'P':
				cmd = FLASH_STOP;
				if (flashHandle) wakeUp = FlashTick(flashHandle, cmd, 0, &wd, &framerate);
				break;
			case 'R':
				cmd = FLASH_REWIND;
				if (flashHandle) FlashTick(flashHandle, cmd, 0, &wd, &framerate);
				cmd = FLASH_CONT;
				if (flashHandle) wakeUp = FlashTick(flashHandle, cmd, 0, &wd, &framerate);
				break;
			}

			if (fe.key != 0) {
				cmd = FLASH_EVENT;
				fe.type = FeKeyPress;
				if (FlashExec(flashHandle, cmd, &fe, &wd)) {
					wakeUp = 1;
				}
			}
		}
		break;

	case WM_LBUTTONDOWN:
		// linux flashlib (or X) is weird -- need to set a mousemove event before a ButtonPress:
		cmd = FLASH_EVENT;
		event.hwnd = hwnd;
		event.message = WM_MOUSEMOVE;
		event.lParam = lp;
		event.wParam = wp;
		event.pt.x = LOWORD(lp);
		event.pt.y = HIWORD(lp);
		event.time = GetTickCount() - 1;

		if ((flashHandle) && FlashTick(flashHandle, cmd, &event, &wd, &framerate))
			wakeUp = 1;

		// now fallthrough to default.

	case WM_LBUTTONUP:
		if (msg == WM_LBUTTONDOWN && eatMouseDown) {
			//eatMouseDown = FALSE;
			break;	
		}
		if (msg == WM_LBUTTONUP && eatMouseUp) {
			//eatMouseUp = FALSE;
			break;
		}
		// if we get here we're not eating, so treat as default, fallthrough
		
	default:
		cmd = FLASH_EVENT;
		event.hwnd = hwnd;
		event.message = msg;
		event.lParam = lp;
		event.wParam = wp;
		event.pt.x = LOWORD(lp);
		event.pt.y = HIWORD(lp);
		event.time = GetTickCount();

		if ((flashHandle) && FlashTick(flashHandle, cmd, &event, &wd, &framerate))
			wakeUp = 1;

		if (msg == WM_ERASEBKGND) {
			if (flashHandle == NULL) {
				ret = DefWindowProc(hwnd, msg, wp, lp);
			}
		} else if (msg == WM_PAINT) {
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
			RECT rect;
			GetClientRect(hwnd, &rect);
			if (flashHandle == NULL) {
				HBITMAP hbm;
				HDC hmemdc;
				HBITMAP hmembmp;
				BITMAP bmp;
				Rectangle(hdc, -1, -1, rect.right + 1, rect.bottom + 1);

				hbm = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_BITMAP2));
				GetObject(hbm, sizeof(BITMAP), &bmp);
				hmemdc = CreateCompatibleDC(hdc);
				hmembmp = SelectObject(hmemdc, hbm);
				BitBlt(hdc, rect.right/2 - bmp.bmWidth/2, rect.bottom/2 - bmp.bmHeight/2, bmp.bmWidth, bmp.bmHeight, hmemdc, 0, 0, SRCCOPY);
				SelectObject(hmemdc, hmembmp);
				DeleteDC(hmemdc);
				DeleteObject(hbm);


			} else {
				wc->fd.clip_x = 0;
				wc->fd.clip_y = 0;
				wc->fd.clip_width = rect.right;
				wc->fd.clip_height = rect.bottom;

				FlashBlitWin32();

			}
			EndPaint(hwnd, &ps);
		} else {
			ret = DefWindowProc(hwnd, msg, wp, lp);
		}


		break;
	}

	if (msg != WM_UNLOADFLASH && diag) DrawDelay(hwnd, wakeUp, &wd);

	// FIXME here, do REAL delay intended.
	if (flashHandle) {
		if (msg != WM_TIMER && msg != WM_UNLOADFLASH) {
			if (wakeUp) {
				delay = (wd.tv_sec)*1000 + (wd.tv_usec)/1000;  // delay in milliseconds
				delay -= framerate;	// subtract out how long it took to draw last frame, or else we're just waiting around for nothing.
				if (delay <= 0) {
					delay = 1;
					//PostMessage(hwnd, WM_TIMER, 0, 0);
					//if (flashHandle) SetTimer(hwnd, 23, delay, NULL);
					if (yieldToMessage) {
						SetTimer(hwnd, 23, delay, NULL);
					} else {
						SendMessage(hwnd, WM_TIMER, 23, 0);
					}
				} else {
					SetTimer(hwnd, 23, delay, NULL);
				}
				//SetTimer(hwnd, 23, 1, NULL);	// wake now!
			} else {
				// wants a window event, doesnt need ticking.

				// if broken uncomment these
				//delay = (wd.tv_sec)*1000 + (wd.tv_usec)/1000;  // delay in milliseconds
				//SetTimer(hwnd, 23, delay, NULL);
			}
		}
	}

	return ret;
}

LRESULT controlWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
	if (msg == WM_LBUTTONDOWN) {
		PostMessage(frame, WM_CLOSE, 0, 0);
	} else if (msg == WM_PAINT) {
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);
		//drawInfo();
		EndPaint(hwnd, &ps);
	} else {
		return DefWindowProc(hwnd, msg, wp, lp);
	}

	return FALSE;
}


void loadPlayer(int argc, char **argv)
{
	WNDCLASS wndclass;
	RECT rect;


    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = g_hInstance;
    wndclass.hIcon         = 0;
    wndclass.hCursor       = NULL;
    wndclass.hbrBackground = (void *)COLOR_WINDOW;
    wndclass.lpszMenuName  = NULL;

    wndclass.lpfnWndProc   = (WNDPROC)frameWndProc;
    wndclass.lpszClassName = (LPCTSTR)frameName;
	RegisterClass(&wndclass);

    wndclass.lpfnWndProc   = (WNDPROC)movieWndProc;
    wndclass.lpszClassName = (LPCTSTR)movieName;
	RegisterClass(&wndclass);

    wndclass.lpfnWndProc   = (WNDPROC)controlWndProc;
    wndclass.lpszClassName = (LPCTSTR)controlName;
	RegisterClass(&wndclass);


	frame = CreateWindow(frameName, _T("Pocket Spark"), WS_VISIBLE, 
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
		//0, 0, fi.frameWidth/20, fi.frameHeight/20+40, 
		NULL, NULL, g_hInstance, NULL);

	if (!frame) {
		TCHAR buf[80];
		wsprintf(buf, _T("couldnt create frame, lasterr = %d, frameWidth = %d, frameHeight = %d"), GetLastError(), fi.frameWidth, fi.frameHeight);
		MessageBox(NULL, buf, _T(""), 0);
	} else {
		TCHAR buf[80];
		wsprintf(buf, _T("frame, lasterr = %d, frameWidth = %d, frameHeight = %d"), GetLastError(), fi.frameWidth, fi.frameHeight);
		//MessageBox(NULL, buf, _T(""), 0);
	}


	GetClientRect(frame, &rect);

	movie = CreateWindow(movieName, _T(""), WS_CHILD | WS_VISIBLE, 0, cbheight, rect.right, rect.bottom - cbheight, /*fi.frameWidth/20,fi.frameHeight/20,*/ frame, NULL, g_hInstance, NULL);
	if (!movie) {
		TCHAR buf[80];
		wsprintf(buf, _T("couldnt create movie, lasterr = %d, frameWidth = %d, frameHeight = %d"), GetLastError(), fi.frameWidth, fi.frameHeight);
		MessageBox(NULL, buf, _T(""), 0);
	}

	control = CreateWindow(controlName, _T(""), WS_CHILD | WS_VISIBLE, 0, 0, 240, 1, frame, NULL, g_hInstance, NULL);
	if (!control) {
		TCHAR buf[80];
		wsprintf(buf, _T("couldnt create control, lasterr = %d, frameWidth = %d, frameHeight = %d"), GetLastError(), fi.frameWidth, fi.frameHeight);
	}

	ShowWindow(frame, SW_SHOW);
	ShowWindow(movie, SW_SHOW);
	ShowWindow(control, SW_SHOW);

	UpdateWindow(frame);
	UpdateWindow(movie);
	UpdateWindow(control);
	//exit(0);
}


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int CmdShow) {
	//char argv[3][MAX_PATH];


	MSG msg;
	TCHAR g_szFileName[MAX_PATH*2];
	TCHAR g_szTitleName[MAX_PATH*2];
	char** argv;
	HWND oldHWND;

	hInst = hInstance;
	wcscpy(g_szFileName, _T(""));
	wcscpy(g_szTitleName, _T("Open Flash File"));

	if (oldHWND = FindWindow(frameName, _T("Pocket Spark"))) {
		COPYDATASTRUCT cds;
		cds.dwData = WM_FILEDROPPED;
		cds.cbData = sizeof(TCHAR) * (lstrlen(lpCmdLine) + 1);
		cds.lpData = lpCmdLine;

		SetForegroundWindow(oldHWND);
		SendMessage(oldHWND, WM_COPYDATA, 0, (LPARAM)&cds);
		return 0;
	}

	//PalmFileInitialize (NULL) ;
	//if (PalmFileOpenDlg (NULL, g_szFileName, g_szTitleName)) {


		argv = (char**)malloc(3 * (sizeof(char*)));
		argv[0] = (char*)malloc(MAX_PATH);
		argv[1] = (char*)malloc(MAX_PATH);
		argv[2] = (char*)malloc(MAX_PATH);
		
		strcpy(argv[0], "player");
		strcpy(argv[1], "\\test.swf");
		//wcstombs(argv[1], g_szFileName, lstrlen(g_szFileName) + 1);

		argv[2][0] = '\0';
		g_hInstance = hInstance;

		loadPlayer(3, argv);
	//}

		if (lstrlen(lpCmdLine) > 0) {
			fileDropped = lpCmdLine;
		}

		PostMessage(frame, WM_EVERYTHINGLOADED, 0, 0);

    while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage (&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

⌨️ 快捷键说明

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