首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

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

请教大家这一段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的字符串

热点排行