读书人

这一段C++代码是什么意思?(看好久没

发布时间: 2013-11-30 22:36:00 作者: rapoo

请教大家这一段C++代码是什么意思?(看好久没看懂)
本帖最后由 wsfxzxb 于 2013-11-26 21:40:40 编辑

// 获得指定窗口的类名和标题

void CalcWndText(HWND hwnd, PTSTR szBuf, int nLen)
{
TCHAR szClass[50], szCaption[50], szBufT[150];

if (hwnd == (HWND) NULL)
{
_tcscpy(szBuf, TEXT("(无窗口)"));
return;
}

/* 确定给定的窗口句柄是否标识一个已存在的窗口
BOOL IsWindow( HWND hWnd); */
if (!IsWindow(hwnd))
{
_tcscpy(szBuf, TEXT("(无效窗口)"));
return;
}

// 获得窗口类名和标题
GetClassName(hwnd, szClass, _countof(szClass));
GetWindowText(hwnd, szCaption, _countof(szCaption));

wsprintf(szBufT, TEXT("[%s] %s"), (PTSTR) szClass,
(*szCaption == 0) ? (PTSTR) TEXT("(无标题)") : (PTSTR) szCaption);

/* #define _tcsncpy 宏此处定义为 wcsncpy(仅 C++)
wchar_t *wcsncpy( wchar_t (&strDest)[size], strDest 为目标字符串
const wchar_t* strSource, strSource 为源字符串
size_t count ); count 为要复制的字符数
返回值:返回 strDest,否则显示一个错误 */
_tcsncpy(szBuf, szBufT, nLen - 1);
szBuf[nLen - 1] = 0; // 以 0 终止的字符串
}





///////////////////////////////////////////////////////////////////////////////


// 为了最小化堆栈使用,创建了一个 WALKWINDOWTREEDATA 对象,它用来作为
// WalkWindowTree() 中的局部变量和传递给 WalkWindowTreeRecurse 的指针

// WalkWindowTreeRecurse 使用的数据
typedef struct
{
HWND hwndLB; // 输出列表框的句柄
HWND hwndParent; // 父窗口句柄
int nLevel; // 嵌套深度(树形结构最大层次)
int nIndex; // 列表框项目索引
TCHAR szBuf[100]; // 输出缓冲区
int iBuf; // szBuf 字符缓冲区内的索引

} WALKWINDOWTREEDATA, *PWALKWINDOWTREEDATA;





// 递归遍历窗口树状结构(没看懂)
void WalkWindowTreeRecurse(PWALKWINDOWTREEDATA pWWT)
{
if (!IsWindow(pWWT->hwndParent))
return;

// 每递归一次,增加 2 个字符缓冲区空间
pWWT->nLevel++;
const int nIndexAmount = 2;

// 清空指定长度的缓冲区
for (pWWT->iBuf = 0; pWWT->iBuf < pWWT->nLevel * nIndexAmount; pWWT->iBuf++)
pWWT->szBuf[pWWT->iBuf] = TEXT(' ');

/* 参数二:清空的数组
这个参数看不懂,应该用清空数组长度 iBuf 吧
参数三:剩余缓冲区长度 = 总szBuf长度 - 清空(数组)长度 */
CalcWndText(pWWT->hwndParent, &pWWT->szBuf[pWWT->iBuf],
_countof(pWWT->szBuf) - pWWT->iBuf);

pWWT->nIndex = ListBox_AddString(pWWT->hwndLB, pWWT->szBuf);
ListBox_SetItemData(pWWT->hwndLB, pWWT->nIndex, pWWT->hwndParent);
HWND hwndChild = GetFirstChild(pWWT->hwndParent);

while (hwndChild != NULL)
{
pWWT->hwndParent = hwndChild;
WalkWindowTreeRecurse(pWWT);
hwndChild = GetNextSibling(hwndChild);
}

pWWT->nLevel--;
}


看了几遍,有个地方(已经在代码中指出)着实没看懂,请大神指教。


[解决办法]
输出结果的效果如下:
第三个参数仅仅是计算出除去前缀空格之后的缓存剩余空间的大小.

A1
B2
C2
D3
E3
D2
A2
E2


[解决办法]
考试题吗?

请输入一个长度至少为6的字符串

读书人网 >VC/MFC

热点推荐