骄傲の猫的专栏

管理一群程序员,就象放牧一群骄傲的猫。

用户操作
[即时聊天] [发私信] [加为好友]
骄傲的猫ID:ShardowM
3221次访问,排名2万外好友2人,关注者5
编程
ShardowM的文章
原创 5 篇
翻译 0 篇
转载 1 篇
评论 5 篇
最近评论
sky04:刚好在找这个方面资料,谢谢了
henry:现在比较清楚你的意思是什么了。下面有一些讨论:

--“花费一定的时间来构建链表”是指内存池在分配到一块大的内存后,需要在这块内存中建立链表,链接链表中各个节点的关系。

这个时间只是在构建 pool 时一次花销的。比起大量反复分配/释放小物件内存的实际客户程序的实际应该不算什么。

-- 我说的很大困难是指创建一个通用的内存池。
<……
骄傲的猫:把allocate改成下面那个样子,应该更合理
void* Pool::allocate(size_t size)
{
if (size != _block)
return ::operator new(size);

//在被stackPtr堆栈中获得内存的地址
if (top > 0) ……
骄傲的猫:我说的很大困难是指创建一个通用的内存池。在Scott Meyers的Effective C++中介绍的内存池,是通过在被创建的对象中加一个Next指针使其指向下一个对象来建立链表的,这样的话内存池在给对象分配内存时必须通过Next指针来知道下一个对象的地址,因此内存池类就必须知道对象的类的接口,因此也无法将内存池类和对象的类独立出来。
“花费一定的时间来构建链表”是指内存池在分配到一……
henry:-- 但是正是由于链表,给创建一个可通用的内存池类带来了很大的困难,而且在程序必须花费一定的时间来构建链表。

这句话很费解。操作链表很容易,怎么会有什么很大困难?楼主的很大困难具体指的是什么?另外,“花费一定的时间来构建链表”又具体指什么?
文章分类
收藏
    相册
    朋友
    jewely的Blog(RSS)
    Mailbomb的J2ME专栏(RSS)
    英文技术网站
    Code Guru
    Code Project
    NDSTech
    Planet Source Code
    Programmers Heavern
    SGI
    中文技术网站
    CSDN_GameDev的专栏(RSS)
    Winmag国际中文版(简体版)
    中国协议分析网
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 CListCtrl组件的使用收藏

    新一篇: 文件夹选择对话框的使用 | 旧一篇: 如何正确创建DLL和使用DLL

     CListCtrl组件的使用 

    作者:骄傲的猫

    1. 创建CListCtrl

    在对话框窗体中创建的话,只要用资源编辑器在Dialog资源上添加一个CListCtrl就可以了,这里不作详述。这里主要将一下如何在非对话框窗体中使用CListCtrl类提供的Create函数创建对象。

    这种情况创建对象一般分为两步,第一步构造CListCtrl类的对象,第二步调用对象的Create函数在程序界面上创建可视化组件(该方法一般在OnInitialUpdate或OnCreate事件中调用)。下面我们来看一下Create函数的原型。

    virtual BOOL Create(
        DWORD           dwStyle,
        const RECT&    rect,
        CWnd*              pParentWnd,
        UINT                 nID
    );
    
    第一个参数dwStyle指定了创建的ListCtrl的样式,具体有哪些可选样式可以查看SDK的文档。

    第二个参数rect指定创建的ListCtrl的大小和位置。

    第三个参数pParentWnd指定创建的ListCtrl的父窗体。

    第四个参数nID指定创建的ListCtrl的ID值。

     如果Create函数调用成功则返回TRUE(非零),否则返回FALSE(零)

     

    2. 添加显示列(Column)

    如果创建的ListCtrl具有LVS_REPORT样式,则可以显示多列数据,则一节我们将讲解如何为CListCtrl组件添加列。

    添加列使用CListCtrl对象的成员函数InsertColumn,该函数有两种重载形式,下面让我们看一下他们的原型。

    int InsertColumn(
                int nCol, 
                const LVCOLUMN* pColumn
    );
    
    int InsertColumn(
                 int nCol,
                 LPCTSTR lpszColumnHeading,
                 int nFormat = LVCFMT_LEFT,
                 int nWidth = -1,
                 int nSubItem = -1
    );

     参数nCol指定创建的新列的index。

    参数pColumn指向一个LVCOLUMN结构体,该结构体包含创建的新列的属性。

    参数lpszColumnHeading指定列名。

    参数nFormat 指定列的对齐方式,它的值可以是LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER之一。

    参数nWidth指定列宽。

    参数nSubItem指定与改列关联的子项的index。

    LVCOLUMN结构的定义如下:

    typedef struct _LVCOLUMN { 
        UINT mask; 
        int fmt; 
        int cx; 
        LPTSTR pszText; 
        int cchTextMax; 
        int iSubItem; 
    #if (_WIN32_IE >= 0x0300)
        int iImage;
        int iOrder;
    #endif
    } LVCOLUMN, *LPLVCOLUMN; 
    

    mask成员指定该结构提可以指定哪些成员有效:
               LVCF_FMT:               fmt成员有效
               LVCF_IMAGE:           iImage成员有效
               LVCF_ORDER:        iOrder成员有效
               LVCF_SUBITEM:     iSubItem成员有效
               LVCF_TEXT:             pszText成员有效
               LVCF_WIDTH:         cx成员有效

    fmt成员指定列表头的对齐方式

    cx指定列宽

    pszText指定显示的列表头

    cchTextMax指定pszText指向的缓存的大小,如果不返回列的信息,该成员可以忽略

    iSubItem与列关联的subitem的index

    iImage与CListCtrl关联的CImageList对象用一个图象的index。

    iOrder该列显示在第几列。

     下面是在CListCtrl中插入列的示例代码。

    	LVCOLUMN  col;
    	col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_ORDER;
    	col.fmt =  LVCFMT_LEFT;
    	col.cx = 75;
    	col.pszText = _T("File Name");
    	col.iOrder = 2;
    	m_pListCtr.InsertColumn(0, &col);
    	
    	col.fmt = LVCFMT_RIGHT;
    	col.cx = 50;
    	col.pszText = _T("Finished");
    	col.iOrder = 0;
    	m_pListCtr.InsertColumn(1, &col);
    
    	col.cx = 50;
    	col.pszText = _T("Size");
    	col.iOrder = 3;
    	m_pListCtr.InsertColumn(2, &col);
    
    	col.cx = 50;
    	col.pszText = _T("Speed");
    	col.iOrder = 1;
    	m_pListCtr.InsertColumn(3, &col);

     

    3. 添加显示行(Item)

    CListCtrl中用InsertItem添加行,并用SetItem为该Item设置子项(SubItem)。首先让我们看一下InsertItem函数,它的的原型如下。

    int InsertItem(
       const LVITEM* pItem 
    );
    int InsertItem(
       int nItem,
       LPCTSTR lpszItem 
    );
    int InsertItem(
       int nItem,
       LPCTSTR lpszItem,
       int nImage 
    );
    

     从上面的代码可以看出InsertItem用到了一个结构体LVITEM,在该结构体中保存将要创建的Item的属性,LVITEM的定义如下。

    typedef struct _LVITEM { 
      UINT mask; 
      int iItem; 
      int iSubItem; 
      UINT state; 
      UINT stateMask; 
      LPTSTR pszText; 
      int cchTextMax; 
      int iImage; 
      LPARAM lParam;
      #if (_WIN32_IE >= 0x0300)
        int iIndent;
      #endif
        int iGroupId;
    } LVITEM; 
     

    mask成员同LVCOLUMN中的mask成员功能相同,我们用它来指定在LVITEM中哪些成员是有效的。
    iItem指定新建的Item的index。
    iSubItem指定新建的Item在一列上对应的SubItem的Index。
    pszText指定该Item显示的内容
    iImage指定该Item显示的图片

     

    示例
    LVITEM lvi;
    lvi.mask = LVIF_TEXT;
    
    lvi.iItem = 0;
    lvi.iSubItem = 0;
    lvi.pszText = _T("Hell.zip");
    int i = m_pListCtr.InsertItem(&lvi);
    
    m_pListCtr.SetItemText(i, 1, _T("50%"));
    m_pListCtr.SetItemText(i, 2, _T("100M"));
    m_pListCtr.SetItemText(i, 3, _T("40K/S"));

    发表于 @ 2008年06月03日 14:10:00|评论(loading...)|

    新一篇: 文件夹选择对话框的使用 | 旧一篇: 如何正确创建DLL和使用DLL

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 骄傲的猫