windows 覆盖图标实现
生活随笔
收集整理的這篇文章主要介紹了
windows 覆盖图标实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
vs2013 windows 覆蓋圖標實現
實現類似SVN小圖標的功能,可以更清晰地給用戶顯示文件的狀態,實現如圖效果
一、創建工程
全部選擇默認選項
生成如圖目錄,xxxxPS工程可以刪掉,其中Generated Files文件夾里的文件,.def文件,.idl文件都是可以自動生成的,
二、創建類
通過引導創建一個類,工程->add->Class,選擇ATL->ATL Simple Object,全部默認選項就可,通過引導來創建的ATL類vs會自動幫你寫好idl文件,就不需要自己特意去看這個文件的編寫了,你只需要關心自己創建的類就可以(.h和.cpp)。
三、繼承IShellIconOverlayIdentifier接口
csdn可查這個接口的基本信息,基本上這個接口就是為了實現覆蓋小圖標的功能
四、實現接口的三個方法
STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax, int *pIndex, DWORD* pdwFlags); STDMETHOD(GetPriority)(int* pPriority); STDMETHOD(IsMemberOf)(LPCWSTR pwszPath, DWORD dwAttrib);五、基本實現代碼
// testicon.h : Declaration of the Ctesticon#pragma once #include "resource.h" // main symbols#include "ATLProject1_i.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA) #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms." #endifusing namespace ATL;// Ctesticonclass ATL_NO_VTABLE Ctesticon :public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<Ctesticon, &CLSID_testicon>,public IDispatchImpl<Itesticon, &IID_Itesticon, &LIBID_ATLProject1Lib, /*wMajor =*/ 1, /*wMinor =*/ 0>,public IShellIconOverlayIdentifier { public:Ctesticon(){}STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax, int *pIndex, DWORD* pdwFlags);STDMETHOD(GetPriority)(int* pPriority);STDMETHOD(IsMemberOf)(LPCWSTR pwszPath, DWORD dwAttrib); DECLARE_REGISTRY_RESOURCEID(IDR_TESTICON)BEGIN_COM_MAP(Ctesticon)COM_INTERFACE_ENTRY(Itesticon)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier) END_COM_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){}public:};OBJECT_ENTRY_AUTO(__uuidof(testicon), Ctesticon) // testicon.cpp : Implementation of Ctesticon#include "stdafx.h" #include "testicon.h"STDMETHODIMP Ctesticon::GetOverlayInfo(LPWSTR pwszIconFile,int cchMax,int* pIndex,DWORD* pdwFlags) {std::wstring picpath = GetPicPath();wcscpy(pwszIconFile, picpath.c_str()); // ico 文件的路徑,用dll資源文件則傳入dll路徑,pIndex為資源文件的偏移*pIndex = 0;*pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX;return S_OK; }STDMETHODIMP Ctesticon::GetPriority(int* pPriority) {// 返回優先級,0是最高級,這里的功能我沒試過,應該是兩個組件同時需要顯示的時候,通過這個值去判斷顯示哪個*pPriority = 0;return S_OK; }STDMETHODIMP Ctesticon::IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib) {// pwszPath 會傳入文件路徑,根據這個路徑判斷該文件是否需要顯示圖標if (wcsncmp(pwszPath, L"C:\\test", 7))return S_FALSE; // 不顯示elsereturn S_OK; // 顯示 }下面是注冊表配置文件
HKCR {NoRemove CLSID{ForceRemove {C9B4C1A1-CB96-4681-8C4C-0676C88F29A7} = s 'testicon Class'{ForceRemove ProgrammableInprocServer32 = s '%MODULE%'{val ThreadingModel = s 'Apartment'}TypeLib = s '{89DC6A3E-B4AF-476D-9A6C-BDBA1F025E3C}'Version = s '1.0'}} } HKLM {NoRemove SOFTWARE{NoRemove Microsoft{NoRemove Windows{NoRemove CurrentVersion{NoRemove Explorer{NoRemove ShellIconOverlayIdentifiers{ForceRemove '1testico' = s '{C9B4C1A1-CB96-4681-8C4C-0676C88F29A7}'{} }}}}}} }六、組件安裝、卸載
管理員權限運行cmd,執行下面命令,其中[dllpath]是編譯生成的dll絕對路徑,記得路徑中有空格要用雙引號
: 安裝 regsrv32 "[dllpath]" : 卸載 regsrv32 /u "[dllpath]"檢查是否安裝成功可以去注冊表查看
計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers下面圖片是SVN的小圖標注冊表
七、備注
總結
以上是生活随笔為你收集整理的windows 覆盖图标实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VBA—EXCEL操作集合—05
- 下一篇: vs2008激活、序列号