From 094a1870c2942dc9d221f517555580f4360cee5f Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 24 Dec 2009 17:40:06 +0000 Subject: [PATCH] win32: checkin some chinese junk --- desmume/src/windows/AboutBox.cpp | 22 +++-- desmume/src/windows/hotkey.cpp | 9 ++ desmume/src/windows/inputdx.cpp | 137 +++++++++++++++++-------------- desmume/src/windows/resource.h | 5 +- desmume/src/windows/resources.rc | Bin 891328 -> 891502 bytes 5 files changed, 102 insertions(+), 71 deletions(-) diff --git a/desmume/src/windows/AboutBox.cpp b/desmume/src/windows/AboutBox.cpp index 15227edb2..9222d7f03 100644 --- a/desmume/src/windows/AboutBox.cpp +++ b/desmume/src/windows/AboutBox.cpp @@ -85,14 +85,22 @@ BOOL CALLBACK AboutBox_Proc (HWND dialog, UINT message,WPARAM wparam,LPARAM lpar { case WM_INITDIALOG: { - char buf[2048]; - memset(buf, 0, sizeof(buf)); - std::string version = (std::string)"version " + EMU_DESMUME_VERSION_STRING() + EMU_DESMUME_COMPILER_DETAIL(); - SetDlgItemText(dialog, IDC_TXT_VERSION, version.c_str()); + // Support Unicode text display + wchar_t wstr[256]; + wchar_t wstr1[256]; + wchar_t wstr2[256]; - memset(buf, 0, sizeof(buf)); - wsprintf(buf, "compiled: %s %s", __DATE__,__TIME__); - SetDlgItemText(dialog, IDC_TXT_COMPILED, buf); + GetDlgItemTextW(dialog, IDC_TXT_VERSION, wstr,256); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, EMU_DESMUME_VERSION_STRING(), -1, wstr1, 255); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, EMU_DESMUME_COMPILER_DETAIL(), -1, wstr2, 255); + wcscat(wstr, wcscat(wstr1, wstr2)); + SetDlgItemTextW(dialog, IDC_TXT_VERSION, wstr); + + GetDlgItemTextW(dialog, IDC_TXT_COMPILED, wstr,256); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, __DATE__, -1, wstr1, 255); + MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, __TIME__, -1, wstr2, 255); + wcscat(wstr, wcscat(wcscat(wstr1, L" "), wstr2)); + SetDlgItemTextW(dialog, IDC_TXT_COMPILED, wstr); for (int i = 0; i < SIZE_SCROLL_BUFFER; i++) strcpy((char *)scroll_buffer[i], "\n"); diff --git a/desmume/src/windows/hotkey.cpp b/desmume/src/windows/hotkey.cpp index b58058a3d..d604af2a3 100644 --- a/desmume/src/windows/hotkey.cpp +++ b/desmume/src/windows/hotkey.cpp @@ -385,6 +385,14 @@ void HK_ToggleRasterizer(int, bool justPressed) { //=====================================DEFINITIONS====================================== //====================================================================================== +//returns the specified resource string ID as a std::wstring +std::wstring STRW(UINT id) +{ + wchar_t* wstr; + LoadStringW(NULL,id,(LPWSTR)&wstr,0); + return wstr; +} + void InitCustomKeys (SCustomKeys *keys) { UINT i = 0; @@ -407,6 +415,7 @@ void InitCustomKeys (SCustomKeys *keys) keys->OpenROM.handleKeyDown = HK_OpenROM; keys->OpenROM.code = "OpenROM"; keys->OpenROM.name = L"Open ROM"; + //keys->OpenROM.name = STRW(ID_LOCALIZED_STRING); keys->OpenROM.page = HOTKEY_PAGE_MAIN; keys->OpenROM.key = 'O'; keys->OpenROM.modifiers = CUSTKEY_CTRL_MASK; diff --git a/desmume/src/windows/inputdx.cpp b/desmume/src/windows/inputdx.cpp index d4788ba68..8c54b422e 100644 --- a/desmume/src/windows/inputdx.cpp +++ b/desmume/src/windows/inputdx.cpp @@ -58,29 +58,32 @@ #include "directx/dinput.h" // Gamepad Dialog Strings -#define INPUTCONFIG_TITLE "Input Configuration" +// Support Unicode display +//#define INPUTCONFIG_TITLE "Input Configuration" #define INPUTCONFIG_JPTOGGLE "Enabled" //#define INPUTCONFIG_DIAGTOGGLE "Toggle Diagonals" //#define INPUTCONFIG_OK "&OK" //#define INPUTCONFIG_CANCEL "&Cancel" #define INPUTCONFIG_JPCOMBO "Joypad #%d" -#define INPUTCONFIG_LABEL_UP "Up" -#define INPUTCONFIG_LABEL_DOWN "Down" -#define INPUTCONFIG_LABEL_LEFT "Left" -#define INPUTCONFIG_LABEL_RIGHT "Right" -#define INPUTCONFIG_LABEL_A "A" -#define INPUTCONFIG_LABEL_B "B" -#define INPUTCONFIG_LABEL_X "X" -#define INPUTCONFIG_LABEL_Y "Y" -#define INPUTCONFIG_LABEL_L "L" -#define INPUTCONFIG_LABEL_R "R" -#define INPUTCONFIG_LABEL_START "Start" -#define INPUTCONFIG_LABEL_SELECT "Select" -#define INPUTCONFIG_LABEL_UPLEFT "Up Left" -#define INPUTCONFIG_LABEL_UPRIGHT "Up Right" -#define INPUTCONFIG_LABEL_DOWNRIGHT "Dn Right" -#define INPUTCONFIG_LABEL_DOWNLEFT "Dn Left" -#define INPUTCONFIG_LABEL_BLUE "Blue means the button is already mapped.\nPink means it conflicts with a custom hotkey.\nRed means it's reserved by Windows.\nButtons can be disabled using Escape.\nGrayed buttons arent supported yet (sorry!)" +// Support Unicode display +#define INPUTCONFIG_LABEL_UP IDC_LABEL_UP +#define INPUTCONFIG_LABEL_DOWN IDC_LABEL_DOWN +#define INPUTCONFIG_LABEL_LEFT IDC_LABEL_LEFT +#define INPUTCONFIG_LABEL_RIGHT IDC_LABEL_RIGHT +#define INPUTCONFIG_LABEL_A IDC_LABEL_A +#define INPUTCONFIG_LABEL_B IDC_LABEL_B +#define INPUTCONFIG_LABEL_X IDC_LABEL_X +#define INPUTCONFIG_LABEL_Y IDC_LABEL_Y +#define INPUTCONFIG_LABEL_L IDC_LABEL_L +#define INPUTCONFIG_LABEL_R IDC_LABEL_R +#define INPUTCONFIG_LABEL_START IDC_LABEL_START +#define INPUTCONFIG_LABEL_SELECT IDC_LABEL_SELECT +#define INPUTCONFIG_LABEL_UPLEFT IDC_LABEL_UPLEFT +#define INPUTCONFIG_LABEL_UPRIGHT IDC_LABEL_UPRIGHT +#define INPUTCONFIG_LABEL_DOWNRIGHT IDC_LABEL_DOWNRIGHT +#define INPUTCONFIG_LABEL_DOWNLEFT IDC_LABEL_DOWNLEFT +#define INPUTCONFIG_LABEL_BLUE IDC_LABEL_BLUE //"Blue means the button is already mapped.\nPink means it conflicts with a custom hotkey.\nRed means it's reserved by Windows.\nButtons can be disabled using Escape.\nGrayed buttons arent supported yet (sorry!)" + #define INPUTCONFIG_LABEL_UNUSED "" #define INPUTCONFIG_LABEL_CLEAR_TOGGLES_AND_TURBO "Clear All" #define INPUTCONFIG_LABEL_MAKE_TURBO "TempTurbo" @@ -93,7 +96,8 @@ #define HOTKEYS_CONTROL_MOD "Ctrl + " #define HOTKEYS_SHIFT_MOD "Shift + " #define HOTKEYS_ALT_MOD "Alt + " -#define HOTKEYS_LABEL_BLUE "Blue means the hotkey is already mapped.\nPink means it conflicts with a game button.\nRed means it's reserved by Windows.\nA hotkey can be disabled using Escape." +// Support Unicode display +#define HOTKEYS_LABEL_BLUE IDC_LABEL_BLUE1 //"Blue means the hotkey is already mapped.\nPink means it conflicts with a game button.\nRed means it's reserved by Windows.\nA hotkey can be disabled using Escape." #define HOTKEYS_HKCOMBO "Page %d" // gaming buttons and axes @@ -193,8 +197,9 @@ #define GAMEDEVICE_VK_F10 "F10" #define GAMEDEVICE_VK_F11 "F11" #define GAMEDEVICE_VK_F12 "F12" -#define BUTTON_OK "&OK" -#define BUTTON_CANCEL "&Cancel" +// Support Unicode display +#define BUTTON_OK L"&OK" +#define BUTTON_CANCEL L"&Cancel" static TCHAR szClassName[] = _T("InputCustom"); static TCHAR szHotkeysClassName[] = _T("InputCustomHot"); @@ -1872,30 +1877,31 @@ void EnableDisableKeyFields (int index, HWND hDlg) bool enableUnTurboable; if(index < 5) { - SetDlgItemText(hDlg,IDC_LABEL_RIGHT,INPUTCONFIG_LABEL_RIGHT); - SetDlgItemText(hDlg,IDC_LABEL_UPLEFT,INPUTCONFIG_LABEL_UPLEFT); - SetDlgItemText(hDlg,IDC_LABEL_UPRIGHT,INPUTCONFIG_LABEL_UPRIGHT); - SetDlgItemText(hDlg,IDC_LABEL_DOWNRIGHT,INPUTCONFIG_LABEL_DOWNRIGHT); - SetDlgItemText(hDlg,IDC_LABEL_UP,INPUTCONFIG_LABEL_UP); - SetDlgItemText(hDlg,IDC_LABEL_LEFT,INPUTCONFIG_LABEL_LEFT); - SetDlgItemText(hDlg,IDC_LABEL_DOWN,INPUTCONFIG_LABEL_DOWN); - SetDlgItemText(hDlg,IDC_LABEL_DOWNLEFT,INPUTCONFIG_LABEL_DOWNLEFT); + // Support Unicode display + SetDlgItemTextW(hDlg,IDC_LABEL_RIGHT,(LPWSTR)INPUTCONFIG_LABEL_RIGHT); + SetDlgItemTextW(hDlg,IDC_LABEL_UPLEFT,(LPWSTR)INPUTCONFIG_LABEL_UPLEFT); + SetDlgItemTextW(hDlg,IDC_LABEL_UPRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UPRIGHT); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNRIGHT,(LPWSTR)INPUTCONFIG_LABEL_DOWNRIGHT); + SetDlgItemTextW(hDlg,IDC_LABEL_UP,(LPWSTR)INPUTCONFIG_LABEL_UP); + SetDlgItemTextW(hDlg,IDC_LABEL_LEFT,(LPWSTR)INPUTCONFIG_LABEL_LEFT); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWN,(LPWSTR)INPUTCONFIG_LABEL_DOWN); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNLEFT,(LPWSTR)INPUTCONFIG_LABEL_DOWNLEFT); enableUnTurboable = true; } else { - SetDlgItemText(hDlg,IDC_LABEL_UP,INPUTCONFIG_LABEL_MAKE_TURBO); - SetDlgItemText(hDlg,IDC_LABEL_LEFT,INPUTCONFIG_LABEL_MAKE_HELD); - SetDlgItemText(hDlg,IDC_LABEL_DOWN,INPUTCONFIG_LABEL_MAKE_TURBO_HELD); - SetDlgItemText(hDlg,IDC_LABEL_RIGHT,INPUTCONFIG_LABEL_CLEAR_TOGGLES_AND_TURBO); - SetDlgItemText(hDlg,IDC_LABEL_UPLEFT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_LABEL_UPRIGHT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_LABEL_DOWNLEFT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_LABEL_DOWNRIGHT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_UPLEFT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_UPRIGHT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_DWNLEFT,INPUTCONFIG_LABEL_UNUSED); - SetDlgItemText(hDlg,IDC_DWNRIGHT,INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_LABEL_UP,(LPWSTR)INPUTCONFIG_LABEL_MAKE_TURBO); + SetDlgItemTextW(hDlg,IDC_LABEL_LEFT,(LPWSTR)INPUTCONFIG_LABEL_MAKE_HELD); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWN,(LPWSTR)INPUTCONFIG_LABEL_MAKE_TURBO_HELD); + SetDlgItemTextW(hDlg,IDC_LABEL_RIGHT,(LPWSTR)INPUTCONFIG_LABEL_CLEAR_TOGGLES_AND_TURBO); + SetDlgItemTextW(hDlg,IDC_LABEL_UPLEFT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_LABEL_UPRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNLEFT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_UPLEFT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_UPRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_DWNLEFT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); + SetDlgItemTextW(hDlg,IDC_DWNRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UNUSED); enableUnTurboable = false; } @@ -1921,28 +1927,31 @@ INT_PTR CALLBACK DlgInputConfig(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lPara switch(msg) { case WM_INITDIALOG: + // Support Unicode display + SetDlgItemTextW(hDlg,IDOK,BUTTON_OK); + SetDlgItemTextW(hDlg,IDCANCEL,BUTTON_CANCEL); + // Support Unicode display + //SetWindowText(hDlg,INPUTCONFIG_TITLE); //if(DirectX.Clipped) S9xReRefresh(); - SetWindowText(hDlg,INPUTCONFIG_TITLE); //SetDlgItemText(hDlg,IDC_JPTOGGLE,INPUTCONFIG_JPTOGGLE); - SetDlgItemText(hDlg,IDOK,BUTTON_OK); - SetDlgItemText(hDlg,IDCANCEL,BUTTON_CANCEL); /// SetDlgItemText(hDlg,IDC_DIAGTOGGLE,INPUTCONFIG_DIAGTOGGLE); - SetDlgItemText(hDlg,IDC_LABEL_UP,INPUTCONFIG_LABEL_UP); - SetDlgItemText(hDlg,IDC_LABEL_DOWN,INPUTCONFIG_LABEL_DOWN); - SetDlgItemText(hDlg,IDC_LABEL_LEFT,INPUTCONFIG_LABEL_LEFT); - SetDlgItemText(hDlg,IDC_LABEL_A,INPUTCONFIG_LABEL_A); - SetDlgItemText(hDlg,IDC_LABEL_B,INPUTCONFIG_LABEL_B); - SetDlgItemText(hDlg,IDC_LABEL_X,INPUTCONFIG_LABEL_X); - SetDlgItemText(hDlg,IDC_LABEL_Y,INPUTCONFIG_LABEL_Y); - SetDlgItemText(hDlg,IDC_LABEL_L,INPUTCONFIG_LABEL_L); - SetDlgItemText(hDlg,IDC_LABEL_R,INPUTCONFIG_LABEL_R); - SetDlgItemText(hDlg,IDC_LABEL_START,INPUTCONFIG_LABEL_START); - SetDlgItemText(hDlg,IDC_LABEL_SELECT,INPUTCONFIG_LABEL_SELECT); - SetDlgItemText(hDlg,IDC_LABEL_UPRIGHT,INPUTCONFIG_LABEL_UPRIGHT); - SetDlgItemText(hDlg,IDC_LABEL_UPLEFT,INPUTCONFIG_LABEL_UPLEFT); - SetDlgItemText(hDlg,IDC_LABEL_DOWNRIGHT,INPUTCONFIG_LABEL_DOWNRIGHT); - SetDlgItemText(hDlg,IDC_LABEL_DOWNLEFT,INPUTCONFIG_LABEL_DOWNLEFT); - SetDlgItemText(hDlg,IDC_LABEL_BLUE,INPUTCONFIG_LABEL_BLUE); + // Support Unicode display + SetDlgItemTextW(hDlg,IDC_LABEL_UP,(LPWSTR)INPUTCONFIG_LABEL_UP); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWN,(LPWSTR)INPUTCONFIG_LABEL_DOWN); + SetDlgItemTextW(hDlg,IDC_LABEL_LEFT,(LPWSTR)INPUTCONFIG_LABEL_LEFT); + SetDlgItemTextW(hDlg,IDC_LABEL_A,(LPWSTR)INPUTCONFIG_LABEL_A); + SetDlgItemTextW(hDlg,IDC_LABEL_B,(LPWSTR)INPUTCONFIG_LABEL_B); + SetDlgItemTextW(hDlg,IDC_LABEL_X,(LPWSTR)INPUTCONFIG_LABEL_X); + SetDlgItemTextW(hDlg,IDC_LABEL_Y,(LPWSTR)INPUTCONFIG_LABEL_Y); + SetDlgItemTextW(hDlg,IDC_LABEL_L,(LPWSTR)INPUTCONFIG_LABEL_L); + SetDlgItemTextW(hDlg,IDC_LABEL_R,(LPWSTR)INPUTCONFIG_LABEL_R); + SetDlgItemTextW(hDlg,IDC_LABEL_START,(LPWSTR)INPUTCONFIG_LABEL_START); + SetDlgItemTextW(hDlg,IDC_LABEL_SELECT,(LPWSTR)INPUTCONFIG_LABEL_SELECT); + SetDlgItemTextW(hDlg,IDC_LABEL_UPRIGHT,(LPWSTR)INPUTCONFIG_LABEL_UPRIGHT); + SetDlgItemTextW(hDlg,IDC_LABEL_UPLEFT,(LPWSTR)INPUTCONFIG_LABEL_UPLEFT); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNRIGHT,(LPWSTR)INPUTCONFIG_LABEL_DOWNRIGHT); + SetDlgItemTextW(hDlg,IDC_LABEL_DOWNLEFT,(LPWSTR)INPUTCONFIG_LABEL_DOWNLEFT); + SetDlgItemTextW(hDlg,IDC_LABEL_BLUE,(LPWSTR)INPUTCONFIG_LABEL_BLUE); for(i=5;i<10;i++) Joypad[i].Left_Up = Joypad[i].Right_Up = Joypad[i].Left_Down = Joypad[i].Right_Down = 0; @@ -2609,7 +2618,10 @@ switch(msg) return true; case WM_INITDIALOG: //if(DirectX.Clipped) S9xReRefresh(); - SetWindowText(hDlg,HOTKEYS_TITLE); + // Support Unicode display + wchar_t menuItemString[256]; + LoadStringW(hAppInst, ID_HOTKEYS_TITLE, menuItemString, 256); + SetWindowTextW(hDlg, menuItemString); // insert hotkey page list items for(i = 0 ; i < NUM_HOTKEY_PAGE ; i++) @@ -2626,7 +2638,8 @@ switch(msg) GetAsyncKeyState(i); } - SetDlgItemText(hDlg,IDC_LABEL_BLUE,HOTKEYS_LABEL_BLUE); + // Support Unicode display + SetDlgItemTextW(hDlg,IDC_LABEL_BLUE,(LPWSTR)HOTKEYS_LABEL_BLUE); set_hotkeyinfo(hDlg); diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index 69624539b..262430add 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -101,7 +101,6 @@ #define IDM_IMPORTBACKUPMEMORY 201 #define IDC_LANGENGLISH 210 #define IDC_LANGFRENCH 211 -#define IDC_LANGDANISH 212 #define IDC_LANG_CHINESE_SIMPLIFIED 213 #define IDC_LANGITALIAN 214 #define IDC_LANGJAPANESE 215 @@ -716,6 +715,7 @@ #define ID_CONFIG_DISPLAYMETHOD 40070 #define ID_DISPLAYMETHOD_DIRECTDRAWHW 40071 #define ID_DISPLAYMETHOD_DIRECTDRAWSW 40072 +#define ID_HOTKEYS_TITLE 40073 #define IDC_LABEL_UP 50000 #define IDC_LABEL_RIGHT 50001 #define IDC_LABEL_LEFT 50002 @@ -755,6 +755,7 @@ #define IDC_LABEL_BLUE 50036 #define IDC_LID 50037 #define IDD_INPUTCONFIG 50038 +#define IDC_LABEL_BLUE1 50039 #define IDC_LUASCRIPT_RESERVE_START 58000 #define IDC_LUASCRIPT_RESERVE_END 58099 #define IDD_LUARECENT_RESERVE_START 58100 @@ -812,7 +813,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 121 -#define _APS_NEXT_COMMAND_VALUE 40073 +#define _APS_NEXT_COMMAND_VALUE 40074 #define _APS_NEXT_CONTROL_VALUE 1022 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 9b03cee36bc32bc70b0f1742a18987e8d9c7044b..aa16ce9b45d5b4d97b0d5b50a32cd4416e8d4357 100644 GIT binary patch delta 13178 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