OSDN Git Service

ShellExtension: Use icons instead of bitmaps
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Wed, 3 May 2017 09:17:06 +0000 (18:17 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Wed, 3 May 2017 09:17:06 +0000 (18:17 +0900)
13 files changed:
ShellExtension/Resource.h
ShellExtension/ShellExtension.rc
ShellExtension/ShellExtension.vcxproj
ShellExtension/ShellExtension.vcxproj.filters
ShellExtension/WinMerge.bmp [deleted file]
ShellExtension/WinMerge.ico [new file with mode: 0644]
ShellExtension/WinMerge32.bmp [deleted file]
ShellExtension/WinMerge48.bmp [deleted file]
ShellExtension/WinMergeDir.bmp [deleted file]
ShellExtension/WinMergeDir.ico [new file with mode: 0644]
ShellExtension/WinMergeDir32.bmp [deleted file]
ShellExtension/WinMergeDir48.bmp [deleted file]
ShellExtension/WinMergeShell.cpp

index 287b0c8..6851d82 100644 (file)
 #define IDS_HELP_COMPARESTORED          108
 #define IDS_HELP_COMPARESAVED           109
 #define IDS_RESELECT_FIRST              110
-#define IDB_WINMERGE                    202
-#define IDB_WINMERGEDIR                 203
-#define IDB_WINMERGE32                  204
-#define IDB_WINMERGEDIR32               205
-#define IDB_WINMERGE48                  206
-#define IDB_WINMERGEDIR48               207
+#define IDI_WINMERGE                    208
+#define IDI_WINMERGEDIR                 209
 
 // Next default values for new objects
 //
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        208
+#define _APS_NEXT_RESOURCE_VALUE        210
 #define _APS_NEXT_COMMAND_VALUE         32768
 #define _APS_NEXT_CONTROL_VALUE         201
 #define _APS_NEXT_SYMED_VALUE           111
index eb5f82d..3329599 100644 (file)
@@ -341,15 +341,11 @@ IDR_WINMERGESHELL       REGISTRY                "WinMergeShell.rgs"
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
-// Bitmap\r
+// Icon\r
 //\r
 \r
-IDB_WINMERGE            BITMAP                  "WinMerge.bmp"\r
-IDB_WINMERGE32          BITMAP                  "WinMerge32.bmp"\r
-IDB_WINMERGE48          BITMAP                  "WinMerge48.bmp"\r
-IDB_WINMERGEDIR         BITMAP                  "WinMergeDir.bmp"\r
-IDB_WINMERGEDIR32       BITMAP                  "WinMergeDir32.bmp"\r
-IDB_WINMERGEDIR48       BITMAP                  "WinMergeDir48.bmp"\r
+IDI_WINMERGE            ICON                    "WinMerge.ico"\r
+IDI_WINMERGEDIR         ICON                    "WinMergeDir.ico"\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
 //\r
index f21b3f7..7343ad0 100644 (file)
@@ -282,8 +282,6 @@ echo Warning : Cannot register Unicode DLL on Windows 95
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Unicode Release MinDependency|x64'">true</ExcludedFromBuild>\r
     </CustomBuildStep>\r
     <CustomBuildStep Include="ShellExtensionU.def" />\r
-    <None Include="WinMerge.bmp" />\r
-    <None Include="WinMergeDir.bmp" />\r
     <None Include="WinMergeShell.rgs" />\r
   </ItemGroup>\r
   <ItemGroup>\r
@@ -507,8 +505,8 @@ echo Warning : Cannot register Unicode DLL on Windows 95
     </ResourceCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <Image Include="WinMerge32.bmp" />\r
-    <Image Include="WinMergeDir32.bmp" />\r
+    <Image Include="WinMerge.ico" />\r
+    <Image Include="WinMergeDir.ico" />\r
   </ItemGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
index 71d38ec..a3233b7 100644 (file)
     </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <None Include="WinMerge.bmp">\r
-      <Filter>Resource Files</Filter>\r
-    </None>\r
     <None Include="WinMergeShell.rgs">\r
       <Filter>Resource Files</Filter>\r
     </None>\r
-    <None Include="WinMergeDir.bmp">\r
-      <Filter>Resource Files</Filter>\r
-    </None>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <Midl Include="ShellExtension.idl">\r
     </CustomBuildStep>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <Image Include="WinMerge32.bmp">\r
+    <Image Include="WinMerge.ico">\r
       <Filter>Resource Files</Filter>\r
     </Image>\r
-    <Image Include="WinMergeDir32.bmp">\r
+    <Image Include="WinMergeDir.ico">\r
       <Filter>Resource Files</Filter>\r
     </Image>\r
   </ItemGroup>\r
diff --git a/ShellExtension/WinMerge.bmp b/ShellExtension/WinMerge.bmp
deleted file mode 100644 (file)
index 902803b..0000000
Binary files a/ShellExtension/WinMerge.bmp and /dev/null differ
diff --git a/ShellExtension/WinMerge.ico b/ShellExtension/WinMerge.ico
new file mode 100644 (file)
index 0000000..87b97d5
Binary files /dev/null and b/ShellExtension/WinMerge.ico differ
diff --git a/ShellExtension/WinMerge32.bmp b/ShellExtension/WinMerge32.bmp
deleted file mode 100644 (file)
index 9cce9da..0000000
Binary files a/ShellExtension/WinMerge32.bmp and /dev/null differ
diff --git a/ShellExtension/WinMerge48.bmp b/ShellExtension/WinMerge48.bmp
deleted file mode 100644 (file)
index 9188932..0000000
Binary files a/ShellExtension/WinMerge48.bmp and /dev/null differ
diff --git a/ShellExtension/WinMergeDir.bmp b/ShellExtension/WinMergeDir.bmp
deleted file mode 100644 (file)
index 79cc8b6..0000000
Binary files a/ShellExtension/WinMergeDir.bmp and /dev/null differ
diff --git a/ShellExtension/WinMergeDir.ico b/ShellExtension/WinMergeDir.ico
new file mode 100644 (file)
index 0000000..c186fb7
Binary files /dev/null and b/ShellExtension/WinMergeDir.ico differ
diff --git a/ShellExtension/WinMergeDir32.bmp b/ShellExtension/WinMergeDir32.bmp
deleted file mode 100644 (file)
index cf3be09..0000000
Binary files a/ShellExtension/WinMergeDir32.bmp and /dev/null differ
diff --git a/ShellExtension/WinMergeDir48.bmp b/ShellExtension/WinMergeDir48.bmp
deleted file mode 100644 (file)
index 843d7b1..0000000
Binary files a/ShellExtension/WinMergeDir48.bmp and /dev/null differ
index 9c3b291..0df6ca6 100644 (file)
@@ -157,47 +157,25 @@ static String GetResourceString(UINT resourceID)
        return strResource;
 }
 
-static HBITMAP MakeBitmapBackColorTransparent(HBITMAP hbmSrc)
+HBITMAP ConvertHICONtoHBITMAP(HICON hIcon, int cx, int cy)
 {
-       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)
+       LPVOID lpBits;
+       BITMAPINFO bmi = { { sizeof(BITMAPINFOHEADER), cx, cy, 1, IsWindows8OrGreater() ? 32u : 24u } };
+       HBITMAP hbmp = CreateDIBSection(NULL, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, &lpBits, NULL, 0);
+       HDC hdcMem = CreateCompatibleDC(NULL);
+       HBITMAP hbmpPrev = (HBITMAP)SelectObject(hdcMem, hbmp);
+       RECT rc = { 0, 0, cx, cy };
+       if (bmi.bmiHeader.biBitCount <= 24)
        {
-               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;
-                               }
-                       }
-               }
+               SetBkColor(hdcMem, GetSysColor(COLOR_MENU));
+               ExtTextOut(hdcMem, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
        }
-
-       SelectObject(hdcSrc, hbmSrcOld);
-       DeleteDC(hdcSrc);
-
-       return hbmNew;
+       DrawIconEx(hdcMem, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
+       SelectObject(hdcMem, hbmpPrev);
+       DeleteDC(hdcMem);
+       return hbmp;
 }
 
-
 /////////////////////////////////////////////////////////////////////////////
 // CWinMergeShell
 
@@ -207,31 +185,19 @@ CWinMergeShell::CWinMergeShell()
        m_dwMenuState = 0;
        int cx = GetSystemMetrics(SM_CXMENUCHECK);
        int cy = GetSystemMetrics(SM_CYMENUCHECK);
-       int id_fileicon = cx > 16 ? (cx > 32 ? IDB_WINMERGE48 : IDB_WINMERGE32) : IDB_WINMERGE;
-       int id_diricon = cx > 16 ? (cx > 32 ? IDB_WINMERGEDIR48 : IDB_WINMERGEDIR32) : IDB_WINMERGEDIR;
 
        // compress or stretch icon bitmap according to menu item height
-       HBITMAP hMergeBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(id_fileicon), IMAGE_BITMAP,
-                       cx, cy, LR_DEFAULTCOLOR);
-       HBITMAP hMergeDirBmp = (HBITMAP)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(id_diricon), IMAGE_BITMAP,
-                       cx, cy, LR_DEFAULTCOLOR);
-
-       OSVERSIONINFO osvi;
-       osvi.dwOSVersionInfoSize = sizeof OSVERSIONINFO;
-       GetVersionEx(&osvi);
-       if (osvi.dwMajorVersion >= 6)
-       {
-               m_MergeBmp = MakeBitmapBackColorTransparent(hMergeBmp);
-               DeleteObject(hMergeBmp);
+       HICON hMergeIcon = (HICON)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDI_WINMERGE), IMAGE_ICON,
+               cx, cy, LR_DEFAULTCOLOR);
+       HICON hMergeDirIcon = (HICON)LoadImage(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDI_WINMERGEDIR), IMAGE_ICON,
+               cx, cy, LR_DEFAULTCOLOR);
+
+       m_MergeBmp = ConvertHICONtoHBITMAP(hMergeIcon, cx, cy);
+       m_MergeDirBmp = ConvertHICONtoHBITMAP(hMergeDirIcon, cx, cy);
+
+       DestroyIcon(hMergeIcon);
+       DestroyIcon(hMergeDirIcon);
 
-               m_MergeDirBmp = MakeBitmapBackColorTransparent(hMergeDirBmp);
-               DeleteObject(hMergeDirBmp);
-       }
-       else
-       {
-               m_MergeBmp = hMergeBmp;
-               m_MergeDirBmp = hMergeDirBmp;
-       }
 }
 
 /// Default destructor, unloads bitmap