主题的设计思路

 

为了统一控制各种控件字体的大小,增加了CThemes类,该类在工程socgui2中。

有两类控件需要控制字体:1、DuiLib中的原生类;2、后期开发的控件类。

1、DuiLib中的原生类

由于库的层次关系,这些原生类无法使用类CThemes,所以只能通过回调函数的方式修改这些类的字体,为此修改了DuiLib库中CDialogBuilder::_Parse函数,增加了回调m_pCallback->OnControlCreated,注意该函数应该在调用SetManager后尽早调用,否则如果调用过晚会导致覆盖掉XML中设置的属性,XML中的属性优先,比如XML中设置了字体,就不应该再使用回调中设置的字体;如果在SetManager前调用,就没法取得字体,因为字体是从manager中取得的:m_iFont = m_pManager->GetFontIndex(pstrFontAlias);。

回调函数最终调用客户端工程CTrancodeManager::OnControlCreated(DuiLib::CControlUI* pControl)和CDialogBuilderCallbackEx::OnControlCreated(DuiLib::CControlUI* pControl),并在这两个函数中设置字体等属性。

html中不要再设置这些控件的font属性了,否则以html中的字体为优先。

但是,OnControlCreated只对在xml中解析出来的控件创建时才会被调用,因为是在CDialogBuilder::_Parse函数中调用的该函数,对于在代码中new的控件则不会被调用。为此,对CPaintManagerUI进行了改造。

因为即使是在代码中new的控件,也会调用SetManager,所以为CPaintManagerUI增加了回调IPaintManagerCallback,并设计了socgui2::CPaintManagerCallback类,静态成员获取单例,要为每个paintmanager设置该单例指针。在WindowImplBaseEx以及CMainFrame等的构造函数中m_PaintManager.SetCallback(CPaintManagerCallback::GetInstance())。

所以在CPaintManagerCallback::OnControlSetManager中也是一个改变控件属性的地方。

2、后期开发的控件类

这些类可以直接使用类CThemes,所以可以直接在类中使用CThemes中的函数取得字体等外观属性,比如CListUIEx的构造函数中直接调用了CThemes中的函数以确定行高。

3、注意,要在dialog的XML文件开始加上Include source="font.xml"

因为弹出的对话框是独立的manager,所以要加上字体定义的XML,否则字体不起作用。