随笔 - 181  文章 - 15  trackbacks - 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔分类

随笔档案

My Tech blog

搜索

  •  

最新评论

阅读排行榜

评论排行榜

         目录
        com方式调用matlab(一)
        com方式调用matlab(二) 
        com方式调用matlab(三)
        com方式调用matlab(四) 
        com方式调用matlab(五)
        com方式调用matlab(六)
        com方式调用matlab(附:运行结果及代码)
        在明确了如何读取配置文件以后,现在我们如何将配置文件的信息反馈给用户呢?
        用户当然要通过用户界面和我们程序所提供的一切功能打交道。我们当然不希望一下子把配置文件里面这么多信息一下子全都提供给用户,那么考虑用这样一种所谓“联动”的方式,就是说当用户从下拉列表中选择一个配置名称后,就列出该配置的所有信息。这样似乎要稍微友好一些。另外我们还需要允许用户能够修改配置内容,这样还要从这些动态生成的控件中取得数值。说到这里,肯定大家会想到STL中的Map或List。恩,确实可以这样实现,但是我们有MFC,我们用CTypedPtrMap。
        下面是相关的类定义:
       
class CEditCtrlFactory
{
public:
    
//属性
     CTypedPtrMap<CMapStringToPtr,CString,CWnd*> m_ctrlMap;
public:
    CEditCtrlFactory(
void);
    
~CEditCtrlFactory(void);
    CWnd
* createCtrl(CWnd *wnd,CString typeName,CString attributeName,CRect rect);//创建控件对象
    CWnd* getCtrl(CString attributeName);
    
void disposeAll();
private:
    
//私有方法
    
};

        这里就是用了CTypedPtrMap,声明了一个变量m_ctrlMap,它的索引是一个CString型变量,然后内容为一个CWnd型的指针。我们知道,一切窗体、按钮等等的东西都是从CWnd继承的。我们用CWnd来代指一切需要动态生成的控件(其实在这个程序中,主要动态生成CEdit型和CStatic型控件),这应当算是一个装箱操作了吧。

        方法createCtrl用来创建控件,并放到Map里面,getCtrl用来从Map中取得相应的控件对象。
        下面是createCtrl的详细实现:
       

CWnd* CEditCtrlFactory::createCtrl(CWnd *wnd,CString typeName,CString attributeName,CRect rect)
{
    
//创建cedit对象
    if(typeName=="CEdit")
    {
        CEdit 
*pEdit = new CEdit();
        pEdit
->CreateEx(WS_EX_CLIENTEDGE,"EDIT""", WS_CHILD|WS_VISIBLE,rect,wnd,0);
        
//加入映射表
        m_ctrlMap[attributeName]=pEdit;
        
return pEdit;
    }
    
if(typeName=="CStatic")
    {
        CStatic 
*pStatic=new CStatic();
        pStatic
->Create(attributeName,WS_CHILD|WS_VISIBLE,rect,wnd);
        m_ctrlMap[attributeName]
=pStatic;
        
return pStatic;
    }
    
return NULL;
}

        其实很简单,就是用CreateEx这个方法。参数wnd为容纳这个控件的窗体,rect指明了控件的位置。其他参数都是些宏定义。然后用"m_ctrlMap[attributeName]=控件指针"这句话来把控件放入Map。假如C++能够支持点反射之类的语法的话,这一部分可以写得有趣些,但是据我所知,好像不行;另外听说可以通过定义一些宏之类的东西可以间接实现,这都是我能力之所不及的,有兴趣的人可以自己实践。
        下面是getCtrl()这个方法的实现:
       
CWnd* CEditCtrlFactory::getCtrl(CString attributeName)
{
    
//从映射表中取得cedit对象
    CWnd *pWnd;
    m_ctrlMap.Lookup(attributeName,pWnd);
    
return pWnd;
}
        用了CTypedPtrMap.lookup来根据控件名字来查找控件对象。
        最后,还需要释放这些对象:
}
void CEditCtrlFactory::disposeAll()
{
    
//删除所有edit对象
    for (POSITION pos =m_ctrlMap.GetStartPosition(); pos; )
    {
        CWnd 
*pWnd=0;
        m_ctrlMap.GetNextAssoc(pos, CString(
""), pWnd);
        delete pWnd;
    }
    m_ctrlMap.RemoveAll();
}
        就是不停的通过GetNextAssoc取得Map中的对象指针,然后释放之。最后清空整个Map。
        到这里,两个工具类就介绍完毕了。
posted on 2006-08-21 20:13 littlegai 阅读(542) 评论(0)  编辑 收藏 引用 所属分类: 我的代码玩具

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理