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

📄 w32g_i.c

📁 MIDI解码程序(用VC编写)
💻 C
📖 第 1 页 / 共 5 页
字号:
/*    TiMidity++ -- MIDI to WAVE converter and player    Copyright (C) 1999-2004 Masanao Izumo <iz@onicos.co.jp>    Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program 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 General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    w32g_main.c: Written by Daisuke Aoki <dai@y7.net>                 Modified by Masanao Izumo <iz@onicos.co.jp>*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include <stdio.h>#include <stdlib.h>#include <process.h>#include <stddef.h>#include <windows.h>#undef RC_NONE#include <shlobj.h>// #include <prsht.h>#if defined(__CYGWIN32__) || defined(__MINGW32__)#ifndef HAVE_NEW_MMSYSTEM#include <commdlg.h>#ifndef TPM_TOPALIGN#define TPM_TOPALIGN	0x0000L	/* for old version of cygwin */#endif#define TIME_ONESHOT 0#define TIME_PERIODIC 1int WINAPI timeSetEvent(UINT uDelay, UINT uResolution,			     void *fptc, DWORD dwUser, UINT fuEvent);int WINAPI timeKillEvent(UINT uTimerID);#endif#else#include <commctrl.h>#endif /* __CYGWIN32__ */#include <commctrl.h>#ifndef NO_STRING_H#include <string.h>#else#include <strings.h>#endif#include <shlobj.h>#include <windowsx.h>	/* There is no <windowsx.h> on CYGWIN.			 * Edit_* and ListBox_* are defined in			 * <windowsx.h>			 */#include "timidity.h"#include "common.h"#include "instrum.h"#include "playmidi.h"#include "readmidi.h"#include "output.h"#include "controls.h"#include "wrd.h"#include "w32g.h"#include "w32g_res.h"#include "w32g_utl.h"#include "w32g_ut2.h"#include "w32g_pref.h"#include "w32g_subwin.h"#if defined(__CYGWIN32__) || defined(__MINGW32__)#define WIN32GCCWINAPI void InitCommonControls(void);#endif#if 0#define GDI_LOCK() { \	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_LOCK(%s: %d)", __FILE__, __LINE__ ); \	gdi_lock(); \}#define GDI_UNLOCK() { \	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_UNLOCK(%s: %d)", __FILE__, __LINE__ ); \	gdi_unlock(); \}#else#define GDI_LOCK() { gdi_lock(); }#define GDI_UNLOCK() { gdi_unlock(); }#endifstatic void InitMainWnd(HWND hStartWnd);static void ConsoleWndVerbosityApplyIncDec(int num);void ConsoleWndVerbosityApply(void);void CanvasPaintAll(void);void CanvasReset(void);void CanvasClear(void);void CanvasUpdate(int flag);void CanvasReadPanelInfo(int flag);void CanvasChange(int mode);void MPanelPaintAll(void);void MPanelReadPanelInfo(int flag);void MPanelReset(void);void MPanelUpdateAll(void);void ClearConsoleWnd(void);void InitListWnd(HWND hParentWnd);void InitTracerWnd(HWND hParentWnd);void InitWrdWnd(HWND hParentWnd);void InitDocWnd(HWND hParentWnd);void InitListSearchWnd(HWND hParentWnd);void PutsDocWnd(char *str);void ClearDocWnd(void);static void DlgPlaylistSave(HWND hwnd);static void DlgPlaylistOpen(HWND hwnd);static void DlgDirOpen(HWND hwnd);static void DlgMidiFileOpen(HWND hwnd);void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList);void PutsEditCtlWnd(HWND hwnd, char *str);void ClearEditCtlWnd(HWND hwnd);int	w32gSaveDefaultPlaylist(void);#ifndef CLR_INVALID#define CLR_INVALID 0xffffffff#endif /* CLR_INVALID */extern int optind;HINSTANCE hInst;static int progress_jump = -1;static HWND hMainWndScrollbarProgressWnd;static HWND hMainWndScrollbarVolumeWnd;// #define W32G_VOLUME_MAX 200#define W32G_VOLUME_MAX MAX_AMPLIFICATION// HWNDHWND hMainWnd = 0;HWND hDebugWnd = 0;HWND hConsoleWnd = 0;HWND hTracerWnd = 0;HWND hDocWnd = 0;HWND hListWnd = 0;HWND hWrdWnd = 0;HWND hSoundSpecWnd = 0;HWND hDebugEditWnd = 0;HWND hDocEditWnd = 0;// Process.HANDLE hProcess = 0;// Main Thread.HANDLE hMainThread = 0;HANDLE hPlayerThread = 0;HANDLE hMainThreadInfo = 0;DWORD dwMainThreadID = 0;static volatile int wait_thread_flag = 1;typedef struct MAINTHREAD_ARGS_ {	int *pArgc;	char ***pArgv;} MAINTHREAD_ARGS;void WINAPI MainThread(void *arglist);// Window ThreadHANDLE hWindowThread = 0;HANDLE hWindowThreadInfo = 0;// Threadvolatile int ThreadNumMax = 0;// Debug Threadvolatile int DebugThreadExit = 1;volatile HANDLE hDebugThread = 0;void DebugThreadInit(void);void PrintfDebugWnd(char *fmt, ...);void ClearDebugWnd(void);void InitDebugWnd(HWND hParentWnd);// Flagsint InitMinimizeFlag = 0;int DebugWndStartFlag = 1;int ConsoleWndStartFlag = 0;int ListWndStartFlag = 0;int TracerWndStartFlag = 0;int DocWndStartFlag = 0;int WrdWndStartFlag = 0;int DebugWndFlag = 1;int ConsoleWndFlag = 1;int ListWndFlag = 1;int TracerWndFlag = 0;int DocWndFlag = 1;int WrdWndFlag = 0;int SoundSpecWndFlag = 0;int WrdGraphicFlag;int TraceGraphicFlag;char *IniFile;char *ConfigFile;char *PlaylistFile;char *PlaylistHistoryFile;char *MidiFileOpenDir;char *ConfigFileOpenDir;char *PlaylistFileOpenDir;// Priorityint PlayerThreadPriority;int MidiPlayerThreadPriority;int MainThreadPriority;int GUIThreadPriority;int TracerThreadPriority;int WrdThreadPriority;// dirint SeachDirRecursive = 0;	// 嵞婣揑僨傿儗僋僩儕専嶕 // Ini Fileint IniFileAutoSave = 1;	// INI 僼傽僀儖偺帺摦僙乕僽// miscint DocMaxSize;char *DocFileExt;int AutoloadPlaylist = 0;int AutosavePlaylist = 0;int volatile save_playlist_once_before_exit_flag = 1;static volatile int w32g_wait_for_init;void w32g_send_rc(int rc, int32 value);int w32g_lock_open_file = 0;void TiMidityHeapCheck(void);volatile DWORD dwWindowThreadID = -1;void w32g_i_init(void){    ThreadNumMax++;    hProcess = GetCurrentProcess();    hWindowThread = GetCurrentThread();	dwWindowThreadID = GetCurrentThreadId();    InitCommonControls();#ifdef W32GUI_DEBUG    DebugThreadInit();#endif}int PlayerLanguage = LANGUAGE_ENGLISH;//int PlayerLanguage = LANGUAGE_JAPANESE;#define PInfoOK 1long SetValue(int32 value, int32 min, int32 max){  int32 v = value;  if(v < min) v = min;  else if( v > max) v = max;  return v;}int w32gSecondTiMidity(int opt, int argc, char **argv);int w32gSecondTiMidityExit(void);int SecondMode = 0;void FirstLoadIniFile(void);#ifndef WIN32GCCextern void CmdLineToArgv(LPSTR lpCmdLine, int *argc, CHAR ***argv);extern int win_main(int argc, char **argv); /* timidity.c */int WINAPIWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){	int argc;	CHAR **argv = NULL;	CmdLineToArgv(lpCmdLine,&argc,&argv);#if 0	FirstLoadIniFile();	if(w32gSecondTiMidity(SecondMode,argc,argv)==TRUE){		int res = win_main(argc, argv);		w32gSecondTiMidityExit();		return res;	} else		return -1;#else	wrdt=wrdt_list[0];	return win_main(argc, argv);#endif}#endif /* WIN32GCC */// ***************************************************************************// System Functionvoid CALLBACK KillProcess(UINT IDEvent, UINT uReserved, DWORD dwUser,	DWORD dwReserved1, DWORD dwReserved2){	exit(0);	//	ExitProcess(0);}void OnExit(void){#ifdef W32GUI_DEBUG	PrintfDebugWnd("PostQuitMessage\n");	Sleep(200);#endif	PostQuitMessage(0);}static int OnExitReadyWait = 200;void OnExitReady(void){	int i;#ifdef W32GUI_DEBUG	PrintfDebugWnd("OnExitReady: Start.\n");#endif    w32g_send_rc(RC_STOP, 0);	/* Exit after 10 sec. */		timeSetEvent(10000, 1000, KillProcess, 0, TIME_ONESHOT);	/* Wait really stopping to play */	i = 1000/OnExitReadyWait; /* 1 sec. */    while(w32g_play_active && i-- > 0)	{		Sleep(OnExitReadyWait);		VOLATILE_TOUCH(w32g_play_active);	}#ifdef W32GUI_DEBUG	PrintfDebugWnd("OnExitReady: End.\n");#endif}void OnQuit(void){	SendMessage(hMainWnd, WM_CLOSE, 0, 0);}// ***************************************************************************// Start Window// 戝尦偺僂傿儞僪僂偺抧埵偼Main Window偵忳傝丄崱偱偼偨偩偺弶婜壔娭悢void InitStartWnd(int nCmdShow){	InitMainWnd(NULL);	InitConsoleWnd(hMainWnd);	InitListWnd(hMainWnd);	InitTracerWnd(hMainWnd);	InitDocWnd(hMainWnd);	InitWrdWnd(hMainWnd);	InitSoundSpecWnd(hMainWnd);    hMainWndScrollbarProgressWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_PROGRESS);	hMainWndScrollbarVolumeWnd = GetDlgItem(hMainWnd, IDC_SCROLLBAR_VOLUME);	EnableScrollBar(hMainWndScrollbarVolumeWnd, SB_CTL,ESB_ENABLE_BOTH);	SetScrollRange(hMainWndScrollbarVolumeWnd, SB_CTL,		       0, W32G_VOLUME_MAX, TRUE);	SetScrollPos(hMainWndScrollbarVolumeWnd, SB_CTL,		     W32G_VOLUME_MAX - amplification, TRUE);}/*****************************************************************************/// Main Window#define SWS_EXIST		0x0001#define SWS_ICON		0x0002#define SWS_HIDE		0x0004typedef struct SUBWINDOW_ {	HWND *hwnd;	int status;}	SUBWINDOW;SUBWINDOW subwindow[] ={  {&hConsoleWnd,0},  {&hListWnd,0},  {&hTracerWnd,0},  {&hDocWnd,0},  {&hWrdWnd,0},  {&hSoundSpecWnd,0},  {NULL,0}};int SubWindowMax = 5;SUBWINDOW SubWindowHistory[] ={  {&hConsoleWnd,0},  {&hListWnd,0},  {&hTracerWnd,0},  {&hDocWnd,0},  {&hWrdWnd,0},  {&hSoundSpecWnd,0},  {NULL,0}};MAINWNDINFO MainWndInfo;BOOL CALLBACK MainProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);void update_subwindow(void);void OnShow(void);void OnHide(void);static int MainWndInfoReset(HWND hwnd);static int MainWndInfoApply(void);extern void reload_cfg(void);// OUTPUT MENU#define IDM_OUTPUT 0x4000static HMENU outputMenu;static void InitOutputMenu(HWND hWnd){	HMENU hMenu;	MENUITEMINFO mii;	int i;	hMenu = GetMenu(hWnd);	if (outputMenu != NULL)	{DestroyMenu (outputMenu);}	outputMenu = CreateMenu();	mii.cbSize = sizeof (MENUITEMINFO);	mii.fMask = MIIM_TYPE | MIIM_SUBMENU;	mii.fType = MFT_STRING;	mii.hSubMenu = outputMenu;	if (PlayerLanguage == LANGUAGE_JAPANESE) {		mii.dwTypeData = TEXT("弌椡(&O)");	} else {		mii.dwTypeData = TEXT("Output(&O)");	}	InsertMenuItem(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, &mii);	for (i = 0; play_mode_list[i] != 0; i++) {		mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;		mii.wID = IDM_OUTPUT + i;		mii.fType = MFT_STRING;		if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) {			mii.fState = MFS_CHECKED;		} else {			mii.fState = MFS_UNCHECKED;		}		mii.dwTypeData = play_mode_list[i]->id_name;		InsertMenuItem(outputMenu, i, TRUE, &mii);	}	SetMenu(hWnd , hMenu);}static void UpdateOutputMenu(HWND hWnd, UINT wId){	MENUITEMINFO mii;	int i, num = -1, oldnum;	for (i = 0; play_mode_list[i] != 0; i++) {		mii.cbSize = sizeof (MENUITEMINFO);		mii.fMask = MIIM_STATE | MIIM_ID;		GetMenuItemInfo(outputMenu, i, TRUE, &mii);		if (wId == mii.wID) {			mii.fState = MFS_CHECKED;			num = i;		} else {mii.fState = MFS_UNCHECKED;}		SetMenuItemInfo(outputMenu, i, TRUE, &mii);		if (st_temp->opt_playmode[0] == play_mode_list[i]->id_character) {			oldnum = i;		}	}	if (!w32g_play_active && num != oldnum) {		if (num >= 0) {st_temp->opt_playmode[0] = play_mode_list[num]->id_character;}		else {st_temp->opt_playmode[0] = 'd';}		PrefSettingApplyReally();	}}

⌨️ 快捷键说明

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