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