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()
};