📄 w32g_subwin3.c
字号:
/* TiMidity++ -- MIDI to WAVE converter and player Copyright (C) 1999-2002 Masanao Izumo <mo@goice.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_subwin3.c: Written by Daisuke Aoki <dai@y7.net>*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include <stdio.h>#include <stdlib.h>#include <process.h>#include <stddef.h>#ifndef NO_STRING_H#include <string.h>#else#include <strings.h>#endif#include "timidity.h"#include "common.h"#include "instrum.h"#include "playmidi.h"#include "readmidi.h"#include "output.h"#include "controls.h"#include "tables.h"#include "miditrace.h"#include "reverb.h"#ifdef SUPPORT_SOUNDSPEC#include "soundspec.h"#endif /* SUPPORT_SOUNDSPEC */#include "recache.h"#include "arc.h"#include "strtab.h"#include "mid.defs"#include "w32g.h"#include <shlobj.h>#include <commctrl.h>#include <windowsx.h>#include "w32g_res.h"#include "w32g_utl.h"#include "w32g_pref.h"#include "w32g_subwin.h"#include "w32g_ut2.h"#include "w32g_tracer.h"extern int gdi_lock_ex ( DWORD timeout );#if 0static int gdi_lock_result;#define GDI_LOCK_EX(timeout) ( \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_LOCK_EX(%s: %d)", __FILE__, __LINE__ ), \ gdi_lock_result = gdi_lock_ex(timeout), \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "GDI_LOCK_EX_RESULT(%d)", gdi_lock_result ), \ gdi_lock_result \)#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_LOCK_EX(timeout) gdi_lock_ex(timeout)#define GDI_UNLOCK() { gdi_unlock(); }#endif#if defined(__CYGWIN32__) || defined(__MINGW32__)#ifndef TPM_TOPALIGN#define TPM_TOPALIGN 0x0000L#endif#endifextern void VprintfEditCtlWnd(HWND hwnd, char *fmt, va_list argList);extern void PrintfEditCtlWnd(HWND hwnd, char *fmt, ...);extern void PutsEditCtlWnd(HWND hwnd, char *str);extern void ClearEditCtlWnd(HWND hwnd);#define C_BACK RGB(0x00,0x00,0x00)// #define C_BAR_FORE RGB(0xFF,0xFF,0x00)#define C_BAR_FORE RGB(0xD0,0xD0,0x00)#define C_BAR_FORE2 RGB(0xD0,0xB0,0x00)#define C_BAR_BACK RGB(0xA0,0xA0,0xA0)#define C_BAR_LEFT RGB(0xD0,0xD0,0x00)#define C_BAR_RIGHT RGB(0x80,0xD0,0x40)#define C_TEXT_FORE RGB(0x00,0x00,0x00)#define C_TEXT_BACK RGB(0xC0,0xC0,0xC0)#define C_TEXT_BACK_DARK RGB(0x80,0x80,0x80)#define C_TEXT_BACK_VERY_DARK RGB(0x40,0x40,0x40)#define CVV_TYPE_NONE 0#define CVV_TYPE_LEFT 1 // 嵍偐傜塃#define CVV_TYPE_RIGHT 2 // 塃偐傜嵍#define CVV_TYPE_TOP 3 // 忋偐傜壓#define CVV_TYPE_BOTTOM 4 // 壓偐傜忋#define VEL_MAX 128*4#define TWI_MODE_1_32CH 1#define TWI_MODE_1_16CH 2#define TWI_MODE_17_32CH 3#define CTL_STATUS_UPDATE -98extern ControlMode *ctl;#define CSV_LEFT 0#define CSV_RIGHT 1#define CSV_CENTER 2static struct tracer_bmp_ { HBITMAP hbmp; HDC hmdc; RECT rc_volume; RECT rc_expression; RECT rc_pan; RECT rc_sustain; RECT rc_pitch_bend; RECT rc_mod_wheel; RECT rc_chorus_effect; RECT rc_reverb_effect; RECT rc_velocity[2]; RECT rc_notes; RECT rc_notes_sustain; RECT rc_notes_on; RECT rc_notes_mask[12]; RECT rc_note[12]; RECT rc_note_sustain[12]; RECT rc_note_on[12]; RECT rc_gm_on; RECT rc_gm_off; RECT rc_gs_on; RECT rc_gs_off; RECT rc_xg_on; RECT rc_xg_off; RECT rc_temper_keysig[32]; RECT rc_temper_type[8];} tracer_bmp;static int get_head_rc ( RECT *rc, RECT *rc_base );static int get_ch_rc ( int ch, RECT *rc, RECT *rc_base );static int notes_view_draw ( RECT *lprc, int note, int vel, int back_draw, int lockflag );#if 0static int cheap_volume_view_draw ( RECT *lprc, int vol, int max, COLORREF fore, COLORREF back, int type, int lockflag );#endifstatic int cheap_string_view_draw ( RECT *lprc, char *str, COLORREF fore, COLORREF back, int mode, int lockflag );static int cheap_half_string_view_draw ( RECT *lprc, char *str, COLORREF fore, COLORREF back, int mode, int lockflag );static int change_tracer_wnd_mode ( int mode );static int init_tracer_bmp ( HDC hdc );static int tracer_ch_number_draw(int ch, int mute, int lockflag);static int tracer_ch_program_draw ( int ch, int bank, int program, char *instrument, int mapID, int lockflag );static int tracer_velocity_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_velocity_draw_ex ( RECT *lprc, int vol, int vol_old, int max, int lockflag );static int tracer_volume_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_expression_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_pan_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_sustain_draw ( RECT *lprc, int vol, int lockflag );static int tracer_pitch_bend_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_mod_wheel_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_chorus_effect_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_reverb_effect_draw ( RECT *lprc, int vol, int max, int lockflag );static int tracer_temper_keysig_draw(RECT *lprc, int8 tk, int ko, int lockflag);static int tracer_temper_type_draw(RECT *lprc, int ch, int8 tt, int lockflag);static int tracer_gm_draw ( RECT *lprc, int flag, int lockflag );static int tracer_gs_draw ( RECT *lprc, int flag, int lockflag );static int tracer_xg_draw ( RECT *lprc, int flag, int lockflag );static int notes_view_generate ( int lockflag );// ****************************************************************************// lock#if 0static int tracer_lock_result;#define TRACER_LOCK_EX(timeout) ( \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "TRACER_LOCK_EX(%s: %d)", __FILE__, __LINE__ ), \ tracer_lock_result = tracer_lock_ex(timeout), \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "TRACER_LOCK_EX_RESULT(%d)", tracer_lock_result ), \ tracer_wnd_lock_result \)#define TRACER_LOCK() { \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "TRACER_LOCK(%s: %d)", __FILE__, __LINE__ ); \ tracer_wnd_lock(); \}#define TRACER_UNLOCK() { \ ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "TRACER_UNLOCK(%s: %d)", __FILE__, __LINE__ ); \ tracer_wnd_unlock(); \}#else#define TRACER_LOCK() { tracer_wnd_lock(); }#define TRACER_LOCK_EX(timeout) tracer_wnd_lock_ex(timeout)#define TRACER_UNLOCK() { tracer_wnd_unlock(); }#endifstatic HANDLE volatile hMutexWrd = NULL;static BOOL tracer_wnd_lock_ex ( DWORD timeout ){ if ( hMutexWrd == NULL ) { hMutexWrd = CreateMutex ( NULL, FALSE, NULL ); if ( hMutexWrd == NULL ) return FALSE; } if ( WaitForSingleObject ( hMutexWrd, timeout )== WAIT_FAILED ) { return FALSE; } return TRUE;}static BOOL tracer_wnd_lock (void){ return tracer_wnd_lock_ex ( INFINITE );}static void tracer_wnd_unlock (void){ ReleaseMutex ( hMutexWrd );}// ****************************************************************************// Tracer WindowTRACERWNDINFO TracerWndInfo;static int TracerWndInfoReset(HWND hwnd);static int TracerWndInfoApply(void);w32g_tracer_wnd_t w32g_tracer_wnd;BOOL SetTracerWndActive(void){ if ( IsWindowVisible(hTracerWnd) ) { w32g_tracer_wnd.active = TRUE; } else { w32g_tracer_wnd.active = FALSE; } return w32g_tracer_wnd.active;}BOOL CALLBACK TracerWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);BOOL CALLBACK TracerCanvasWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);void InitTracerWnd(HWND hParentWnd){ WNDCLASS wndclass ; int height, space; RECT rc, rc2; HICON hIcon; static int init = 1; if ( init ) { w32g_tracer_wnd.hNullBrush = GetStockObject ( NULL_BRUSH ); w32g_tracer_wnd.hNullPen = GetStockObject ( NULL_PEN ); init = 0; } if (hTracerWnd != NULL) { TRACER_LOCK(); DestroyWindow(hTracerWnd); hTracerWnd = NULL; DeleteObject ( (HGDIOBJ)w32g_tracer_wnd.hFontCommon ); DeleteObject ( (HGDIOBJ)w32g_tracer_wnd.hFontHalf ); DeleteDC ( w32g_tracer_wnd.hmdc ); TRACER_UNLOCK(); } w32g_tracer_wnd.active = FALSE; INILoadTracerWnd(); hTracerWnd = CreateDialog (hInst,MAKEINTRESOURCE(IDD_DIALOG_TRACER),hParentWnd,TracerWndProc); TracerWndInfoReset(hTracerWnd); ShowWindow(hTracerWnd,SW_HIDE); hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_TIMIDITY), IMAGE_ICON, 16, 16, 0); if (hIcon!=NULL) SendMessage(hTracerWnd,WM_SETICON,FALSE,(LPARAM)hIcon); INILoadTracerWnd(); w32g_tracer_wnd.font_common_height = 14; w32g_tracer_wnd.font_common_width = 0; SetRect ( &w32g_tracer_wnd.rc_head, 1, 2, 0, 0 ); SetRect ( &w32g_tracer_wnd.rc_all_channels, 1, 20 + 2, 0, 0 ); w32g_tracer_wnd.width = 2 + 880 + 2; w32g_tracer_wnd.height = 1 + 19 + 1 + (19 + 1) * 32 + 1; w32g_tracer_wnd.ch_height = 19; w32g_tracer_wnd.ch_space = 1; height = w32g_tracer_wnd.ch_height; space = w32g_tracer_wnd.ch_space;#if 0 SetRect ( &w32g_tracer_wnd.rc_current_time, 2, 1, 80, height ); SetRect ( &w32g_tracer_wnd.rc_tempo, 82, 1, 160, height ); SetRect ( &w32g_tracer_wnd.rc_master_volume, 162, 1, 200, height / 2 - 1 ); SetRect ( &w32g_tracer_wnd.rc_maxvoices, 162, height / 2 + 1, 200, height );#endif wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_CLASSDC; wndclass.lpfnWndProc = TracerCanvasWndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInst ; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(0,IDC_ARROW) ; wndclass.hbrBackground = w32g_tracer_wnd.hNullBrush; wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "tracer canvas wnd"; RegisterClass(&wndclass); w32g_tracer_wnd.hwnd = CreateWindowEx(0,"tracer canvas wnd",0,WS_CHILD, CW_USEDEFAULT,0,w32g_tracer_wnd.width,w32g_tracer_wnd.height, hTracerWnd,0,hInst,0); w32g_tracer_wnd.hdc = GetDC(w32g_tracer_wnd.hwnd); TRACER_LOCK(); SelectObject ( w32g_tracer_wnd.hdc, w32g_tracer_wnd.hNullBrush ); SelectObject ( w32g_tracer_wnd.hdc, w32g_tracer_wnd.hNullPen ); w32g_tracer_wnd.hbitmap = CreateCompatibleBitmap(w32g_tracer_wnd.hdc,w32g_tracer_wnd.width,w32g_tracer_wnd.height); w32g_tracer_wnd.hmdc = CreateCompatibleDC(w32g_tracer_wnd.hdc); w32g_tracer_wnd.hgdiobj_hmdcprev = SelectObject(w32g_tracer_wnd.hmdc,w32g_tracer_wnd.hbitmap); SelectObject ( w32g_tracer_wnd.hmdc, w32g_tracer_wnd.hNullBrush ); SelectObject ( w32g_tracer_wnd.hmdc, w32g_tracer_wnd.hNullPen ); TRACER_UNLOCK(); init_tracer_bmp ( w32g_tracer_wnd.hdc ); ReleaseDC(w32g_tracer_wnd.hwnd,w32g_tracer_wnd.hdc); { char fontname[128]; if ( PlayerLanguage == LANGUAGE_JAPANESE ) strcpy(fontname,"俵俽 俹柧挬"); else { strcpy(fontname,"Arial"); w32g_tracer_wnd.font_common_height = 16; } w32g_tracer_wnd.hFontCommon = CreateFont(w32g_tracer_wnd.font_common_height,w32g_tracer_wnd.font_common_width,0,0,FW_DONTCARE,FALSE,FALSE,FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_MODERN ,fontname); w32g_tracer_wnd.hFontHalf = CreateFont(-10,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_MODERN ,"Courier"); } TracerWndReset(); SetRect(&w32g_tracer_wnd.rc_channel_top, 1, 0, 20, height); SetRect(&w32g_tracer_wnd.rc_instrument, 21, 0, 179, height); SetRect(&w32g_tracer_wnd.rc_inst_map, 180, 0, 233, height); SetRect(&w32g_tracer_wnd.rc_bank, 234, 0, 264, height); SetRect(&w32g_tracer_wnd.rc_program, 265, 0, 295, height); SetRect(&w32g_tracer_wnd.rc_velocity, 296, 0, 326, height); SetRect(&w32g_tracer_wnd.rc_volume, 327, 0, 347, height / 2); SetRect(&w32g_tracer_wnd.rc_expression, 327, height / 2 + 1, 347, height); SetRect(&w32g_tracer_wnd.rc_panning, 348, 0, 368, height / 2); SetRect(&w32g_tracer_wnd.rc_sustain, 348, height / 2 + 1, 368, height); SetRect(&w32g_tracer_wnd.rc_pitch_bend, 369, 0, 389, height / 2); SetRect(&w32g_tracer_wnd.rc_mod_wheel, 369, height / 2 + 1, 389, height); SetRect(&w32g_tracer_wnd.rc_chorus_effect, 390, 0, 410, height / 2); SetRect(&w32g_tracer_wnd.rc_reverb_effect, 390, height / 2 + 1, 410, height); SetRect(&w32g_tracer_wnd.rc_temper_keysig, 411, 0, 444, height); SetRect(&w32g_tracer_wnd.rc_gm, 445, 0, 469, height); SetRect(&w32g_tracer_wnd.rc_gs, 470, 0, 494, height); SetRect(&w32g_tracer_wnd.rc_xg, 495, 0, 519, height); SetRect(&w32g_tracer_wnd.rc_head_rest, 520, 0, 890, height); SetRect(&w32g_tracer_wnd.rc_temper_type, 411, 0, 430, height); SetRect(&w32g_tracer_wnd.rc_notes, 431, 0, 890, height); GetWindowRect ( hTracerWnd, &rc ); GetClientRect ( hTracerWnd, &rc2 ); rc.left = rc.left; rc.top = rc.top;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -