atlshellextbase.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:6k
源码类别:

Shell编程

开发平台:

Visual C++

  1. //
  2. // Written by Bjarke Viksoe (bjarke@viksoe.dk)
  3. // Copyright (c) 2001 Bjarke Viksoe.
  4. //
  5. // This code may be used in compiled form in any way you desire. This
  6. // file may be redistributed by any means PROVIDING it is 
  7. // not sold for profit without the authors written consent, and 
  8. // providing that this notice and the authors name is included. 
  9. //
  10. // This file is provided "as is" with no expressed or implied warranty.
  11. // The author accepts no liability if it causes any damage to you or your
  12. // computer whatsoever. It's free, so don't hassle me about it.
  13. //
  14. // Beware of bugs.
  15. #ifndef __ATLSHELLEXTBASE_H__
  16. #define __ATLSHELLEXTBASE_H__
  17. #pragma once
  18. #ifndef __cplusplus
  19.    #error ATL requires C++ compilation (use a .cpp suffix)
  20. #endif
  21. #ifndef __ATLBASE_H__
  22.    #error atlshellbase.h requires atlbase.h to be included first
  23. #endif
  24. #include <shlobj.h>
  25. #include <shlguid.h> 
  26. #include <shellapi.h>
  27. #include <commctrl.h>
  28. #pragma comment(lib, "shell32.lib")
  29. #pragma comment(lib, "comctl32.lib")
  30. class CShellMalloc
  31. {
  32. public:
  33.    LPMALLOC m_pMalloc;
  34.    void Init()
  35.    {
  36.       m_pMalloc = NULL;
  37.       // It is safe to call ::SHGetMalloc()/::CoGetMalloc() without
  38.       // first calling ::CoInitialize() according to MSDN.
  39.       if( FAILED( ::SHGetMalloc(&m_pMalloc) ) ) {
  40.          // TODO: TERMINATE
  41.       }
  42.    }
  43.    void Term()
  44.    {
  45.       if( m_pMalloc!=NULL ) m_pMalloc->Release();
  46.    }
  47.    operator LPMALLOC() const
  48.    {
  49.       return m_pMalloc;
  50.    }
  51.    LPVOID Alloc(ULONG cb)
  52.    {
  53.       ATLASSERT(m_pMalloc!=NULL);
  54.       ATLASSERT(cb>0);
  55.       return m_pMalloc->Alloc(cb);
  56.    }
  57.    void Free(LPVOID p)
  58.    {
  59.       ATLASSERT(m_pMalloc!=NULL);
  60.       ATLASSERT(p);
  61.       m_pMalloc->Free(p);
  62.    }
  63. };
  64. class CShellImageLists
  65. {
  66. public:
  67.    HIMAGELIST m_hImageListSmall;
  68.    HIMAGELIST m_hImageListLarge;
  69.    CShellImageLists() :
  70.       m_hImageListSmall(NULL), m_hImageListLarge(NULL)
  71.    {
  72.    }
  73.    virtual ~CShellImageLists()
  74.    {
  75.       if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
  76.       if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
  77.    }
  78.    BOOL Create(HINSTANCE hResource, LPCTSTR RootID, LPCTSTR FolderID)
  79.    {
  80.       // Set the small image list
  81.       if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
  82.       int nSmallCx = ::GetSystemMetrics(SM_CXSMICON);
  83.       int nSmallCy = ::GetSystemMetrics(SM_CYSMICON);
  84.       m_hImageListSmall = ImageList_Create(nSmallCx, nSmallCy, ILC_COLORDDB | ILC_MASK, 4, 0);
  85.       // Set the large image list
  86.       if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
  87.       int nLargeCx = ::GetSystemMetrics(SM_CXICON);
  88.       int nLargeCy = ::GetSystemMetrics(SM_CYICON);
  89.       m_hImageListLarge = ImageList_Create(nLargeCx, nLargeCy, ILC_COLORDDB | ILC_MASK, 4, 0);
  90.       
  91.       if(m_hImageListSmall) {
  92.          HICON hIcon;
  93.          hIcon = (HICON)::LoadImage(hResource, 
  94.                                     MAKEINTRESOURCE(RootID),
  95.                                     IMAGE_ICON, 
  96.                                     nSmallCx, nSmallCy, 
  97.                                     LR_DEFAULTCOLOR);
  98.          ImageList_AddIcon(m_hImageListSmall, hIcon);
  99.          hIcon = (HICON)::LoadImage(hResource, 
  100.                                     MAKEINTRESOURCE(FolderID),
  101.                                     IMAGE_ICON, 
  102.                                     nSmallCx, nSmallCy, 
  103.                                     LR_DEFAULTCOLOR);
  104.          ImageList_AddIcon(m_hImageListSmall, hIcon);
  105.       }      
  106.       if(m_hImageListSmall) {
  107.          HICON hIcon;
  108.          hIcon = (HICON)::LoadImage(hResource,
  109.                                     MAKEINTRESOURCE(RootID),
  110.                                     IMAGE_ICON,
  111.                                     nLargeCx, nLargeCy,
  112.                                     LR_DEFAULTCOLOR);
  113.          ImageList_AddIcon(m_hImageListLarge, hIcon);
  114.          hIcon = (HICON)::LoadImage(hResource,
  115.                                     MAKEINTRESOURCE(FolderID),
  116.                                     IMAGE_ICON,
  117.                                     nLargeCx, nLargeCy,
  118.                                     LR_DEFAULTCOLOR);
  119.          ImageList_AddIcon(m_hImageListLarge, hIcon);
  120.       }
  121.       
  122.       return TRUE;
  123.    }
  124. };
  125. class CShellModule : public CComModule
  126. {
  127. public:
  128.    HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid=NULL)
  129.    {
  130.       ::OleInitialize(NULL);
  131. #ifdef INITCOMMONCONTROLSEX
  132.       INITCOMMONCONTROLSEX iccex;
  133.       iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  134.       iccex.dwICC = ICC_LISTVIEW_CLASSES;
  135.       ::InitCommonControlsEx(&iccex);
  136. #else
  137.       ::InitCommonControls();
  138. #endif // INITCOMMONCONTROLSEX
  139. #ifndef _NO_CLIPFORMATS
  140. #ifndef CFSTR_LOGICALPERFORMEDDROPEFFECT 
  141. #define CFSTR_LOGICALPERFORMEDDROPEFFECT TEXT("Logical Performed DropEffect")
  142. #endif
  143.       m_CFSTR_FILEDESCRIPTOR             = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
  144.       m_CFSTR_FILECONTENTS               = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILECONTENTS);
  145.       m_CFSTR_PASTESUCCEEDED             = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PASTESUCCEEDED);
  146.       m_CFSTR_LOGICALPERFORMEDDROPEFFECT = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_LOGICALPERFORMEDDROPEFFECT);
  147.       m_CFSTR_PERFORMEDDROPEFFECT        = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT);
  148.       m_CFSTR_PREFERREDDROPEFFECT        = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
  149.       m_CFSTR_SHELLIDLIST                = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
  150. #if (_WIN32_WINNT >= 0x0500)
  151.       m_CFSTR_TARGETCLSID                = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_TARGETCLSID);
  152. #endif // WIN32_WINNT
  153. #endif // _NO_CLIPFORMATS
  154.       m_Allocator.Init();
  155.       return CComModule::Init(p, h, plibid);
  156.    }
  157.    void Term()
  158.    {
  159.       m_Allocator.Term();
  160.       CComModule::Term();
  161.    }
  162.    // Shell Allocator
  163.    CShellMalloc m_Allocator;
  164. #ifndef _NO_CLIPFORMATS
  165.    // Clipboard formats
  166.    CLIPFORMAT m_CFSTR_FILEDESCRIPTOR;
  167.    CLIPFORMAT m_CFSTR_FILECONTENTS;
  168.    CLIPFORMAT m_CFSTR_PASTESUCCEEDED;
  169.    CLIPFORMAT m_CFSTR_PERFORMEDDROPEFFECT;
  170.    CLIPFORMAT m_CFSTR_LOGICALPERFORMEDDROPEFFECT;
  171.    CLIPFORMAT m_CFSTR_PREFERREDDROPEFFECT;
  172.    CLIPFORMAT m_CFSTR_SHELLIDLIST;
  173. #if (_WIN32_WINNT >= 0x0500)
  174.    CLIPFORMAT m_CFSTR_TARGETCLSID;
  175. #endif // _WIN32_WINNT
  176. #endif // _NO_CLIPFORMATS
  177. };
  178. #endif // __ATLSHELLEXTBASE_H__