⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlapi.c

📁 C语言编程中算法数据结构中的树行代码
💻 C
📖 第 1 页 / 共 3 页
字号:
  //  //{

  //    // Generate Full Qualified pidl
  //    pidl = IL_Create(g_lpMalloc,lpdl->pidl,lpdl->cbidl,lplvid->pidl,0);

  //    SHGetFileInfo((LPCSTR)pidl,0,&shfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_SYSICONINDEX);

  //    lpdi->item.iImage = shfi.iIcon;

  //    g_lpMalloc->lpVtbl->Free(g_lpMalloc,pidl);
  //    //lpMalloc->lpVtbl->Release(lpMalloc);

  //  //}

  //  // It proved necessary to reset the state bits...
  //  lpdi->item.stateMask = 0;
  //  lpdi->item.state = 0;

  //  // Link and Share Overlay
  //  lplvid->lpsf->lpVtbl->GetAttributesOf(
  //                          lplvid->lpsf,
  //                          1,&lplvid->pidl,
  //                          &dwAttributes);

  //  if (dwAttributes & SFGAO_LINK)
  //  {
  //    lpdi->item.mask |= LVIF_STATE;
  //    lpdi->item.stateMask |= LVIS_OVERLAYMASK;
  //    lpdi->item.state |= INDEXTOOVERLAYMASK(2);
  //  }

  //  if (dwAttributes & SFGAO_SHARE)
  //  {
  //    lpdi->item.mask |= LVIF_STATE;
  //    lpdi->item.stateMask |= LVIS_OVERLAYMASK;
  //    lpdi->item.state |= INDEXTOOVERLAYMASK(1);
  //  }

  //  // Fade hidden/system files
  //  if (!bNoFadeHidden)
  //  {
  //    WIN32_FIND_DATA fd;
  //    if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,lplvid->pidl,
  //                     SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA)))
  //    {
  //      if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ||
  //          (fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
  //      {
  //        lpdi->item.mask |= LVIF_STATE;
  //        lpdi->item.stateMask |= LVIS_CUT;
  //        lpdi->item.state |= LVIS_CUT;
  //      }
  //    }

  //  }

  //}

  // Set values
  lpdi->item.mask |= LVIF_DI_SETITEM;

  return TRUE;

}


//=============================================================================
//
//  DirList_DeleteItem()
//
//  Must be called in response to a WM_NOTIFY/LVN_DELETEITEM message
//  from the control
//
BOOL DirList_DeleteItem(HWND hwnd,LPARAM lParam)
{

  LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);

  LV_ITEM lvi;
  //LPMALLOC lpMalloc;

  NM_LISTVIEW *lpnmlv = (LPVOID)lParam;

  lvi.iItem = lpnmlv->iItem;
  lvi.iSubItem = 0;
  lvi.mask = LVIF_PARAM;

  if (ListView_GetItem(hwnd,&lvi))
  {

    //if (NOERROR == SHGetMalloc(&lpMalloc))
    //{

      // Free mem
      LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lvi.lParam;
      g_lpMalloc->lpVtbl->Free(g_lpMalloc,lplvid->pidl);
      lplvid->lpsf->lpVtbl->Release(lplvid->lpsf);

      g_lpMalloc->lpVtbl->Free(g_lpMalloc,lplvid);

      //lpMalloc->lpVtbl->Release(lpMalloc);

      return TRUE;

    //}

  }

  else
    return FALSE;

}


//=============================================================================
//
//  DirList_CompareProc()
//
//  Compares two list items
//
int CALLBACK DirList_CompareProcFw(LPARAM lp1,LPARAM lp2,LPARAM lFlags)
{

  HRESULT hr;

  LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1;
  LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2;

  hr = (lplvid1->lpsf->lpVtbl->CompareIDs(
                                 lplvid1->lpsf,
                                 lFlags,
                                 lplvid1->pidl,
                                 lplvid2->pidl));

  return(short)(SCODE_CODE(GetScode(hr)));

}

int CALLBACK DirList_CompareProcRw(LPARAM lp1,LPARAM lp2,LPARAM lFlags)
{

  HRESULT hr;

  LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1;
  LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2;

  hr = (lplvid1->lpsf->lpVtbl->CompareIDs(
                                 lplvid1->lpsf,
                                 lFlags,
                                 lplvid1->pidl,
                                 lplvid2->pidl));

  return(-(short)(SCODE_CODE(GetScode(hr))));

}


//=============================================================================
//
//  DirList_Sort()
//
//  Sorts the listview control by the specified order
//
BOOL DirList_Sort(HWND hwnd,int lFlags,BOOL fRev)
{

  LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);

  if (fRev)

    return ListView_SortItems(hwnd,DirList_CompareProcRw,lFlags);

  else

    return ListView_SortItems(hwnd,DirList_CompareProcFw,lFlags);

}


//=============================================================================
//
//  DirList_GetItem()
//
//  Copies the data of the specified item in the listview control to a buffer
//
int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli)
{

  LV_ITEM lvi;
  LPLV_ITEMDATA lplvid;

  ULONG dwAttributes = SFGAO_FILESYSTEM;


  if (iItem == -1)
  {

    if (ListView_GetSelectedCount(hwnd))

      iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);

    else

      return(-1);

  }

  lvi.mask = LVIF_PARAM;
  lvi.iItem = iItem;
  lvi.iSubItem = 0;

  if (!ListView_GetItem(hwnd,&lvi))
  {

    if (lpdli->mask & DLI_TYPE)

      lpdli->ntype = DLE_NONE;

    return(-1);

  }

  lplvid = (LPLV_ITEMDATA)lvi.lParam;

  // Filename
  if (lpdli->mask & DLI_FILENAME)

    IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_FORPARSING,
                      lpdli->szFileName,MAX_PATH);

  // Displayname
  if (lpdli->mask & DLI_DISPNAME)

    IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_INFOLDER,
                      lpdli->szDisplayName,MAX_PATH);

  // Type (File / Directory)
  if (lpdli->mask & DLI_TYPE)
  {

    WIN32_FIND_DATA fd;

    if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,
                                       lplvid->pidl,
                                       SHGDFIL_FINDDATA,
                                       &fd,
                                       sizeof(WIN32_FIND_DATA)))

    lpdli->ntype = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ?
                    DLE_DIR : DLE_FILE;

    /*lplvid->lpsf->lpVtbl->GetAttributesOf(
                            lplvid->lpsf,
                            1,
                            &lplvid->pidl,
                            &dwAttributes);

    lpdli->ntype = (dwAttributes & SFGAO_FOLDER) ? DLE_DIR : DLE_FILE;*/

  }

  return iItem;

}


//=============================================================================
//
//  DirList_GetItemEx()
//
//  Retrieves extended infomration on a dirlist item
//
int DirList_GetItemEx(HWND hwnd,int iItem,LPWIN32_FIND_DATA pfd)
{

  LV_ITEM lvi;
  LPLV_ITEMDATA lplvid;


  if (iItem == -1)
  {

    if (ListView_GetSelectedCount(hwnd))

      iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);

    else

      return(-1);

  }

  lvi.mask = LVIF_PARAM;
  lvi.iItem = iItem;
  lvi.iSubItem = 0;

  if (!ListView_GetItem(hwnd,&lvi))
    return(-1);

  lplvid = (LPLV_ITEMDATA)lvi.lParam;

  if (NOERROR == SHGetDataFromIDList(lplvid->lpsf,
                                     lplvid->pidl,
                                     SHGDFIL_FINDDATA,
                                     pfd,
                                     sizeof(WIN32_FIND_DATA)))
    return iItem;

  else
    return(-1);

}


//=============================================================================
//
//  DirList_PropertyDlg()
//
//  Shows standard Win95 Property Dlg for selected Item
//
BOOL DirList_PropertyDlg(HWND hwnd,int iItem)
{

  LV_ITEM lvi;
  LPLV_ITEMDATA lplvid;
  LPCONTEXTMENU lpcm;
  CMINVOKECOMMANDINFO cmi;
  BOOL bSuccess = TRUE;

  static const char *lpVerb = "properties";

  if (iItem == -1)
  {
    if (ListView_GetSelectedCount(hwnd))
      iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED);

    else
      return FALSE;
  }

  lvi.mask = LVIF_PARAM;
  lvi.iItem = iItem;
  lvi.iSubItem = 0;

  if (!ListView_GetItem(hwnd,&lvi))
    return FALSE;

  lplvid = (LPLV_ITEMDATA)lvi.lParam;

  if (NOERROR == lplvid->lpsf->lpVtbl->GetUIObjectOf(
                                         lplvid->lpsf,
                                         GetParent(hwnd),  // Owner
                                         1,                // Number of objects
                                         &lplvid->pidl,    // pidl
                                         &IID_IContextMenu,
                                         NULL,
                                         &lpcm))
  {

    cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
    cmi.fMask = 0;
    cmi.hwnd = GetParent(hwnd);
    cmi.lpVerb = lpVerb;
    cmi.lpParameters = NULL;
    cmi.lpDirectory = NULL;
    cmi.nShow = SW_SHOWNORMAL;
    cmi.dwHotKey = 0;
    cmi.hIcon = NULL;

    if (NOERROR != lpcm->lpVtbl->InvokeCommand(lpcm,&cmi))
      bSuccess = FALSE;

    lpcm->lpVtbl->Release(lpcm);

  }

  else
    bSuccess = FALSE;

  return(bSuccess);

}



//=============================================================================
//
//  DirList_DoDragDrop()
//
//  Execute an OLE Drag & Drop Operation in response to LVN_BEGIN(R)DRAG
//
//extern LPDROPSOURCE CreateDropSource();

void DirList_DoDragDrop(HWND hwnd,LPARAM lParam)
{

  //LV_ITEM lvi;
  //LPLV_ITEMDATA lplvid;
  //LPDATAOBJECT lpdo;
  //LPDROPSOURCE lpds;
  //DWORD dwEffect;
  //NM_LISTVIEW *pnmlv = (LPVOID)lParam;

  //lvi.iItem = pnmlv->iItem;
  //lvi.iSubItem = 0;
  //lvi.mask = LVIF_PARAM;

  //if (ListView_GetItem(hwnd,&lvi))
  //{

  //  lplvid = (LPLV_ITEMDATA)lvi.lParam;

  //  if (SUCCEEDED(lplvid->lpsf->lpVtbl->GetUIObjectOf(
  //                                        lplvid->lpsf,
  //                                        GetParent(hwnd),
  //                                        1,
  //                                        &lplvid->pidl,
  //                                        &IID_IDataObject,
  //                                        NULL,
  //                                        &lpdo)))
  //  {

  //    lpds = CreateDropSource();

  //    DoDragDrop(lpdo,lpds,DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK,&dwEffect);

  //    lpdo->lpVtbl->Release(lpdo);
  //    lpds->lpVtbl->Release(lpds);

  //  }
  //}
}



//=============================================================================
//
//  DirList_GetLongPathName()
//
//  Get long pathname for currently displayed directory
//
BOOL DirList_GetLongPathName(HWND hwnd,LPSTR lpszLongPath)
{
  char tch[MAX_PATH];
  LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp);
  if (SHGetPathFromIDList(lpdl->pidl,tch))
  {
    lstrcpy(lpszLongPath,tch);
    return(TRUE);
  }
  else
    return(FALSE);
}



//=============================================================================
//
//  DirList_SelectItem()
//
//  Select specified item in the list
//
BOOL DirList_SelectItem(HWND hwnd,LPCSTR lpszDisplayName,LPCSTR lpszFullPath)
{

  #define LVIS_FLAGS LVIS_SELECTED|LVIS_FOCUSED

  char szShortPath[MAX_PATH];
  SHFILEINFO  shfi;

  LV_FINDINFO lvfi;
  DLITEM dli;

  int i = -1;

  if (!lpszFullPath || !lstrlen(lpszFullPath))
    return(FALSE);
  else
    GetShortPathName(lpszFullPath,szShortPath,MAX_PATH);

  if (!lpszDisplayName || !lstrlen(lpszDisplayName))
    SHGetFileInfo(lpszFullPath,0,&shfi,sizeof(SHFILEINFO),SHGFI_DISPLAYNAME);
  else
    lstrcpyn(shfi.szDisplayName,lpszDisplayName,MAX_PATH);

  lvfi.flags = LVFI_STRING;
  lvfi.psz   = shfi.szDisplayName;

  dli.mask = DLI_ALL;

  while ((i = ListView_FindItem(hwnd,i,&lvfi)) != -1)
  {

    DirList_GetItem(hwnd,i,&dli);
    GetShortPathName(dli.szFileName,dli.szFileName,MAX_PATH);

    if (!lstrcmpi(dli.szFileName,szShortPath))
    {
      ListView_SetItemState(hwnd,i,LVIS_FLAGS,LVIS_FLAGS);
      ListView_EnsureVisible(hwnd,i,FALSE);

      return(TRUE);
    }

  }

  return(FALSE);

}



//=============================================================================
//
//  DirList_CreateFilter()
//
//  Create a valid DL_FILTER structure
//
void DirList_CreateFilter(PDL_FILTER pdlf,LPCSTR lpszFileSpec,
                          BOOL bExcludeFilter)
{

  char *p;

  ZeroMemory(pdlf,sizeof(DL_FILTER));
  lstrcpyn(pdlf->tFilterBuf,lpszFileSpec,(DL_FILTER_BUFSIZE-1));
  pdlf->bExcludeFilter = bExcludeFilter;

  if (!lstrcmp(lpszFileSpec,"*.*") || !lstrlen(lpszFileSpec))
    return;

  pdlf->nCount = 1;
  pdlf->pFilter[0] = &pdlf->tFilterBuf[0];    // Zeile zum Ausprobieren

  while (p = strchr(pdlf->pFilter[pdlf->nCount-1],';'))
  {
    *p = '\0';                              // Replace ';' by '\0'
    pdlf->pFilter[pdlf->nCount] = (p + 1);  // Next position after ';'
    pdlf->nCount++;                         // Increase number of filters
  }

}



//=============================================================================
//
//  DirList_MatchFilter()
//
//  Check if a specified item matches a given filter
//
BOOL DirList_MatchFilter(LPSHELLFOLDER lpsf,LPCITEMIDLIST pidl,PDL_FILTER pdlf)
{

  int i;
  WIN32_FIND_DATA fd;
  BOOL bMatchSpec;

  // Immediately return true if lpszFileSpec is *.* or NULL
  if (pdlf->nCount == 0 && !pdlf->bExcludeFilter)
    return TRUE;

  SHGetDataFromIDList(lpsf,pidl,SHGDFIL_FINDDATA,&fd,sizeof(WIN32_FIND_DATA));

  // All the directories are added
  if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    return(TRUE);

  // Check if exclude *.* after directories have been added
  if (pdlf->nCount == 0 && pdlf->bExcludeFilter)
    return FALSE;

  for (i = 0; i < pdlf->nCount; i++)
  {
    if (*pdlf->pFilter[i]) // Filters like "\0" are ignored
    {
      bMatchSpec = PathMatchSpec(fd.cFileName,pdlf->pFilter[i]);
      if (bMatchSpec)
      {
        if (!pdlf->bExcludeFilter)
          return(TRUE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -