Здравствуйте Nerep, вы писали:
N>Как можно реализовать переключение языка интерфейса, как это сделано в The Bat.
Нужно создать такие же ресурсы, только на нужном языке, запихать их например в DLL и при вызове события на смену интерфейса подгрузить эту DLL и сделать
AfxSetResourceHandle на ресурсы из DLL:
Соответственно если уже была подгружена какая-то DLL, то ее предварительно освободить:
FreeLibrary(/*HMODULE c текущими ресурсами*/);
А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.
S>А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.
Вот на это более всего интересно посмотреть :)
Если нам не помогут, то мы тоже никого не пощадим.
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);
}
...
Главное — внимательно проследить за утечками памяти. :))
Ну и соответственно объектная модель приложения должна учитывать возможность смены интерфейса.
S>>>А дальше пробежаться по уже созданным CView, Toolbar'ам, менюшкам и т.д и пересоздать их. А компоненты, которые будут создаваться в процессе работы потом — диалоги там всякие, будут автоматом грузиться из DLL.
Ну а если просто загрузку DLL и вызов AfxSetResourceHandle () произвести в CMainFrame::OnCreate ()
до кода создания тулбара? Наверно тогда не придётся его пересоздавать?
Здравствуйте Avtii, вы писали:
A>Ну а если просто загрузку DLL и вызов AfxSetResourceHandle () произвести в CMainFrame::OnCreate () A>до кода создания тулбара? Наверно тогда не придётся его пересоздавать?
Так задача то состоит в том, чтобы при выборе пункта меню сразу поменялся весь интерфейс, т.е приложение уже запущено, работает и соответственно MainFrame уже создан. :)
А Ваш метод подходит для смены интерфейса при последующем запуске, т.е. пользователь говорит — "я хочу, чтоб завтра, когда я начну снова работать, то язык мне нужен немецкий" — и ставит галочку.
Тогда при запуске читаем реестр, находим эту галочку и действительно, сначала грузим языковую DLL а затем начинаем создавть MainFrame и все остальное. И смена языка будет происходить автоматом.