OSDN Git Service

* Make ShellExtension icon background transparent on Vista or later
authorsdottaka <none@none>
Mon, 4 Feb 2013 07:04:57 +0000 (23:04 -0800)
committersdottaka <none@none>
Mon, 4 Feb 2013 07:04:57 +0000 (23:04 -0800)
* Remove WinMergeParent bitmap

ShellExtension/Resource.h
ShellExtension/ShellExtension.rc
ShellExtension/WinMergeParent.bmp [deleted file]
ShellExtension/WinMergeShell.cpp
ShellExtension/WinMergeShell.h

index c81c055..2e24e0d 100644 (file)
 #define IDS_RESELECT_FIRST              110
 #define IDB_WINMERGE                    202
 #define IDB_WINMERGEDIR                 203
-#define IDB_WINMERGEPARENT              204
 
 // Next default values for new objects
 //
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        205
+#define _APS_NEXT_RESOURCE_VALUE        204
 #define _APS_NEXT_COMMAND_VALUE         32768
 #define _APS_NEXT_CONTROL_VALUE         201
 #define _APS_NEXT_SYMED_VALUE           111
index 40a5ae1..a3c1252 100644 (file)
@@ -304,8 +304,8 @@ END
 //\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
- FILEVERSION 1,15,0,4\r
- PRODUCTVERSION 1,15,0,4\r
+ FILEVERSION 1,15,0,5\r
+ PRODUCTVERSION 1,15,0,5\r
  FILEFLAGSMASK 0x3fL\r
 #ifdef _DEBUG\r
  FILEFLAGS 0x1L\r
@@ -323,7 +323,7 @@ BEGIN
             VALUE "Comments", "\0"\r
             VALUE "CompanyName", "http://winmerge.org\0"\r
             VALUE "FileDescription", "WinMerge Shell Integration library\0"\r
-            VALUE "FileVersion", "1.15.0.4\0"\r
+            VALUE "FileVersion", "1.15.0.5\0"\r
             VALUE "InternalName", "ShellExtension\0"\r
             VALUE "LegalCopyright", "Copyright 2003-2013\0"\r
             VALUE "LegalTrademarks", "\0"\r
@@ -331,7 +331,7 @@ BEGIN
             VALUE "OriginalFilename", "ShellExtension.DLL\0"\r
             VALUE "PrivateBuild", "\0"\r
             VALUE "ProductName", "WinMerge Shell Integration library\0"\r
-            VALUE "ProductVersion", "1.15.0.4\0"\r
+            VALUE "ProductVersion", "1.15.0.5\0"\r
             VALUE "SpecialBuild", "\0"\r
         END\r
     END\r
@@ -358,7 +358,6 @@ IDR_WINMERGESHELL       REGISTRY                "WinMergeShell.rgs"
 \r
 IDB_WINMERGE            BITMAP                  "WinMerge.bmp"\r
 IDB_WINMERGEDIR         BITMAP                  "WinMergeDir.bmp"\r
-IDB_WINMERGEPARENT      BITMAP                  "WinMergeParent.bmp"\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
diff --git a/ShellExtension/WinMergeParent.bmp b/ShellExtension/WinMergeParent.bmp
deleted file mode 100644 (file)
index 4aaa7c8..0000000
Binary files a/ShellExtension/WinMergeParent.bmp and /dev/null differ
index a71d0aa..fd69bfb 100644 (file)
@@ -135,6 +135,47 @@ static String GetResourceString(UINT resourceID)
        return strResource;
 }
 
+static HBITMAP MakeBitmapBackColorTransparent(HBITMAP hbmSrc)
+{
+       HDC hdcSrc = CreateCompatibleDC(NULL);
+       BITMAP bm;
+       GetObject(hbmSrc, sizeof(bm), &bm);
+       HBITMAP hbmSrcOld = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
+       BITMAPINFO bi = {0};
+       bi.bmiHeader.biSize = sizeof BITMAPINFOHEADER;
+       bi.bmiHeader.biPlanes = 1;
+       bi.bmiHeader.biBitCount = 32;
+       bi.bmiHeader.biCompression = BI_RGB;
+       bi.bmiHeader.biWidth = bm.bmWidth;
+       bi.bmiHeader.biHeight = -bm.bmHeight;
+       DWORD *pBits = NULL;
+       HBITMAP hbmNew = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
+       if (pBits)
+       {
+               COLORREF clrTP = GetPixel(hdcSrc, 0, 0);
+               int bR = GetRValue(clrTP), bG = GetGValue(clrTP), bB = GetBValue(clrTP);
+       
+               for (int y = 0; y < bm.bmHeight; ++y)
+               {
+                       for (int x = 0; x < bm.bmWidth; ++x)
+                       {
+                               COLORREF clrCur = GetPixel(hdcSrc, x, y);
+                               int cR = GetRValue(clrCur), cG = GetGValue(clrCur), cB = GetBValue(clrCur);
+                               if (!(abs(cR - bR) <= 1 && abs(cG - bG) <= 1 && abs(cB - bB) <= 1))
+                               {
+                                       pBits[y * bm.bmWidth + x] = cB | (cG << 8) | (cR << 16) | 0xFF000000;
+                               }
+                       }
+               }
+       }
+
+       SelectObject(hdcSrc, hbmSrcOld);
+       DeleteDC(hdcSrc);
+
+       return hbmNew;
+}
+
+
 /////////////////////////////////////////////////////////////////////////////
 // CWinMergeShell
 
@@ -144,18 +185,32 @@ CWinMergeShell::CWinMergeShell()
        m_dwMenuState = 0;
 
        // compress or stretch icon bitmap according to menu item height
-       m_MergeBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGE), IMAGE_BITMAP,
-                       GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
-       m_MergeDirBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGEDIR), IMAGE_BITMAP,
+       HBITMAP hMergeBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGE), IMAGE_BITMAP,
                        GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
-       m_MergeParentBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGEPARENT), IMAGE_BITMAP,
+       HBITMAP hMergeDirBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_WINMERGEDIR), IMAGE_BITMAP,
                        GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK), LR_DEFAULTCOLOR);
+
+       OSVERSIONINFO osvi;
+       osvi.dwOSVersionInfoSize = sizeof OSVERSIONINFO;
+       GetVersionEx(&osvi);
+       if (osvi.dwMajorVersion >= 6)
+       {
+               m_MergeBmp = MakeBitmapBackColorTransparent(hMergeBmp);
+               DeleteObject(hMergeBmp);
+
+               m_MergeDirBmp = MakeBitmapBackColorTransparent(hMergeDirBmp);
+               DeleteObject(hMergeDirBmp);
+       }
+       else
+       {
+               m_MergeBmp = hMergeBmp;
+               m_MergeDirBmp = hMergeDirBmp;
+       }
 }
 
 /// Default destructor, unloads bitmap
 CWinMergeShell::~CWinMergeShell()
 {
-       DeleteObject(m_MergeParentBmp);
        DeleteObject(m_MergeDirBmp);
        DeleteObject(m_MergeBmp);
 }
@@ -167,8 +222,6 @@ HRESULT CWinMergeShell::Initialize(LPCITEMIDLIST pidlFolder,
        USES_WINMERGELOCALE;
        HRESULT hr = E_INVALIDARG;
        
-       m_bParentFolder = false;
-
        // Files/folders selected normally from the explorer
        if (pDataObj)
        {
@@ -235,7 +288,6 @@ HRESULT CWinMergeShell::Initialize(LPCITEMIDLIST pidlFolder,
                {
                        m_strPaths[0] = szPath;
                        m_nSelectedItems = 1;
-                       m_bParentFolder = true;
                        hr = S_OK;
                }
                else
@@ -462,7 +514,7 @@ int CWinMergeShell::DrawSimpleMenu(HMENU hmenu, UINT uMenuIndex,
        InsertMenu(hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, strMenu.c_str());
 
        // Add bitmap
-       HBITMAP hBitmap = m_bParentFolder ? m_MergeParentBmp : (PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp);
+       HBITMAP hBitmap = PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp;
        if (hBitmap != NULL)
                SetMenuItemBitmaps(hmenu, uMenuIndex, MF_BYPOSITION, hBitmap, NULL);
 
@@ -526,7 +578,7 @@ int CWinMergeShell::DrawAdvancedMenu(HMENU hmenu, UINT uMenuIndex,
        }
 
        // Add bitmap
-       HBITMAP hBitmap = m_bParentFolder ? m_MergeParentBmp : (PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp);
+       HBITMAP hBitmap = PathIsDirectory(m_strPaths[0].c_str()) ? m_MergeDirBmp : m_MergeBmp;
        if (hBitmap != NULL)
        {
                if (nItemsAdded == 2)
index 6cc68de..35761b2 100644 (file)
@@ -63,11 +63,10 @@ public:
 protected:
        String m_strPaths[3]; /**< Paths for selected items */
        String m_strPreviousPath; /**< Previously selected path */
-       HBITMAP m_MergeBmp, m_MergeDirBmp, m_MergeParentBmp; /**< Icon */
+       HBITMAP m_MergeBmp, m_MergeDirBmp; /**< Icon */
        UINT m_nSelectedItems; /**< Amount of selected items */
        DWORD m_dwContextMenuEnabled; /**< Is context menu enabled and in which mode? */
        DWORD m_dwMenuState; /**< Shown menuitems */
-       bool m_bParentFolder;
 
        BOOL GetWinMergeDir(String &strDir);
        BOOL CheckExecutable(String path);