精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品开源心得,转载请注明:“锐英源www.wisestudy.cn,孙老师作品,电话13803810136。”需要全文内容也请联系孙老师。英文原文
我需要个ListBox能显示和选择字体。打算自己写,实现如下要求:
为了管理MRU子列表,共享与否,CFontListBox使用了由CfontListManager实例提供的服务。在程序初始化时只有一个CFontListManager实例自动创建。这个类负责加载字体列表,管理MRU列表(对CFontListBox来说是私有,在2个或更多控件间共享,或对应用程序来说是全局的),管理是通过CFontDescriptor和CfontMruList对象和它的各类集合来实现的。
这个控件从COMDLG32.DLL里获取要显示的位图资源,所以不需要特别的资源加到此工程里。
为了允许对字体列表的加载处理,这个控件和别的控件不一样,使用方法也不一样。我尝试区分字体类型(TrueType,OpenType等等)。它使用了由::EnumFontFamiliesEx函数提供的标志给回调函数(参见FontListManager.cpp 内的EnumFontProc和CFontListManager::FillFontList())
需要对于基类ListBox进行重新创建来允许修改,进而支持CFontListBox风格标志。
MRU列表持久化需要2个函数,这2个函数要在CWinApp::InitInstance 和 CWinApp::ExitInstance里调用。当CFontListManager实例创建的实际需要来决定的,这时CWinApp::SetCurrentHandles()还没调用(这个MFC函数负责初始化CwinApp的数据成员,比如m_pszRegistryKey 和 m_pszProfileName)。持久化只对全局MRU列表和定制命名过的某些起作用,命名过的是经过标记的列表。
CFontListManager有允许对系统范围内广播消息 WM_FONTCHANGE重响应的特点。这个特点需要顶层窗口来接收消息,这个顶层窗口一旦CFontListBox创建了,也会创建(这只会在CwinApp对象和其它框架或对话框窗口初始化后发生)