atlshellextbase.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:6k
- //
- // Written by Bjarke Viksoe (bjarke@viksoe.dk)
- // Copyright (c) 2001 Bjarke Viksoe.
- //
- // This code may be used in compiled form in any way you desire. This
- // file may be redistributed by any means PROVIDING it is
- // not sold for profit without the authors written consent, and
- // providing that this notice and the authors name is included.
- //
- // This file is provided "as is" with no expressed or implied warranty.
- // The author accepts no liability if it causes any damage to you or your
- // computer whatsoever. It's free, so don't hassle me about it.
- //
- // Beware of bugs.
- #ifndef __ATLSHELLEXTBASE_H__
- #define __ATLSHELLEXTBASE_H__
- #pragma once
- #ifndef __cplusplus
- #error ATL requires C++ compilation (use a .cpp suffix)
- #endif
- #ifndef __ATLBASE_H__
- #error atlshellbase.h requires atlbase.h to be included first
- #endif
- #include <shlobj.h>
- #include <shlguid.h>
- #include <shellapi.h>
- #include <commctrl.h>
- #pragma comment(lib, "shell32.lib")
- #pragma comment(lib, "comctl32.lib")
- class CShellMalloc
- {
- public:
- LPMALLOC m_pMalloc;
- void Init()
- {
- m_pMalloc = NULL;
- // It is safe to call ::SHGetMalloc()/::CoGetMalloc() without
- // first calling ::CoInitialize() according to MSDN.
- if( FAILED( ::SHGetMalloc(&m_pMalloc) ) ) {
- // TODO: TERMINATE
- }
- }
- void Term()
- {
- if( m_pMalloc!=NULL ) m_pMalloc->Release();
- }
- operator LPMALLOC() const
- {
- return m_pMalloc;
- }
- LPVOID Alloc(ULONG cb)
- {
- ATLASSERT(m_pMalloc!=NULL);
- ATLASSERT(cb>0);
- return m_pMalloc->Alloc(cb);
- }
- void Free(LPVOID p)
- {
- ATLASSERT(m_pMalloc!=NULL);
- ATLASSERT(p);
- m_pMalloc->Free(p);
- }
- };
- class CShellImageLists
- {
- public:
- HIMAGELIST m_hImageListSmall;
- HIMAGELIST m_hImageListLarge;
- CShellImageLists() :
- m_hImageListSmall(NULL), m_hImageListLarge(NULL)
- {
- }
- virtual ~CShellImageLists()
- {
- if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
- if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
- }
- BOOL Create(HINSTANCE hResource, LPCTSTR RootID, LPCTSTR FolderID)
- {
- // Set the small image list
- if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
- int nSmallCx = ::GetSystemMetrics(SM_CXSMICON);
- int nSmallCy = ::GetSystemMetrics(SM_CYSMICON);
- m_hImageListSmall = ImageList_Create(nSmallCx, nSmallCy, ILC_COLORDDB | ILC_MASK, 4, 0);
- // Set the large image list
- if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
- int nLargeCx = ::GetSystemMetrics(SM_CXICON);
- int nLargeCy = ::GetSystemMetrics(SM_CYICON);
- m_hImageListLarge = ImageList_Create(nLargeCx, nLargeCy, ILC_COLORDDB | ILC_MASK, 4, 0);
-
- if(m_hImageListSmall) {
- HICON hIcon;
- hIcon = (HICON)::LoadImage(hResource,
- MAKEINTRESOURCE(RootID),
- IMAGE_ICON,
- nSmallCx, nSmallCy,
- LR_DEFAULTCOLOR);
- ImageList_AddIcon(m_hImageListSmall, hIcon);
- hIcon = (HICON)::LoadImage(hResource,
- MAKEINTRESOURCE(FolderID),
- IMAGE_ICON,
- nSmallCx, nSmallCy,
- LR_DEFAULTCOLOR);
- ImageList_AddIcon(m_hImageListSmall, hIcon);
- }
- if(m_hImageListSmall) {
- HICON hIcon;
- hIcon = (HICON)::LoadImage(hResource,
- MAKEINTRESOURCE(RootID),
- IMAGE_ICON,
- nLargeCx, nLargeCy,
- LR_DEFAULTCOLOR);
- ImageList_AddIcon(m_hImageListLarge, hIcon);
- hIcon = (HICON)::LoadImage(hResource,
- MAKEINTRESOURCE(FolderID),
- IMAGE_ICON,
- nLargeCx, nLargeCy,
- LR_DEFAULTCOLOR);
- ImageList_AddIcon(m_hImageListLarge, hIcon);
- }
-
- return TRUE;
- }
- };
- class CShellModule : public CComModule
- {
- public:
- HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid=NULL)
- {
- ::OleInitialize(NULL);
- #ifdef INITCOMMONCONTROLSEX
- INITCOMMONCONTROLSEX iccex;
- iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
- iccex.dwICC = ICC_LISTVIEW_CLASSES;
- ::InitCommonControlsEx(&iccex);
- #else
- ::InitCommonControls();
- #endif // INITCOMMONCONTROLSEX
- #ifndef _NO_CLIPFORMATS
- #ifndef CFSTR_LOGICALPERFORMEDDROPEFFECT
- #define CFSTR_LOGICALPERFORMEDDROPEFFECT TEXT("Logical Performed DropEffect")
- #endif
- m_CFSTR_FILEDESCRIPTOR = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
- m_CFSTR_FILECONTENTS = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILECONTENTS);
- m_CFSTR_PASTESUCCEEDED = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PASTESUCCEEDED);
- m_CFSTR_LOGICALPERFORMEDDROPEFFECT = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_LOGICALPERFORMEDDROPEFFECT);
- m_CFSTR_PERFORMEDDROPEFFECT = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT);
- m_CFSTR_PREFERREDDROPEFFECT = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
- m_CFSTR_SHELLIDLIST = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
- #if (_WIN32_WINNT >= 0x0500)
- m_CFSTR_TARGETCLSID = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_TARGETCLSID);
- #endif // WIN32_WINNT
- #endif // _NO_CLIPFORMATS
- m_Allocator.Init();
- return CComModule::Init(p, h, plibid);
- }
- void Term()
- {
- m_Allocator.Term();
- CComModule::Term();
- }
- // Shell Allocator
- CShellMalloc m_Allocator;
- #ifndef _NO_CLIPFORMATS
- // Clipboard formats
- CLIPFORMAT m_CFSTR_FILEDESCRIPTOR;
- CLIPFORMAT m_CFSTR_FILECONTENTS;
- CLIPFORMAT m_CFSTR_PASTESUCCEEDED;
- CLIPFORMAT m_CFSTR_PERFORMEDDROPEFFECT;
- CLIPFORMAT m_CFSTR_LOGICALPERFORMEDDROPEFFECT;
- CLIPFORMAT m_CFSTR_PREFERREDDROPEFFECT;
- CLIPFORMAT m_CFSTR_SHELLIDLIST;
- #if (_WIN32_WINNT >= 0x0500)
- CLIPFORMAT m_CFSTR_TARGETCLSID;
- #endif // _WIN32_WINNT
- #endif // _NO_CLIPFORMATS
- };
- #endif // __ATLSHELLEXTBASE_H__