preference.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include "preference.h"
  2. #include "../resource/resource.h"
  3. #include <shlobj.h>
  4. #define INIFILE TEXT("mmage.ini")
  5. #define INIFILE_SECTION TEXT("MMAGE")
  6. #define INIFILE_KEY_VIEWSIZE TEXT("VIEWSIZE")
  7. #define INIFILE_KEY_HORIZONTAL TEXT("HORIZONTAL")
  8. #define INIFILE_KEY_QUERYARG TEXT("QUERYARG")
  9. #define INIFILE_KEY_ARGUMENT TEXT("ARGUMENT")
  10. #define INIFILE_KEY_ROM0DIR TEXT("ROM0DIR")
  11. #define INIFILE_KEY_RAM0DIR TEXT("RAM0DIR")
  12. #define INIFILE_KEY_OWNER_NAME TEXT("OWNER_NAME")
  13. #define INIFILE_KEY_OWNER_BYEAR TEXT("OWNER_BYEAR")
  14. #define INIFILE_KEY_OWNER_BMONTH TEXT("OWNER_BMONTH")
  15. #define INIFILE_KEY_OWNER_BDAY TEXT("OWNER_BDAY")
  16. #define INIFILE_KEY_OWNER_SEX TEXT("OWNER_SEX")
  17. #define INIFILE_KEY_OWNER_BLOOD TEXT("OWNER_BLOOD")
  18. static MMAGE_CONFIG mmconfig_struct;
  19. LPMMAGE_CONFIG mmconfig = &mmconfig_struct;
  20. static LRESULT CALLBACK RunningEnvDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  21. static LRESULT CALLBACK FileSystemDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  22. static LRESULT CALLBACK OwnerInfoDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  23. static BOOL SelectFolder(HWND hWnd, LPCTSTR title, LPTSTR path);
  24. #define NUM_DLG 3
  25. static LPCTSTR dlgtmp[NUM_DLG] = {
  26. (LPCTSTR)IDD_RUNNINGENV,
  27. (LPCTSTR)IDD_FILESYS,
  28. (LPCTSTR)IDD_OWNERINFO,
  29. };
  30. static DLGPROC dlgproc[NUM_DLG] = {
  31. (DLGPROC)RunningEnvDlgProc,
  32. (DLGPROC)FileSystemDlgProc,
  33. (DLGPROC)OwnerInfoDlgProc,
  34. };
  35. void OpenPreferenceDlg() {
  36. PROPSHEETPAGE psp;
  37. PROPSHEETHEADER psh;
  38. HPROPSHEETPAGE hpsp[NUM_DLG];
  39. int i;
  40. psp.dwSize = sizeof(psp);
  41. psp.dwFlags = PSP_DEFAULT;
  42. psp.hInstance = wonw32ctx->hInst;
  43. for(i = 0; i < NUM_DLG; i++) {
  44. psp.pszTemplate = dlgtmp[i];
  45. psp.pfnDlgProc = dlgproc[i];
  46. hpsp[i] = CreatePropertySheetPage(&psp);
  47. }
  48. memset(&psh, 0, sizeof(psh));
  49. psh.dwSize = sizeof(psh);
  50. psh.dwFlags = PSH_NOAPPLYNOW;
  51. psh.hInstance = wonw32ctx->hInst;
  52. psh.hwndParent = wonw32ctx->hWnd;
  53. psh.nPages = NUM_DLG;
  54. psh.phpage = hpsp;
  55. psh.pszCaption = TEXT("設定");
  56. PropertySheet(&psh);
  57. return;
  58. }
  59. static LRESULT CALLBACK RunningEnvDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
  60. int wmId, wmEvent;
  61. LPNMHDR nmhdr;
  62. BOOL handled = TRUE;
  63. switch(message) {
  64. case WM_INITDIALOG:
  65. CheckDlgButton(hDlg, IDC_QUERYARG, mmconfig->queryarg);
  66. EnableWindow(GetDlgItem(hDlg, IDC_ARGUMENT), !mmconfig->queryarg);
  67. SetWindowText(GetDlgItem(hDlg, IDC_ARGUMENT), mmconfig->argument);
  68. break;
  69. case WM_COMMAND:
  70. wmId = LOWORD(wParam);
  71. wmEvent = HIWORD(wParam);
  72. switch(wmId) {
  73. case IDC_QUERYARG:
  74. EnableWindow(GetDlgItem(hDlg, IDC_ARGUMENT), !IsDlgButtonChecked(hDlg, IDC_QUERYARG));
  75. break;
  76. default:
  77. handled = FALSE;
  78. break;
  79. }
  80. break;
  81. case WM_NOTIFY:
  82. nmhdr = (NMHDR *)lParam;
  83. switch(nmhdr->code) {
  84. case PSN_APPLY:
  85. mmconfig->queryarg = IsDlgButtonChecked(hDlg, IDC_QUERYARG);
  86. GetWindowText(GetDlgItem(hDlg, IDC_ARGUMENT), mmconfig->argument, MAX_WW_ARG);
  87. break;
  88. default:
  89. handled = FALSE;
  90. break;
  91. }
  92. break;
  93. default:
  94. handled = FALSE;
  95. break;
  96. }
  97. return handled;
  98. }
  99. static LRESULT CALLBACK FileSystemDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
  100. int wmId, wmEvent;
  101. LPNMHDR nmhdr;
  102. TCHAR dirname[MAX_PATH + 1];
  103. BOOL specifydir;
  104. BOOL handled = TRUE;
  105. switch(message) {
  106. case WM_INITDIALOG:
  107. specifydir = (lstrlen(mmconfig->rom0dir) && lstrlen(mmconfig->ram0dir)) ? TRUE : FALSE;
  108. CheckDlgButton(hDlg, IDC_SPECIFYDIR, specifydir);
  109. if(specifydir) {
  110. SetWindowText(GetDlgItem(hDlg, IDC_ROM0), mmconfig->rom0dir);
  111. SetWindowText(GetDlgItem(hDlg, IDC_RAM0), mmconfig->ram0dir);
  112. }
  113. EnableWindow(GetDlgItem(hDlg, IDC_ARGUMENT), specifydir);
  114. EnableWindow(GetDlgItem(hDlg, IDC_ROM0), specifydir);
  115. EnableWindow(GetDlgItem(hDlg, IDC_ROM0REF), specifydir);
  116. EnableWindow(GetDlgItem(hDlg, IDC_RAM0), specifydir);
  117. EnableWindow(GetDlgItem(hDlg, IDC_RAM0REF), specifydir);
  118. break;
  119. case WM_COMMAND:
  120. wmId = LOWORD(wParam);
  121. wmEvent = HIWORD(wParam);
  122. switch(wmId) {
  123. case IDC_SPECIFYDIR:
  124. EnableWindow(GetDlgItem(hDlg, IDC_ROM0), IsDlgButtonChecked(hDlg, IDC_SPECIFYDIR));
  125. EnableWindow(GetDlgItem(hDlg, IDC_ROM0REF), IsDlgButtonChecked(hDlg, IDC_SPECIFYDIR));
  126. EnableWindow(GetDlgItem(hDlg, IDC_RAM0), IsDlgButtonChecked(hDlg, IDC_SPECIFYDIR));
  127. EnableWindow(GetDlgItem(hDlg, IDC_RAM0REF), IsDlgButtonChecked(hDlg, IDC_SPECIFYDIR));
  128. break;
  129. case IDC_ROM0REF:
  130. if(SelectFolder(hDlg, TEXT("/rom0 ディレクトリの指定"), dirname))
  131. SetWindowText(GetDlgItem(hDlg, IDC_ROM0), dirname);
  132. break;
  133. case IDC_RAM0REF:
  134. if(SelectFolder(hDlg, TEXT("/ram0 ディレクトリの指定"), dirname))
  135. SetWindowText(GetDlgItem(hDlg, IDC_RAM0), dirname);
  136. break;
  137. default:
  138. handled = FALSE;
  139. break;
  140. }
  141. break;
  142. case WM_NOTIFY:
  143. nmhdr = (NMHDR *)lParam;
  144. switch(nmhdr->code) {
  145. case PSN_APPLY:
  146. specifydir = IsDlgButtonChecked(hDlg, IDC_SPECIFYDIR);
  147. if(specifydir) {
  148. if(GetWindowTextLength(GetDlgItem(hDlg, IDC_ROM0))
  149. && GetWindowTextLength(GetDlgItem(hDlg, IDC_RAM0))) {
  150. GetWindowText(GetDlgItem(hDlg, IDC_ROM0), mmconfig->rom0dir, MAX_PATH);
  151. GetWindowText(GetDlgItem(hDlg, IDC_RAM0), mmconfig->ram0dir, MAX_PATH);
  152. } else {
  153. MessageBox(hDlg, TEXT("/rom0、/ram0 のマッピングディレクトリを指定してください。"), NULL, MB_OK);
  154. SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
  155. break;
  156. }
  157. } else {
  158. lstrcpy(mmconfig->rom0dir, TEXT(""));
  159. lstrcpy(mmconfig->ram0dir, TEXT(""));
  160. }
  161. break;
  162. default:
  163. handled = FALSE;
  164. break;
  165. }
  166. break;
  167. default:
  168. handled = FALSE;
  169. break;
  170. }
  171. return handled;
  172. }
  173. static LRESULT CALLBACK OwnerInfoDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
  174. LPNMHDR nmhdr;
  175. SYSTEMTIME day;
  176. BOOL handled = TRUE;
  177. switch(message) {
  178. case WM_INITDIALOG:
  179. SetWindowText(GetDlgItem(hDlg, IDC_NAME), mmconfig->ownerinfo.name);
  180. ZeroMemory(&day, sizeof(day));
  181. day.wYear = mmconfig->ownerinfo.birth_year;
  182. day.wMonth = mmconfig->ownerinfo.birth_month;
  183. day.wDay = mmconfig->ownerinfo.birth_day;
  184. SendMessage(GetDlgItem(hDlg, IDC_BIRTHDAY), DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&day);
  185. switch(mmconfig->ownerinfo.sex) {
  186. case 0:
  187. CheckDlgButton(hDlg, IDC_UNKNOWNSEX, TRUE);
  188. break;
  189. case 1:
  190. CheckDlgButton(hDlg, IDC_MALE, TRUE);
  191. break;
  192. case 2:
  193. CheckDlgButton(hDlg, IDC_FEMALE, TRUE);
  194. break;
  195. default:
  196. CheckDlgButton(hDlg, IDC_UNKNOWNSEX, TRUE);
  197. break;
  198. }
  199. switch(mmconfig->ownerinfo.bloodtype) {
  200. case 0:
  201. CheckDlgButton(hDlg, IDC_UNKNOWNBLOOD, TRUE);
  202. break;
  203. case 1:
  204. CheckDlgButton(hDlg, IDC_BLOODA, TRUE);
  205. break;
  206. case 2:
  207. CheckDlgButton(hDlg, IDC_BLOODB, TRUE);
  208. break;
  209. case 3:
  210. CheckDlgButton(hDlg, IDC_BLOODO, TRUE);
  211. break;
  212. case 4:
  213. CheckDlgButton(hDlg, IDC_BLOODAB, TRUE);
  214. break;
  215. default:
  216. CheckDlgButton(hDlg, IDC_UNKNOWNBLOOD, TRUE);
  217. break;
  218. }
  219. break;
  220. case WM_NOTIFY:
  221. nmhdr = (NMHDR *)lParam;
  222. switch(nmhdr->code) {
  223. case PSN_APPLY:
  224. GetWindowText(GetDlgItem(hDlg, IDC_NAME), mmconfig->ownerinfo.name, 16);
  225. SendMessage(GetDlgItem(hDlg, IDC_BIRTHDAY), DTM_GETSYSTEMTIME, 0, (LPARAM)&day);
  226. mmconfig->ownerinfo.birth_year = day.wYear;
  227. mmconfig->ownerinfo.birth_month = (char)day.wMonth;
  228. mmconfig->ownerinfo.birth_day = (char)day.wDay;
  229. if(IsDlgButtonChecked(hDlg, IDC_UNKNOWNSEX))
  230. mmconfig->ownerinfo.sex = 0;
  231. else if(IsDlgButtonChecked(hDlg, IDC_MALE))
  232. mmconfig->ownerinfo.sex = 1;
  233. else if(IsDlgButtonChecked(hDlg, IDC_FEMALE))
  234. mmconfig->ownerinfo.sex = 2;
  235. if(IsDlgButtonChecked(hDlg, IDC_UNKNOWNBLOOD))
  236. mmconfig->ownerinfo.bloodtype = 0;
  237. else if(IsDlgButtonChecked(hDlg, IDC_BLOODA))
  238. mmconfig->ownerinfo.bloodtype = 1;
  239. else if(IsDlgButtonChecked(hDlg, IDC_BLOODB))
  240. mmconfig->ownerinfo.bloodtype = 2;
  241. else if(IsDlgButtonChecked(hDlg, IDC_BLOODO))
  242. mmconfig->ownerinfo.bloodtype = 3;
  243. else if(IsDlgButtonChecked(hDlg, IDC_BLOODAB))
  244. mmconfig->ownerinfo.bloodtype = 4;
  245. break;
  246. default:
  247. handled = FALSE;
  248. break;
  249. }
  250. break;
  251. default:
  252. handled = FALSE;
  253. break;
  254. }
  255. return handled;
  256. }
  257. static BOOL SelectFolder(HWND hWnd, LPCTSTR title, LPTSTR path) {
  258. BROWSEINFO binfo;
  259. LPITEMIDLIST idlist;
  260. binfo.hwndOwner = hWnd;
  261. binfo.pidlRoot = NULL;
  262. binfo.pszDisplayName = path;
  263. binfo.lpszTitle = title;
  264. binfo.ulFlags = BIF_RETURNONLYFSDIRS;
  265. binfo.lpfn = NULL;
  266. binfo.lParam = NULL;
  267. binfo.iImage = (int)NULL;
  268. idlist = SHBrowseForFolder(&binfo);
  269. if (idlist) {
  270. SHGetPathFromIDList(idlist,path);
  271. CoTaskMemFree(idlist);
  272. return TRUE;
  273. }
  274. return FALSE;
  275. }
  276. void LoadConfig() {
  277. TCHAR inifile[MAX_PATH + 1];
  278. wsprintf(inifile, TEXT("%s\\%s"), mmconfig->workingdir, INIFILE);
  279. mmconfig->viewsize = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_VIEWSIZE, 1, inifile);
  280. mmconfig->horizontal = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_HORIZONTAL, MMCONFIG_HORIZONTAL, inifile);
  281. mmconfig->queryarg = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_QUERYARG, TRUE, inifile);
  282. GetPrivateProfileString(INIFILE_SECTION, INIFILE_KEY_ROM0DIR, TEXT(""), mmconfig->rom0dir, MAX_PATH, inifile);
  283. GetPrivateProfileString(INIFILE_SECTION, INIFILE_KEY_RAM0DIR, TEXT(""), mmconfig->ram0dir, MAX_PATH, inifile);
  284. GetPrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_NAME, TEXT(""), mmconfig->ownerinfo.name, 16, inifile);
  285. mmconfig->ownerinfo.birth_year = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_OWNER_BYEAR, 1970, inifile);
  286. mmconfig->ownerinfo.birth_month = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_OWNER_BMONTH, 1, inifile);
  287. mmconfig->ownerinfo.birth_day = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_OWNER_BDAY, 1, inifile);
  288. mmconfig->ownerinfo.sex = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_OWNER_SEX, 0, inifile);
  289. mmconfig->ownerinfo.bloodtype = GetPrivateProfileInt(INIFILE_SECTION, INIFILE_KEY_OWNER_BLOOD, 0, inifile);
  290. }
  291. void SaveConfig() {
  292. TCHAR inifile[MAX_PATH + 1];
  293. TCHAR tmp[5];
  294. wsprintf(inifile, TEXT("%s\\%s"), mmconfig->workingdir, INIFILE);
  295. wsprintf(tmp, TEXT("%1d"), mmconfig->viewsize);
  296. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_VIEWSIZE, tmp, inifile);
  297. wsprintf(tmp, TEXT("%1d"), mmconfig->horizontal);
  298. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_HORIZONTAL, tmp, inifile);
  299. wsprintf(tmp, TEXT("%1d"), mmconfig->queryarg);
  300. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_QUERYARG, tmp, inifile);
  301. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_ROM0DIR, mmconfig->rom0dir, inifile);
  302. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_RAM0DIR, mmconfig->ram0dir, inifile);
  303. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_NAME, mmconfig->ownerinfo.name, inifile);
  304. wsprintf(tmp, TEXT("%4d"), mmconfig->ownerinfo.birth_year);
  305. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_BYEAR, tmp, inifile);
  306. wsprintf(tmp, TEXT("%2d"), mmconfig->ownerinfo.birth_month);
  307. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_BMONTH, tmp, inifile);
  308. wsprintf(tmp, TEXT("%2d"), mmconfig->ownerinfo.birth_day);
  309. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_BDAY, tmp, inifile);
  310. wsprintf(tmp, TEXT("%1d"), mmconfig->ownerinfo.sex);
  311. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_SEX, tmp, inifile);
  312. wsprintf(tmp, TEXT("%1d"), mmconfig->ownerinfo.bloodtype);
  313. WritePrivateProfileString(INIFILE_SECTION, INIFILE_KEY_OWNER_BLOOD, tmp, inifile);
  314. }