diff --git a/Source/Project64/Multilanguage/Language Class.cpp b/Source/Project64/Multilanguage/Language Class.cpp
index d1e242981..3622da5d7 100644
--- a/Source/Project64/Multilanguage/Language Class.cpp
+++ b/Source/Project64/Multilanguage/Language Class.cpp
@@ -495,21 +495,19 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(MSG_SET_HLE_AUD_MSG, L"Audio HLE requires a third-party plugin!!!\nIf you do not use a third-party audio plugin that supports HLE, you will hear no sound.\n\nChange to audio HLE?");
}
-LRESULT CALLBACK LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
CLanguage::CLanguage() :
- m_emptyString(L"")
+ m_emptyString(L""),
+ m_LanguageLoaded(false)
{
- LoadDefaultStrings();
+ LoadDefaultStrings();
+ if (g_Settings)
+ {
+ m_SelectedLanguage = g_Settings->LoadStringVal(Setting_CurrentLanguage).ToUTF16();
+ }
}
-void CLanguage::LoadCurrentStrings ( bool ShowSelectDialog )
+bool CLanguage::LoadCurrentStrings ( void )
{
- if (ShowSelectDialog)
- {
- m_SelectedLanguage = g_Settings->LoadStringVal(Setting_CurrentLanguage).ToUTF16();
- }
-
LanguageList LangList = GetLangList();
stdstr Filename;
@@ -525,23 +523,17 @@ void CLanguage::LoadCurrentStrings ( bool ShowSelectDialog )
break;
}
}
- if (ShowSelectDialog && Filename.length() == 0 && LangList.size() > 0)
- {
- //Do Dialog box to choose language
- DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_Lang_Select),NULL,(DLGPROC)LangSelectProc, (LPARAM)this);
- return;
- }
if (Filename.length() == 0)
{
- return;
+ return false;
}
//Process the file
FILE *file = fopen(Filename.c_str(), "rb");
if (file == NULL)
{
- return;
+ return false;
}
//Search for utf8 file marker
@@ -552,7 +544,7 @@ void CLanguage::LoadCurrentStrings ( bool ShowSelectDialog )
utf_bom[2] != 0xBF)
{
fclose(file);
- return;
+ return false;
}
//String;
@@ -561,339 +553,10 @@ void CLanguage::LoadCurrentStrings ( bool ShowSelectDialog )
m_CurrentStrings.insert(GetNextLangString(file));
}
fclose(file);
+ m_LanguageLoaded = true;
+ return true;
}
-WNDPROC pfnWndLangSelectOkProc = NULL;
-HBITMAP hOkButton = NULL;
-
-DWORD CALLBACK LangSelectOkProc (HWND hWnd, DWORD uMsg, DWORD wParam, DWORD lParam)
-{
- static bool m_fPressed = false;
- static HBITMAP hOkButtonDown = NULL;
-
- switch (uMsg)
- {
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
-
- if (BeginPaint(hWnd,&ps))
- {
- if (m_fPressed)
- {
- if (hOkButtonDown == NULL)
- {
- hOkButtonDown = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK_DOWN));
- }
- if (hOkButtonDown)
- {
- RECT rcClient;
- GetClientRect(hWnd, &rcClient);
-
- BITMAP bmTL1;
- GetObject(hOkButtonDown, sizeof(BITMAP), &bmTL1);
- HDC memdc = CreateCompatibleDC(ps.hdc);
- HGDIOBJ save = SelectObject(memdc, hOkButtonDown);
- BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
- SelectObject(memdc, save);
- DeleteDC(memdc);
- }
- }
- else
- {
- if (hOkButton)
- {
- RECT rcClient;
- GetClientRect(hWnd, &rcClient);
-
- BITMAP bmTL1;
- GetObject(hOkButton, sizeof(BITMAP), &bmTL1);
- HDC memdc = CreateCompatibleDC(ps.hdc);
- HGDIOBJ save = SelectObject(memdc, hOkButton);
- BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
- SelectObject(memdc, save);
- DeleteDC(memdc);
- }
- }
- EndPaint(hWnd,&ps);
- }
- }
- break;
- case WM_MOUSEMOVE:
- if (::GetCapture() == hWnd)
- {
- POINT ptCursor = { ((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)) };
- ClientToScreen(hWnd, &ptCursor);
- RECT rect;
- GetWindowRect(hWnd, &rect);
- bool uPressed = ::PtInRect(&rect, ptCursor)==TRUE;
- if ( m_fPressed != uPressed )
- {
- m_fPressed = uPressed;
- ::InvalidateRect(hWnd, NULL, TRUE);
- UpdateWindow(hWnd);
- }
- }
- break;
- case WM_LBUTTONDOWN:
- {
- LRESULT lRet = 0;
- lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
- SetCapture(hWnd);
- if ( ::GetCapture()==hWnd )
- {
- m_fPressed = true;
-
- if (m_fPressed)
- {
- ::InvalidateRect(hWnd, NULL, TRUE);
- UpdateWindow(hWnd);
- }
- }
- return lRet;
- }
- break;
- case WM_LBUTTONUP:
- {
- LRESULT lRet = 0;
- lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
- if ( ::GetCapture() == hWnd )
- {
- ::ReleaseCapture();
- if ( m_fPressed )
- {
- ::SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
- }
- }
- m_fPressed = false;
-
- return lRet;
- }
- break;
- }
-
- return CallWindowProc(pfnWndLangSelectOkProc, hWnd, uMsg, wParam, lParam);
-}
-
-LRESULT CALLBACK LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- static HBITMAP hbmpBackgroundTop = NULL;
- static HBITMAP hbmpBackgroundBottom = NULL;
- static HBITMAP hbmpBackgroundMiddle = NULL;
- static HFONT hTextFont = NULL;
- static CLanguage * lngClass;
-
- switch (uMsg)
- {
- case WM_INITDIALOG:
- SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE);
- {
- lngClass = (CLanguage *)lParam;
-
- LanguageList LangList = lngClass->GetLangList();
- if (LangList.size() == 0)
- {
- EndDialog(hDlg,0);
- }
- for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
- {
- int index = SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_ADDSTRING,0,(WPARAM)Language->LanguageName.c_str());
- if (_wcsicmp(Language->LanguageName.c_str(),L"English") == 0)
- {
- SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,index,0);
- }
- }
-
- int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
- if (Index < 0)
- {
- SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,0,0);
- }
-
- enum { ROUND_EDGE = 15 };
-
- DWORD dwStyle = GetWindowLong(hDlg, GWL_STYLE);
- dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
- SetWindowLong(hDlg, GWL_STYLE, dwStyle);
-
- // Use the size of the image
- hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_TOP));
- hbmpBackgroundBottom = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_BOTTOM));
- hbmpBackgroundMiddle = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_MIDDLE));
- BITMAP bmTL;
- GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
-
- if (hbmpBackgroundTop)
- {
- // int iHeight = bmTL.bmHeight;
- int iWidth = bmTL.bmWidth;
-
- RECT rect;
- GetWindowRect(hDlg, &rect);
- rect.left -= rect.left;
- rect.bottom -= rect.top;
- rect.top -= rect.top;
-
- // Tweaked
- HRGN hWindowRegion= CreateRoundRectRgn
- (
- rect.left,
- rect.top,
- rect.left+iWidth+GetSystemMetrics(SM_CXEDGE)-1,
- rect.bottom+GetSystemMetrics(SM_CYEDGE)-1,
- ROUND_EDGE,
- ROUND_EDGE
- );
-
- if (hWindowRegion)
- {
- SetWindowRgn(hDlg, hWindowRegion, TRUE);
- DeleteObject(hWindowRegion);
- }
- }
- hTextFont = ::CreateFont
- (
- 18,
- 0,
- 0,
- 0,
- FW_NORMAL,
- 0,
- 0,
- 0,
- DEFAULT_CHARSET,
- OUT_DEFAULT_PRECIS,
- CLIP_DEFAULT_PRECIS,
- PROOF_QUALITY,
- DEFAULT_PITCH|FF_DONTCARE,
- "Arial"
- );
- SendDlgItemMessage(hDlg,IDC_SELECT_LANG,WM_SETFONT,(WPARAM)hTextFont,TRUE);
- }
-
- hOkButton = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK));
- pfnWndLangSelectOkProc = (WNDPROC)::GetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC);
- ::SetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC,(LONG_PTR)LangSelectOkProc);
- break;
- case WM_NCHITTEST:
- {
- int xPos = LOWORD(lParam);
- int yPos = HIWORD(lParam);
- RECT client, a;
- GetClientRect(hDlg,&a);
- GetClientRect(hDlg,&client);
- ClientToScreen(hDlg,(LPPOINT)&client);
- client.right += client.left;
- client.bottom += client.top;
-
- int nCaption = GetSystemMetrics(SM_CYCAPTION)*4;
-
- LRESULT lResult = HTCLIENT;
-
- //check caption
- if (xPos <= client.right && xPos >= client.left &&
- (yPos >= client.top+ 0)&& (yPos <= client.top + 0+nCaption))
- {
- lResult = HTCAPTION;
- }
- SetWindowLong(hDlg, DWLP_MSGRESULT, lResult);
- return TRUE;
- }
- break;
- case WM_CTLCOLORSTATIC:
- {
- HDC hdcStatic = (HDC)wParam;
- SetTextColor(hdcStatic, RGB(0, 0, 0));
- SetBkMode(hdcStatic, TRANSPARENT);
- return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
- }
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
-
- if (BeginPaint(hDlg,&ps))
- {
- RECT rcClient;
- GetClientRect(hDlg, &rcClient);
-
- BITMAP bmTL_top, bmTL_bottom, bmTL_Middle;
- GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
- GetObject(hbmpBackgroundBottom, sizeof(BITMAP), &bmTL_bottom);
- GetObject(hbmpBackgroundMiddle, sizeof(BITMAP), &bmTL_Middle);
-
- HDC memdc = CreateCompatibleDC(ps.hdc);
- HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
- BitBlt(ps.hdc, 0, 0, bmTL_top.bmWidth, bmTL_top.bmHeight, memdc, 0, 0, SRCCOPY);
- SelectObject(memdc, save);
- DeleteDC(memdc);
-
- memdc = CreateCompatibleDC(ps.hdc);
- save = SelectObject(memdc, hbmpBackgroundMiddle);
- for (int x = bmTL_top.bmHeight; x < rcClient.bottom; x += bmTL_Middle.bmHeight)
- {
- //BitBlt(ps.hdc, 0, bmTL_top.bmHeight, bmTL_Middle.bmWidth, rcClient.bottom - (bmTL_bottom.bmHeight + bmTL_top.bmHeight), memdc, 0, 0, SRCCOPY);
- BitBlt(ps.hdc, 0, x, bmTL_Middle.bmWidth, bmTL_Middle.bmHeight, memdc, 0, 0, SRCCOPY);
- }
- SelectObject(memdc, save);
- DeleteDC(memdc);
-
- BITMAP ;
- memdc = CreateCompatibleDC(ps.hdc);
- save = SelectObject(memdc, hbmpBackgroundBottom);
- BitBlt(ps.hdc, 0, rcClient.bottom - bmTL_bottom.bmHeight, bmTL_bottom.bmWidth, bmTL_bottom.bmHeight, memdc, 0, 0, SRCCOPY);
- SelectObject(memdc, save);
- DeleteDC(memdc);
-
- BITMAP ;
-
- EndPaint(hDlg,&ps);
- }
- }
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDOK:
- if (hbmpBackgroundTop)
- {
- DeleteObject(hbmpBackgroundTop);
- }
- if (hbmpBackgroundBottom)
- {
- DeleteObject(hbmpBackgroundBottom);
- }
- if (hbmpBackgroundMiddle)
- {
- DeleteObject(hbmpBackgroundMiddle);
- }
-
- if (hTextFont)
- {
- ::DeleteObject(hTextFont);
- }
-
- {
- int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
-
- if (Index >= 0)
- {
- wchar_t String[255];
- SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETLBTEXT,Index,(LPARAM)String);
- lngClass->SetLanguage(String);
- }
- }
-
- EndDialog(hDlg,0);
- break;
- }
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-
LanguageList & CLanguage::GetLangList (void)
{
if (m_LanguageList.size() > 0)
@@ -1043,10 +706,12 @@ LANG_STR CLanguage::GetNextLangString (void * OpenFile)
void CLanguage::SetLanguage ( const wchar_t * LanguageName )
{
m_SelectedLanguage = LanguageName;
- LoadCurrentStrings(false);
- stdstr Language;
- Language.FromUTF16(LanguageName);
- g_Settings->SaveString(Setting_CurrentLanguage,Language);
+ if (LoadCurrentStrings())
+ {
+ stdstr Language;
+ Language.FromUTF16(LanguageName);
+ g_Settings->SaveString(Setting_CurrentLanguage,Language);
+ }
}
bool CLanguage::IsCurrentLang( LanguageFile & File )
diff --git a/Source/Project64/Multilanguage/Language Class.h b/Source/Project64/Multilanguage/Language Class.h
index 4bb514db9..50cb67be1 100644
--- a/Source/Project64/Multilanguage/Language Class.h
+++ b/Source/Project64/Multilanguage/Language Class.h
@@ -34,8 +34,9 @@ public:
const std::wstring & GetString ( LanguageStringID StringID );
LanguageList & GetLangList ( void );
void SetLanguage ( const wchar_t * LanguageName );
- void LoadCurrentStrings ( bool ShowSelectDialog );
+ bool LoadCurrentStrings ( void );
bool IsCurrentLang ( LanguageFile & File );
+ bool IsLanguageLoaded ( void ) const { return m_LanguageLoaded; }
private:
CLanguage(const CLanguage&); // Disable copy constructor
@@ -50,6 +51,8 @@ private:
std::wstring GetLangString ( const char * FileName, LanguageStringID ID );
LANG_STR GetNextLangString ( void * OpenFile );
void LoadDefaultStrings ( void );
+
+ bool m_LanguageLoaded;
};
extern CLanguage * g_Lang;
diff --git a/Source/Project64/Multilanguage/LanguageSelector.cpp b/Source/Project64/Multilanguage/LanguageSelector.cpp
new file mode 100644
index 000000000..e317d6b8b
--- /dev/null
+++ b/Source/Project64/Multilanguage/LanguageSelector.cpp
@@ -0,0 +1,351 @@
+/****************************************************************************
+* *
+* Project 64 - A Nintendo 64 emulator. *
+* http://www.pj64-emu.com/ *
+* Copyright (C) 2012 Project64. All rights reserved. *
+* *
+* License: *
+* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
+* *
+****************************************************************************/
+#include "stdafx.h"
+#include "LanguageSelector.h"
+
+CLanguageSelector::CLanguageSelector()
+{
+}
+
+void CLanguageSelector::Select ( void )
+{
+ DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_Lang_Select),NULL,(DLGPROC)LangSelectProc, (LPARAM)this);
+}
+
+static WNDPROC pfnWndLangSelectOkProc = NULL;
+static HBITMAP hOkButton = NULL;
+
+DWORD CALLBACK LangSelectOkProc (HWND hWnd, DWORD uMsg, DWORD wParam, DWORD lParam)
+{
+ static bool m_fPressed = false;
+ static HBITMAP hOkButtonDown = NULL;
+
+ switch (uMsg)
+ {
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+
+ if (BeginPaint(hWnd,&ps))
+ {
+ if (m_fPressed)
+ {
+ if (hOkButtonDown == NULL)
+ {
+ hOkButtonDown = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK_DOWN));
+ }
+ if (hOkButtonDown)
+ {
+ RECT rcClient;
+ GetClientRect(hWnd, &rcClient);
+
+ BITMAP bmTL1;
+ GetObject(hOkButtonDown, sizeof(BITMAP), &bmTL1);
+ HDC memdc = CreateCompatibleDC(ps.hdc);
+ HGDIOBJ save = SelectObject(memdc, hOkButtonDown);
+ BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
+ SelectObject(memdc, save);
+ DeleteDC(memdc);
+ }
+ }
+ else
+ {
+ if (hOkButton)
+ {
+ RECT rcClient;
+ GetClientRect(hWnd, &rcClient);
+
+ BITMAP bmTL1;
+ GetObject(hOkButton, sizeof(BITMAP), &bmTL1);
+ HDC memdc = CreateCompatibleDC(ps.hdc);
+ HGDIOBJ save = SelectObject(memdc, hOkButton);
+ BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
+ SelectObject(memdc, save);
+ DeleteDC(memdc);
+ }
+ }
+ EndPaint(hWnd,&ps);
+ }
+ }
+ break;
+ case WM_MOUSEMOVE:
+ if (::GetCapture() == hWnd)
+ {
+ POINT ptCursor = { ((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)) };
+ ClientToScreen(hWnd, &ptCursor);
+ RECT rect;
+ GetWindowRect(hWnd, &rect);
+ bool uPressed = ::PtInRect(&rect, ptCursor)==TRUE;
+ if ( m_fPressed != uPressed )
+ {
+ m_fPressed = uPressed;
+ ::InvalidateRect(hWnd, NULL, TRUE);
+ UpdateWindow(hWnd);
+ }
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ {
+ LRESULT lRet = 0;
+ lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
+ SetCapture(hWnd);
+ if ( ::GetCapture()==hWnd )
+ {
+ m_fPressed = true;
+
+ if (m_fPressed)
+ {
+ ::InvalidateRect(hWnd, NULL, TRUE);
+ UpdateWindow(hWnd);
+ }
+ }
+ return lRet;
+ }
+ break;
+ case WM_LBUTTONUP:
+ {
+ LRESULT lRet = 0;
+ lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
+ if ( ::GetCapture() == hWnd )
+ {
+ ::ReleaseCapture();
+ if ( m_fPressed )
+ {
+ ::SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
+ }
+ }
+ m_fPressed = false;
+
+ return lRet;
+ }
+ break;
+ }
+
+ return CallWindowProc(pfnWndLangSelectOkProc, hWnd, uMsg, wParam, lParam);
+}
+
+LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ static HBITMAP hbmpBackgroundTop = NULL;
+ static HBITMAP hbmpBackgroundBottom = NULL;
+ static HBITMAP hbmpBackgroundMiddle = NULL;
+ static HFONT hTextFont = NULL;
+ static CLanguageSelector * lngClass;
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE);
+ {
+ lngClass = (CLanguageSelector *)lParam;
+
+ LanguageList LangList = g_Lang->GetLangList();
+ if (LangList.size() == 0)
+ {
+ EndDialog(hDlg,0);
+ }
+ for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
+ {
+ int index = SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_ADDSTRING,0,(WPARAM)Language->LanguageName.c_str());
+ if (_wcsicmp(Language->LanguageName.c_str(),L"English") == 0)
+ {
+ SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,index,0);
+ }
+ }
+
+ int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
+ if (Index < 0)
+ {
+ SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,0,0);
+ }
+
+ enum { ROUND_EDGE = 15 };
+
+ DWORD dwStyle = GetWindowLong(hDlg, GWL_STYLE);
+ dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
+ SetWindowLong(hDlg, GWL_STYLE, dwStyle);
+
+ // Use the size of the image
+ hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_TOP));
+ hbmpBackgroundBottom = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_BOTTOM));
+ hbmpBackgroundMiddle = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_MIDDLE));
+ BITMAP bmTL;
+ GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
+
+ if (hbmpBackgroundTop)
+ {
+ // int iHeight = bmTL.bmHeight;
+ int iWidth = bmTL.bmWidth;
+
+ RECT rect;
+ GetWindowRect(hDlg, &rect);
+ rect.left -= rect.left;
+ rect.bottom -= rect.top;
+ rect.top -= rect.top;
+
+ // Tweaked
+ HRGN hWindowRegion= CreateRoundRectRgn
+ (
+ rect.left,
+ rect.top,
+ rect.left+iWidth+GetSystemMetrics(SM_CXEDGE)-1,
+ rect.bottom+GetSystemMetrics(SM_CYEDGE)-1,
+ ROUND_EDGE,
+ ROUND_EDGE
+ );
+
+ if (hWindowRegion)
+ {
+ SetWindowRgn(hDlg, hWindowRegion, TRUE);
+ DeleteObject(hWindowRegion);
+ }
+ }
+ hTextFont = ::CreateFont
+ (
+ 18,
+ 0,
+ 0,
+ 0,
+ FW_NORMAL,
+ 0,
+ 0,
+ 0,
+ DEFAULT_CHARSET,
+ OUT_DEFAULT_PRECIS,
+ CLIP_DEFAULT_PRECIS,
+ PROOF_QUALITY,
+ DEFAULT_PITCH|FF_DONTCARE,
+ "Arial"
+ );
+ SendDlgItemMessage(hDlg,IDC_SELECT_LANG,WM_SETFONT,(WPARAM)hTextFont,TRUE);
+ }
+
+ hOkButton = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK));
+ pfnWndLangSelectOkProc = (WNDPROC)::GetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC);
+ ::SetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC,(LONG_PTR)LangSelectOkProc);
+ break;
+ case WM_NCHITTEST:
+ {
+ int xPos = LOWORD(lParam);
+ int yPos = HIWORD(lParam);
+ RECT client, a;
+ GetClientRect(hDlg,&a);
+ GetClientRect(hDlg,&client);
+ ClientToScreen(hDlg,(LPPOINT)&client);
+ client.right += client.left;
+ client.bottom += client.top;
+
+ int nCaption = GetSystemMetrics(SM_CYCAPTION)*4;
+
+ LRESULT lResult = HTCLIENT;
+
+ //check caption
+ if (xPos <= client.right && xPos >= client.left &&
+ (yPos >= client.top+ 0)&& (yPos <= client.top + 0+nCaption))
+ {
+ lResult = HTCAPTION;
+ }
+ SetWindowLong(hDlg, DWLP_MSGRESULT, lResult);
+ return TRUE;
+ }
+ break;
+ case WM_CTLCOLORSTATIC:
+ {
+ HDC hdcStatic = (HDC)wParam;
+ SetTextColor(hdcStatic, RGB(0, 0, 0));
+ SetBkMode(hdcStatic, TRANSPARENT);
+ return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
+ }
+ break;
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+
+ if (BeginPaint(hDlg,&ps))
+ {
+ RECT rcClient;
+ GetClientRect(hDlg, &rcClient);
+
+ BITMAP bmTL_top, bmTL_bottom, bmTL_Middle;
+ GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
+ GetObject(hbmpBackgroundBottom, sizeof(BITMAP), &bmTL_bottom);
+ GetObject(hbmpBackgroundMiddle, sizeof(BITMAP), &bmTL_Middle);
+
+ HDC memdc = CreateCompatibleDC(ps.hdc);
+ HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
+ BitBlt(ps.hdc, 0, 0, bmTL_top.bmWidth, bmTL_top.bmHeight, memdc, 0, 0, SRCCOPY);
+ SelectObject(memdc, save);
+ DeleteDC(memdc);
+
+ memdc = CreateCompatibleDC(ps.hdc);
+ save = SelectObject(memdc, hbmpBackgroundMiddle);
+ for (int x = bmTL_top.bmHeight; x < rcClient.bottom; x += bmTL_Middle.bmHeight)
+ {
+ //BitBlt(ps.hdc, 0, bmTL_top.bmHeight, bmTL_Middle.bmWidth, rcClient.bottom - (bmTL_bottom.bmHeight + bmTL_top.bmHeight), memdc, 0, 0, SRCCOPY);
+ BitBlt(ps.hdc, 0, x, bmTL_Middle.bmWidth, bmTL_Middle.bmHeight, memdc, 0, 0, SRCCOPY);
+ }
+ SelectObject(memdc, save);
+ DeleteDC(memdc);
+
+ BITMAP ;
+ memdc = CreateCompatibleDC(ps.hdc);
+ save = SelectObject(memdc, hbmpBackgroundBottom);
+ BitBlt(ps.hdc, 0, rcClient.bottom - bmTL_bottom.bmHeight, bmTL_bottom.bmWidth, bmTL_bottom.bmHeight, memdc, 0, 0, SRCCOPY);
+ SelectObject(memdc, save);
+ DeleteDC(memdc);
+
+ BITMAP ;
+
+ EndPaint(hDlg,&ps);
+ }
+ }
+ break;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ if (hbmpBackgroundTop)
+ {
+ DeleteObject(hbmpBackgroundTop);
+ }
+ if (hbmpBackgroundBottom)
+ {
+ DeleteObject(hbmpBackgroundBottom);
+ }
+ if (hbmpBackgroundMiddle)
+ {
+ DeleteObject(hbmpBackgroundMiddle);
+ }
+
+ if (hTextFont)
+ {
+ ::DeleteObject(hTextFont);
+ }
+
+ {
+ int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
+
+ if (Index >= 0)
+ {
+ wchar_t String[255];
+ SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETLBTEXT,Index,(LPARAM)String);
+ g_Lang->SetLanguage(String);
+ }
+ }
+
+ EndDialog(hDlg,0);
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
\ No newline at end of file
diff --git a/Source/Project64/Multilanguage/LanguageSelector.h b/Source/Project64/Multilanguage/LanguageSelector.h
new file mode 100644
index 000000000..bb88af757
--- /dev/null
+++ b/Source/Project64/Multilanguage/LanguageSelector.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+* *
+* Project 64 - A Nintendo 64 emulator. *
+* http://www.pj64-emu.com/ *
+* Copyright (C) 2012 Project64. All rights reserved. *
+* *
+* License: *
+* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
+* *
+****************************************************************************/
+#pragma once
+
+class CLanguageSelector
+{
+public:
+ CLanguageSelector ();
+
+ void Select ( void );
+
+private:
+ CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
+ CLanguageSelector& operator=(const CLanguageSelector&); // Disable assignment
+
+ static LRESULT CALLBACK LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+};
\ No newline at end of file
diff --git a/Source/Project64/Project64.vcproj b/Source/Project64/Project64.vcproj
index 5e7b84e54..e76138d2c 100644
--- a/Source/Project64/Project64.vcproj
+++ b/Source/Project64/Project64.vcproj
@@ -408,6 +408,10 @@
RelativePath="Multilanguage\Language Class.cpp"
>
+
+
-
-
@@ -483,6 +483,10 @@
RelativePath="N64 System\Mips\Register Class.cpp"
>
+
+
@@ -781,10 +785,6 @@
Name="Header Files"
Filter="h;hpp;hxx;hm;inl"
>
-
-
@@ -809,6 +809,10 @@
RelativePath="User Interface.h"
>
+
+
@@ -1048,6 +1052,10 @@
RelativePath="Multilanguage\Language Class.h"
>
+
+
-
-
@@ -1139,6 +1143,10 @@
RelativePath="N64 System\Mips\Register Class.h"
>
+
+
@@ -1323,22 +1331,22 @@
-
-
-
-
+
+
+
+
diff --git a/Source/Project64/main.cpp b/Source/Project64/main.cpp
index 8a23bc025..268c76b48 100644
--- a/Source/Project64/main.cpp
+++ b/Source/Project64/main.cpp
@@ -1,4 +1,5 @@
#include "stdafx.h"
+#include "Multilanguage\LanguageSelector.h"
#include
CTraceFileLog * LogFile = NULL;
@@ -204,8 +205,6 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /
try
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL );
- g_Lang = new CLanguage();
-
g_Settings = new CSettings;
g_Settings->Initialize(AppName());
@@ -229,7 +228,12 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /
g_Plugins = new CPlugins(g_Settings->LoadStringVal(Directory_Plugin));
//Select the language
- g_Lang->LoadCurrentStrings(true);
+ g_Lang = new CLanguage();
+ if (!g_Lang->LoadCurrentStrings())
+ {
+ CLanguageSelector().Select();
+ }
+
//Create the main window with Menu
WriteTrace(TraceDebug,__FUNCTION__ ": Create Main Window");