Переключение языка интерфейса
От: Nerep  
Дата: 25.06.01 14:55
Оценка:
Как можно реализовать переключение языка интерфейса, как это сделано в The Bat.
Re: Переключение языка интерфейса
От: Stan  
Дата: 06.07.01 04:53
Оценка:
Здравствуйте Nerep, вы писали:

N>Как можно реализовать переключение языка интерфейса, как это сделано в The Bat.


Нужно создать такие же ресурсы, только на нужном языке, запихать их например в DLL и при вызове события на смену интерфейса подгрузить эту DLL и сделать
AfxSetResourceHandle на ресурсы из DLL:

Например:

HMODULE hCurrentModule;
hCurrentModule=AfxLoadLibrary(_T("al_german"));

ASSERT(hCurrentModule);

AfxSetResourceHandle(hCurrentModule);

Соответственно если уже была подгружена какая-то DLL, то ее предварительно освободить:
FreeLibrary(/*HMODULE c текущими ресурсами*/);

А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.
Re[2]: Переключение языка интерфейса
От: IT Россия linq2db.com
Дата: 06.07.01 14:54
Оценка:
S>А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.

Вот на это более всего интересно посмотреть :)
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Переключение языка интерфейса
От: Stan  
Дата: 09.07.01 08:18
Оценка:
S>>А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.

IT>Вот на это более всего интересно посмотреть :)


А что, в этом какая-то проблема есть?
Я когда подобное реализовывал, никаких проблем не испытал.
Можно либо вообще все пересоздать, либо просто сменить заголовки. Пересоздать проще.

Пример пересоздания тулбаров:

...

//Destroy
for(int i = 0; i < m_arrToolbars.GetSize(); i++)
{
pToolbar = (CBCGToolBar*)m_arrToolbars[i];
pToolbar->DestroyWindow();
delete pToolbar;
}:

...

//Create
for(i = 0; i < m_arrToolbarIDs.GetSize(); i++)
{
UINT nID = (UINT)m_arrToolbarIDs[i];
// create new
pToolbar = new CBCGToolBar();
if (!pToolbar->CreateEx(m_pMainFrame, TBSTYLE_FLAT, WS_CHILD |
CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,
CRect(1,1,1,1), AFX_IDW_TOOLBAR + nID) ||
!pToolbar->LoadToolBar(nID))
{
TRACE(_T("Failed to create view's toolbar from Resource %d\n"), nID);
delete pToolbar;
continue; // fail to create this toolbar but try others
}
ASSERT(::IsWindow(pToolbar->GetSafeHwnd()));

// set toolbar title
CString csTitle;
csTitle.LoadString(m_arrToolbarTitleIDs[i]);
pToolbar->SetWindowText(csTitle);

// cache the pointer tho the new created toolbar
m_arrToolbars.Add(pToolbar);
}

...

Главное — внимательно проследить за утечками памяти. :))
Ну и соответственно объектная модель приложения должна учитывать возможность смены интерфейса.
Re[4]: Переключение языка интерфейса
От: Avtii  
Дата: 09.07.01 10:02
Оценка:
Здравствуйте Stan, вы писали:



S>>>А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.


Ну а если просто загрузку DLL и вызов AfxSetResourceHandle () произвести в CMainFrame::OnCreate ()
до кода создания тулбара? Наверно тогда не придётся его пересоздавать?
Re[5]: Переключение языка интерфейса
От: Stan  
Дата: 10.07.01 02:05
Оценка:
Здравствуйте Avtii, вы писали:

A>Ну а если просто загрузку DLL и вызов AfxSetResourceHandle () произвести в CMainFrame::OnCreate ()

A>до кода создания тулбара? Наверно тогда не придётся его пересоздавать?

Так задача то состоит в том, чтобы при выборе пункта меню сразу поменялся весь интерфейс, т.е приложение уже запущено, работает и соответственно MainFrame уже создан. :)

А Ваш метод подходит для смены интерфейса при последующем запуске, т.е. пользователь говорит — "я хочу, чтоб завтра, когда я начну снова работать, то язык мне нужен немецкий" — и ставит галочку.
Тогда при запуске читаем реестр, находим эту галочку и действительно, сначала грузим языковую DLL а затем начинаем создавть MainFrame и все остальное. И смена языка будет происходить автоматом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.