📄 win_cfg.c
字号:
case WM_CLOSE:
iPage = TabCtrl_GetCurSel(g_hWndTabControl);
switch (iPage)
{
case 0:
hide_video_config_page(hWndConfigWindow);
break;
case 1:
hide_audio_config_page(hWndConfigWindow);
break;
case 2:
break;
}
if (DestroyWindow(g_hDlg))
g_hDlg=0;
apply_new_cfg_settings();
EnableWindow(hWnd,TRUE);
DestroyWindow(hWndConfigWindow);
cur_dialog_box=hWndConfigWindow=NULL;
SetForegroundWindow(hWnd);
suspend_game=FALSE;
hide_mouse_cursor();
if (!g_bWindowed)
{
release_clipper();
gpal(cur_palette);
}
resume_windows_sound_playback();
InvalidateRect(hWnd, NULL, FALSE);
UpdateWindow(hWnd);
return 0;
}
return DefWindowProc(hWndConfigWindow, message, wParam, lParam);
}
LRESULT CALLBACK ConfigTabDlgWndProc (HWND hWndPage, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND control;
switch(message)
{
case WM_KEYDOWN:
return DefWindowProc(hWndPage, message, wParam, lParam);
case WM_SIZE:
//GetClientRect(g_hWndTabControl,&tempRect);
//TabCtrl_AdjustRect(g_hWndTabControl,FALSE, &tempRect);
MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,FALSE);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON_BIND_SELECT:
control = GetDlgItem(hWndPage, IDC_LIST_KEY_ASSIGNMENTS);
cur_key_map_idx=ListBox_GetCurSel(control);
if (cur_key_map_idx<0)
cur_key_map_idx=0;
do_dialog_box(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG_SELECT_KEY),
hWndPage, (DLGPROC) bind_key_from_list_dialog_proc);
load_mapped_key_list(GetDlgItem(g_hDlg, IDC_LIST_KEY_ASSIGNMENTS));
return TRUE;
}
}
return DefWindowProc(hWndPage, message, wParam, lParam);
}
extern bool started;
void init_video_config_page(HWND hWndTabControl)
{
HWND control;
char strbuf[40];
struct FULLSCREEN_VID_MODE_INFO* vmode;
//RECT tempRect;
g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_VIDEO),g_hWndTabControl,ConfigTabDlgWndProc);
if (g_hDlg)
{
//MoveWindow(g_hDlg,0,30,300,200,TRUE);
control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
vmode=supported_video_modes;
while (vmode!=NULL)
{
sprintf(strbuf,"%d x %d (%d bit)",vmode->width,vmode->height,vmode->bpp);
ComboBox_AddString(control, strbuf);
vmode=vmode->next_mode;
}
ComboBox_SetCurSel(control, cfg.video.preferred_video_mode_index - 1 );
control = GetDlgItem(g_hDlg,IDC_COMBO_GAME_GRAPHICS);
ComboBox_AddString(control, "CGA (Original)");
ComboBox_AddString(control, "VGA (Digger Remastered)");
ComboBox_SetCurSel(control, cfg.video.graphics_mode );
EnableWindow(control, !started);
control = GetDlgItem(g_hDlg,IDC_CHECK_USE_ASYNC);
Button_SetCheck(control,cfg.video.use_async_updates ? 1 : 0);
control = GetDlgItem(g_hDlg,IDC_CHECK_USE_DIRECTDRAW);
Button_SetCheck(control,cfg.video.use_directdraw ? 1 : 0);
MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,TRUE);
ShowWindow(g_hDlg,SW_SHOW);
if (GetFocus() != g_hWndTabControl)
SetFocus(g_hDlg);
}
else
fatal_error(0,"init_video_config_page() failed");
}
void init_audio_config_page(HWND hWndTabControl)
{
HWND control;
char strbuf[20];
g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_AUDIO),g_hWndTabControl,ConfigTabDlgWndProc);
if (g_hDlg)
{
MoveWindow(g_hDlg,0,30,300,200,TRUE);
control = GetDlgItem(g_hDlg,IDC_COMBO_AUDIO_DEVICE);
ComboBox_AddString(control, "[Disabled");
ComboBox_AddString(control, "Use DirectSound");
ComboBox_AddString(control, "Use Wave Out");
ComboBox_SetCurSel(control,cfg.audio.output_device);
itoa(cfg.audio.buffer_size,strbuf,10);
SetDlgItemText(g_hDlg,IDC_EDIT_BUFFER_SIZE, strbuf);
itoa(cfg.audio.freq,strbuf,10);
SetDlgItemText(g_hDlg,IDC_EDIT_SAMPLE_RATE, strbuf);
control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_MUSIC);
Button_SetCheck(control,cfg.audio.play_music);
control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_SOUNDS);
Button_SetCheck(control,cfg.audio.play_sounds);
control = GetDlgItem(g_hDlg,IDC_SLIDER_VOLUME);
SendMessage(control, TBM_SETRANGEMAX, (WPARAM) FALSE, 100);
SendMessage(control, TBM_SETRANGEMIN, (WPARAM) FALSE, 0);
SendMessage(control, TBM_SETPOS, (WPARAM) TRUE, 100 - cfg.audio.volume);
ShowWindow(g_hDlg,SW_SHOW);
if (GetFocus() != g_hWndTabControl)
SetFocus(g_hDlg);
}
else
fatal_error(0,"init_audio_config_page() failed");
}
extern char *keynames[];
void load_mapped_key_list(HWND control)
{
SIZE sz;
int max_text_width=0;
HDC dc;
int i;
int list_size;
struct KEY_MAPPINGS_STRUCT *next;
char strbuf[200];
while (ListBox_GetCount(control))
ListBox_DeleteString(control,0);
dc = GetDC(control);
for (i=0;i<19;i++)
{
if (i<5)
sprintf(strbuf,"Player1 %s:\t",keynames[i]);
else
{
if (i<10)
sprintf(strbuf,"Player2 %s\t",keynames[i]);
else
sprintf(strbuf,"%s:\t",keynames[i]);
}
if (key_mappings[i])
{
strcat(strbuf,get_key_name(key_mappings[i]->key_code));
next = key_mappings[i]->next;
while (next)
{
strcat(strbuf,", ");
strcat(strbuf,get_key_name(next->key_code));
next=next->next;
}
}
else
strcat(strbuf,"(no key assigned)");
GetTextExtentPoint32(dc,strbuf,strlen(strbuf),&sz);
if (sz.cx>max_text_width)
max_text_width=sz.cx;
ListBox_AddString(control,strbuf);
}
ReleaseDC(control,dc);
ListBox_SetHorizontalExtent(control,max_text_width);
}
void init_input_config_page(HWND hWndTabControl)
{
HWND control;
int i;
int tabstops[1]={64};
//RECT tempRect;
g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_INPUT),g_hWndTabControl,ConfigTabDlgWndProc);
if (g_hDlg)
{
MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,TRUE);
control = GetDlgItem(g_hDlg, IDC_LIST_KEY_ASSIGNMENTS);
ListBox_SetTabStops(control,1,tabstops);
load_mapped_key_list(control);
ShowWindow(g_hDlg,SW_SHOW);
if (GetFocus() != g_hWndTabControl)
SetFocus(g_hDlg);
}
else
fatal_error(0,"init_input_config_page() failed");
}
void hide_video_config_page(HWND hWndTabControl)
{
HWND control;
control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
cfg.video.hardware_video_mode = (ComboBox_GetCurSel(control)==1);
control = GetDlgItem(g_hDlg,IDC_COMBO_GAME_GRAPHICS);
cfg.video.graphics_mode = ComboBox_GetCurSel(control);
control = GetDlgItem(g_hDlg,IDC_CHECK_USE_ASYNC);
cfg.video.use_async_updates = Button_GetCheck(control);
control = GetDlgItem(g_hDlg,IDC_CHECK_USE_DIRECTDRAW);
cfg.video.use_directdraw = Button_GetCheck(control);
control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
cfg.video.preferred_video_mode_index=ComboBox_GetCurSel(control)+1;
}
void hide_audio_config_page(HWND hWndTabControl)
{
char strbuf[20];
HWND control;
if (GetDlgItemText(g_hDlg,IDC_EDIT_BUFFER_SIZE,strbuf,20))
cfg.audio.buffer_size = atoi(strbuf);
if (GetDlgItemText(g_hDlg,IDC_EDIT_SAMPLE_RATE,strbuf,20))
cfg.audio.freq = atoi(strbuf);
control = GetDlgItem(g_hDlg,IDC_COMBO_AUDIO_DEVICE);
cfg.audio.output_device = ComboBox_GetCurSel(control);
control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_MUSIC);
cfg.audio.play_music = Button_GetCheck(control);
control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_SOUNDS);
cfg.audio.play_sounds = Button_GetCheck(control);
control = GetDlgItem(g_hDlg,IDC_SLIDER_VOLUME);
cfg.audio.volume = 100 - SendMessage(control, TBM_GETPOS, 0, 0);
}
void hide_input_config_page(HWND hWndTabControl)
{
}
void retrieve_current_cfg_settings()
{
struct FULLSCREEN_VID_MODE_INFO* vmode;
int i,preferred_vid_mode_index;
cfg.audio.buffer_size = size / 2;
cfg.audio.disabled = FALSE;
cfg.audio.freq = get_sound_freq();
cfg.audio.play_music = musicflag;
cfg.audio.play_sounds = soundflag;
cfg.audio.volume = dx_sound_volume;
cfg.audio.output_device = sound_output_device;
cfg.game.speed = ftime;
cfg.video.hardware_video_mode = use_640x480_fullscreen;
cfg.video.use_async_updates = use_async_screen_updates;
cfg.video.use_directdraw = use_direct_draw;
cfg.video.graphics_mode = video_mode;
preferred_vid_mode_index=0;
vmode=supported_video_modes;
i=1;
while (vmode!=NULL)
{
if (vmode->width==preferred_video_mode.width &&
vmode->height==preferred_video_mode.height &&
vmode->bpp==preferred_video_mode.bpp)
preferred_vid_mode_index=i;
if (!preferred_vid_mode_index && vmode->width==640 && vmode->height>=400) // if nothing in the list matches the preferred mode, then select a mode 640x400 or 640x480
preferred_vid_mode_index=i;
vmode=vmode->next_mode;
i++;
}
cfg.video.preferred_video_mode_index = preferred_vid_mode_index;
}
void apply_new_cfg_settings()
{
struct FULLSCREEN_VID_MODE_INFO* vmode;
int i,preferred_vid_mode_index;
release_sound_card();
if ((cfg.audio.buffer_size!=size / 2) && (cfg.audio.buffer_size > 0))
{
sound_length = size = cfg.audio.buffer_size * 2;
}
if ((cfg.audio.freq!=sound_rate) && (cfg.audio.freq > 0))
{
sound_rate=cfg.audio.freq;
}
if (cfg.audio.output_device != sound_output_device)
{
sound_output_device=cfg.audio.output_device;
}
vmode=supported_video_modes;
for (i=1;i<cfg.video.preferred_video_mode_index;i++)
{
vmode=vmode->next_mode;
}
if (vmode->width != preferred_video_mode.width ||
vmode->height != preferred_video_mode.height ||
vmode->bpp != preferred_video_mode.bpp)
set_preferred_vidmode(vmode->width,vmode->height,vmode->bpp);
if (video_mode!=cfg.video.graphics_mode)
change_graphics_routines(cfg.video.graphics_mode);
capture_sound_card();
set_sound_volume(dx_sound_volume = cfg.audio.volume);
musicflag = cfg.audio.play_music;
soundflag = cfg.audio.play_sounds;
store_mapped_keys();
}
char* get_key_name(int code)
{
int i;
for (i=0;i<(sizeof(key_list)/sizeof(key_list[0]));i++)
{
if (code == key_list[i].key_code)
return key_list[i].key_name;
}
return UNKNOWN_KEY_NAME;
}
int translate_key_code_to_function(int code)
{
int i;
for (i=10;i<19;i++)
{
if (is_key_bound(code,i))
return i+1;
}
return 0;
}
BOOL is_key_bound(int key_code, int function)
{
struct KEY_MAPPINGS_STRUCT *cur;
cur=key_mappings[function];
while (cur)
{
if (cur->key_code==key_code)
return TRUE;
cur=cur->next;
}
return FALSE;
}
/* checks to see if any of the keys mapped to a specific function have been preseed. */
BOOL key_pressed(int function,BOOL check_current_state_only)
{
struct KEY_MAPPINGS_STRUCT *cur;
SHORT keystate;
cur=key_mappings[function];
while (cur)
{
keystate=GetAsyncKeyState(cur->key_code);
if (check_current_state_only)
keystate=keystate & 0x8000;
if (keystate)
return TRUE;
cur=cur->next;
}
return FALSE;
}
void clear_mapped_keys(int idx)
{
struct KEY_MAPPINGS_STRUCT *cur,*prev;
/* remove existing keys mapped to this function */
cur=key_mappings[idx];
key_mappings[idx]=NULL;
while (cur)
{
prev=cur;
cur=cur->next;
farfree(prev);
}
}
void add_mapped_key(int idx, int key_code)
{
struct KEY_MAPPINGS_STRUCT *cur;
if (!key_code) //if not a valid Virtual Key Code then return
return;
if (key_mappings[idx])
{
cur=key_mappings[idx];
while (cur->next)
{
cur=cur->next;
}
cur->next=malloc(sizeof(struct KEY_MAPPINGS_STRUCT));
cur=cur->next;
cur->key_code = key_code;
cur->next = NULL;
}
else
{
cur=key_mappings[idx]=malloc(sizeof(struct KEY_MAPPINGS_STRUCT));
cur->key_code = key_code;
cur->next=NULL;
}
}
void store_mapped_keys()
{
int i;
char kbuf[80],vbuf[256];
char tempnum[32];
struct KEY_MAPPINGS_STRUCT *cur;
for (i=0;i<SIZEOF_KEY_MAPPINGS_LIST;i++)
{
cur=key_mappings[i];
sprintf(kbuf,"%s%c",keynames[i],(i>=5 && i<10) ? '2' : 0);
vbuf[0]='\0';
while (cur)
{
strcat(vbuf,itoa(cur->key_code,tempnum,10));
cur=cur->next;
if (cur)
strcat(vbuf,"/");
}
WriteINIString(INI_KEY_SETTINGS,kbuf,vbuf,ININAME);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -