他人の空似自作物置場

DXLibGameSettingDialog.zip/src/window.h


#pragma once

#include "consts.h"
#include "resource.h"
#include <atlbase.h>
#include <atlapp.h>
#include <atlwin.h>
#include <atlcrack.h>
#include <atlctrls.h>
#include <atlmisc.h>
#include <atldlgs.h>
#include <atlctrlx.h>
#include <DxLib.h>
#include <math.h>

class CGameConfigTab : public CPropertyPageImpl<CGameConfigTab>
{
public:
	enum { IDD = IDD_GAMECONFIG };

	CSortListViewCtrl list_view;
	CButton bgm_on;
	CStatic bgm_per;
	CTrackBarCtrl bgm_vol;
	CButton se_on;
	CStatic se_per;
	CButton effect_on;
	CTrackBarCtrl se_vol;
	CButton exec_bt;

	int mh;//現在再生中のサウンドハンドル

	BEGIN_MSG_MAP(CGameConfigTab)
		MSG_WM_INITDIALOG(OnInitDialog)
		CHAIN_MSG_MAP(CPropertyPageImpl<CGameConfigTab>)
        	COMMAND_ID_HANDLER_EX(IDC_BGMON, OnVolumeChange)
        	COMMAND_ID_HANDLER_EX(IDC_SEON, OnVolumeChange)
		MSG_WM_HSCROLL(OnVolumeChange)
        	COMMAND_ID_HANDLER_EX(IDC_EFFECT, OnChange)
        	NOTIFY_HANDLER_EX(IDC_SOUNDLIST, NM_DBLCLK, OnListDblClick)
		NOTIFY_HANDLER_EX(IDC_SOUNDLIST, LVN_ITEMCHANGED, OnSelect)
        	COMMAND_ID_HANDLER_EX(IDC_PLAY, OnPlay)
	END_MSG_MAP()

	BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
		mh = -1;

		bgm_on = GetDlgItem(IDC_BGMON);
		bgm_per = GetDlgItem(IDC_BGMPER);
		bgm_vol = GetDlgItem(IDC_BGMVOLUME);
		se_on = GetDlgItem(IDC_SEON);
		se_per = GetDlgItem(IDC_SEPER);
		se_vol = GetDlgItem(IDC_SEVOLUME);
		effect_on = GetDlgItem(IDC_EFFECT);
		exec_bt = GetDlgItem(IDC_PLAY);

		bgm_on.SetCheck(BST_CHECKED);
		bgm_vol.SetRange(1,255,TRUE);
		bgm_vol.SetPos(255);
		se_on.SetCheck(BST_CHECKED);
		se_vol.SetRange(1,255,TRUE);
		se_vol.SetPos(255);
		effect_on.SetCheck(BST_CHECKED);
		ReadSetting();
		UpdateVolume();

        	list_view.SubclassWindow(GetDlgItem(IDC_SOUNDLIST));
		list_view.SetExtendedListViewStyle(list_view.GetExtendedListViewStyle() | LVS_EX_FULLROWSELECT);
		{
			CRect rcList;
			list_view.GetWindowRect(rcList);
			int nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
			int n3DEdge = GetSystemMetrics(SM_CXEDGE);
			int width[1] = {0};
			CString name[1] = {"曲名"};
			width[0] = rcList.Width() - nScrollWidth - n3DEdge * 2;
			int i=0;
			while(i < 1){
				list_view.InsertColumn(i, name[i], LVCFMT_LEFT, width[i], -1);
				list_view.SetColumnSortType(i, LVCOLSORT_TEXT);
				i++;
			}
		}
		set_listview();
		return TRUE;
	}

	int set_listview(void){
		list_view.DeleteAllItems();
		int finfo = FileRead_createInfo(BGM_FOLDER "\\*");
		if(finfo==-1){
			return 0;
		}
		FILEINFO fi;
		int num = FileRead_getInfoNum(finfo);
		int i = 0;
		while(i < num){
			FileRead_getInfo(i, &fi,finfo);
			{
				char *s,*t;
				s = strstr(fi.Name,".");
				while(NULL != (t=strstr(s+1,"."))){
					s = t;
				}
				if(s==NULL || strcmp(s+1,BGM_EXT)!=0){
					i++;
					continue;
				}
				*s = '\0';
			}
			list_view.AddItem(list_view.GetItemCount(), 0, fi.Name);
			i++;
		}
		OnSelect(NULL);
		FileRead_deleteInfo(finfo);
		return list_view.GetItemCount();
	}
	void Play(){
		int pos = list_view.GetSelectedIndex();
		if(pos==-1){
			return;
		}
		char path[256]= BGM_FOLDER "\\";
		list_view.GetItemText(list_view.GetSelectedIndex(),0,&path[strlen(path)],sizeof(path)-strlen(path));
		strcat(path,"." BGM_EXT);
		if(mh!=-1){
			DeleteSoundMem(mh);
		}
		if(-1 == (mh=LoadSoundMem(path))){
			MessageBox("ファイルの読み込みに失敗しました","エラー",MB_ICONERROR);
			return;
		}
		ChangeVolumeSoundMem(GetBGMVolume(),mh);
		PlaySoundMem(mh,DX_PLAYTYPE_LOOP);
	}
	void UpdateVolume(){
		char temp[256];
		int per = static_cast<int>(ceil(GetBGMVolume()/2.55));
		sprintf(temp,"%3d%%",per);
		bgm_per.SetWindowText(temp);
		if(mh!=-1){
			ChangeVolumeSoundMem(GetBGMVolume(),mh);
		}
		if(per==0){
			bgm_vol.EnableWindow(FALSE);
		} else {
			bgm_vol.EnableWindow(TRUE);
		}
		per = static_cast<int>(ceil(GetSEVolume()/2.55));
		sprintf(temp,"%3d%%",per);
		se_per.SetWindowText(temp);
		if(per==0){
			se_vol.EnableWindow(FALSE);
		} else {
			se_vol.EnableWindow(TRUE);
		}
	}
	void OnVolumeChange(UINT nSBCode, UINT nPos, CTrackBarCtrl pTrackBar){
		SetModified(TRUE);
		UpdateVolume();
	}
	void OnVolumeChange(UINT uNotifyCode, int nID, CWindow wndCtl){
		SetModified(TRUE);
		UpdateVolume();
	}
	void OnChange(UINT uNotifyCode, int nID, CWindow wndCtl){
		SetModified(TRUE);
	}
	LRESULT OnListDblClick(LPNMHDR pnmh){
		Play();
		return 0;
	}
	LRESULT OnSelect(LPNMHDR pnmh){
		int pos = list_view.GetSelectedIndex();
		if(pos==-1){
			exec_bt.EnableWindow(FALSE);
		} else {
			exec_bt.EnableWindow(TRUE);
		}
		return 0;
	}
	void OnPlay(UINT uNotifyCode, int nID, CWindow wndCtl){
		Play();
	}
	int GetBGMVolume(){
		if(bgm_on.GetCheck()!=BST_CHECKED){
			return 0;
		}
		return bgm_vol.GetPos();
	}
	int GetSEVolume(){
		if(se_on.GetCheck()!=BST_CHECKED){
			return 0;
		}
		return se_vol.GetPos();
	}
	void ReadSetting(){
		FILE *fp = fopen(SETTING_FILE,"rb");
		if(fp==NULL){
			return;
		}
		DWORD value[3];
		fread(value,4,3,fp);
		fclose(fp);
		if(value[0]<1 || value[0]>255){
			bgm_on.SetCheck(BST_UNCHECKED);
			bgm_vol.SetPos(0);
		} else {
			bgm_on.SetCheck(BST_CHECKED);
			bgm_vol.SetPos(value[0]);
		}
		if(value[1]<1 || value[1]>255){
			se_on.SetCheck(BST_UNCHECKED);
			se_vol.SetPos(0);
		} else {
			se_on.SetCheck(BST_CHECKED);
			se_vol.SetPos(value[1]);
		}
		if(value[2]==0){
			effect_on.SetCheck(BST_UNCHECKED);
		} else {
			effect_on.SetCheck(BST_CHECKED);
		}
	}
	BOOL OnApply(){
		FILE *fp = fopen(SETTING_FILE,"wb");
		if(fp==NULL){
			MessageBox("設定が保存できません","エラー",MB_ICONERROR);
			return FALSE;
		}
		{
			DWORD vol = GetBGMVolume();
			fwrite(&vol,1,4,fp);
			vol = GetSEVolume();
			fwrite(&vol,1,4,fp);
		}
		{
			DWORD eff;
			if(effect_on.GetCheck()==BST_CHECKED){
				eff = 1;
			} else {
				eff = 0;
			}
			fwrite(&eff,1,4,fp);
		}
		fclose(fp);
		return TRUE;
	}
};

class CConfigDialog : public CPropertySheetImpl<CConfigDialog>
{
public:
	CGameConfigTab game;

	// コンストラクタ
	CConfigDialog(ATL::_U_STRINGorID title = _T("設定"),
		UINT uStartPage = 0, HWND hWndParent = NULL)
			: CPropertySheetImpl<CConfigDialog>(title, uStartPage, hWndParent)
	{
		AddPage(game);
		m_psh.dwFlags |= PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP;
	}

	BEGIN_MSG_MAP_EX(CConfigDialog)
		CHAIN_MSG_MAP(CPropertySheetImpl<CConfigDialog>)
	END_MSG_MAP()
};