CPtrArray是啥,怎么用?

主标题:CPtrArray是啥,怎么用?

副标题:FooButton是如何实现“分组”的(AddToGroup)(前置二)

如下为部分源码[CPtrArray 类 | Microsoft Docs]

...  
  // 通过字符串,创建或者获取一段内存地址
  void* pGroup = NULL;
  getButtonGroup (strGroupName, pGroup);
  if (pGroup == NULL) {
      pGroup = new CPtrArray();
      ASSERT (pGroup != NULL);
      // 申请这段内存地址到pGroup中
      m_btnGroups.SetAt (strGroupName, pGroup);
  }

  //删除以前的内存地址
  removeFromGroup();

  // Add button's HWND to group if not already present
  m_strButtonGroup = strGroupName;
  int nButtons = ((CPtrArray *) pGroup)->GetSize();
  for (int nIndex=0; (nIndex < nButtons); nIndex++)
      if (((CPtrArray *) pGroup)->GetAt (nIndex) == this)
         return (true);
  ((CPtrArray *) pGroup)->Add (GetSafeHwnd());
...  

了解一个函数 CPtrArray

支持 void 指针数组。

我理解的是:将一段内存地址分割成很多份,每一份称为一个元素,每一个元素里面都存放着一个地址。也就是说可以将地址分隔。

如下,为该函数的操作方法。

属性 说明
CPtrArray::Add 向数组的末尾添加一个元素;根据需要扩展该数组。
CPtrArray::Append 将另一个数组追加到该数组中;根据需要扩展该数组。
CPtrArray::Copy 将另一个数组复制到该数组;根据需要扩展该数组。
CPtrArray::Value.elementat 在该数组中返回对元素指针的临时引用。
CPtrArray::FreeExtra 若高于当前的上限,则将释放所有未使用的内存。
CPtrArray::GetAt 返回给定索引位置处的值。
CPtrArray::GetCount 获取此数组中的元素数。
CPtrArray::GetData 允许访问该数组中的元素。 可以为 NULL
CPtrArray::GetSize 获取此数组中的元素数。
CPtrArray::System.array.getupperbound 返回最大的有效索引。
CPtrArray::InsertAt 在指定索引处插入一个元素(或另一个数组中的所有元素)。
CPtrArray::IsEmpty 确定数组是否为空。
CPtrArray::RemoveAll 从此数组中移除所有元素。
CPtrArray::RemoveAt 移除特定索引处的元素。
CPtrArray::SetAt 设置给定索引的值;不允许对该数组进行扩展。
CPtrArray::SetAtGrow 设置给定索引的值;根据需要扩展该数组。
CPtrArray::SetSize 设置要在该数组中包含的元素数。

列如:源码所示,

程序先用函数getButtonGroup也就是CMapStringToPtr.Lookup()来获取一段指定的内存。

然后判断内存是否存在,

->不存在则创建这段内存地址。

->存在则直接将这段地址里面的元素遍历,查看是否使用存在当前需要存储的地址。不存在这段地址就将需要存储的地址放进去。方便下次使用。


下面为上面实例函数用到的函数详细。

void FooButton::getButtonGroup
  (CString strGroupName,
   void* & pGroup)
{
  pGroup = NULL;
  m_btnGroups.Lookup (strGroupName, pGroup);
}

bool FooButton::removeFromGroup()
{
  // Return if not a member of a button group
  if (m_strButtonGroup.IsEmpty())
     return (false);

  // Return if group doesn't exist
  void* pGroup = NULL;
  getButtonGroup (m_strButtonGroup, pGroup);
  if (pGroup == NULL) {
      ASSERT (FALSE);
      return (false);
  }

  // Remove the button's HWND from the group
  int nButtons = ((CPtrArray *) pGroup)->GetSize();
  for (int nIndex=0; (nIndex < nButtons); nIndex++) {
      if (((CPtrArray *) pGroup)->GetAt (nIndex) == GetSafeHwnd()) {
          ((CPtrArray *) pGroup)->RemoveAt (nIndex);
          m_strButtonGroup.Empty();
          return (true);
      }
  }

  // Button wasn't part of the group
  ASSERT (FALSE);
  return (false);
}

时间:2021年8月28日11:10:25

作者:Abraverman

posted @ 2021-08-28 14:06  Abraverman  阅读(269)  评论(0编辑  收藏  举报