diff --git a/Makefile.am b/Makefile.am
index 530ed7a..eceb926 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -108,7 +108,8 @@ openvpn_gui_LDADD = \
-lnetapi32 \
-lole32 \
-lshlwapi \
- -lsecur32
+ -lsecur32 \
+ -lmsimg32
openvpn-gui-res.o: $(openvpn_gui_RESOURCES) $(srcdir)/openvpn-gui-res.h
$(RCCOMPILE) -i $< -o $@
diff --git a/openvpn-gui.vcxproj b/openvpn-gui.vcxproj
index e50b664..80bdb97 100644
--- a/openvpn-gui.vcxproj
+++ b/openvpn-gui.vcxproj
@@ -117,7 +117,7 @@
HAVE_CONFIG_H;_MSC_VER
- Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;%(AdditionalDependencies)
+ Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;Msimg32.lib;%(AdditionalDependencies)
copy config-msvc.h config.h
@@ -132,7 +132,7 @@
_INC_MATH;WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;_CRT_NON_CONFORMING_WCSTOK;HAVE_CONFIG_H
- Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;%(AdditionalDependencies)
+ Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;Msimg32.lib;%(AdditionalDependencies)
diff --git a/tray.c b/tray.c
index 2c32438..1861ff3 100644
--- a/tray.c
+++ b/tray.c
@@ -66,8 +66,46 @@ CreateBitmaps()
{
HICON icon = LoadLocalizedIconEx(ID_ICO_CONNECTING, cx, cy);
ICONINFO iconinfo;
- GetIconInfo(icon, &iconinfo);
- hbmpConnecting = iconinfo.hbmColor;
+
+ if (!GetIconInfo(icon, &iconinfo))
+ {
+ MsgToEventLog(EVENTLOG_ERROR_TYPE, L"Error loading ID_ICO_CONNECTING.");
+ return;
+ }
+
+ /* Make a color bitmap with transparency for use as a
+ * checkmark for indicating the connecting state. We do this
+ * by combining the mask bitmap in the icon with its image bitmap.
+ * These bitmaps are created by the GetIconInfo call.
+ */
+
+ /* Create two DCs for drawing the images in memory */
+ HDC maskDC = CreateCompatibleDC(NULL), imgDC = CreateCompatibleDC(NULL);
+ if (!maskDC || !imgDC)
+ {
+ DeleteObject(iconinfo.hbmMask);
+ DeleteObject(iconinfo.hbmColor);
+ if (maskDC) DeleteDC(maskDC);
+ if (imgDC) DeleteDC(imgDC);
+ return;
+ }
+
+ /* Load the image and mask bitmaps into the DCs saving the default one's */
+ HBITMAP def1 = (HBITMAP) SelectObject(imgDC, iconinfo.hbmColor);
+ HBITMAP def2 = (HBITMAP) SelectObject(maskDC, iconinfo.hbmMask);
+
+ /* Transfer bit blocks from mask to image -- transparent color is black */
+ TransparentBlt(imgDC, 0, 0, cx, cy, maskDC, 0, 0, cx, cy, RGB(0, 0, 0));
+
+ /* Save the result and restore the default bitmaps back in the DC */
+ hbmpConnecting = (HBITMAP) SelectObject(imgDC, def1);
+ SelectObject(maskDC, def2);
+
+ /* We don't need the mask bitmap -- free it */
+ DeleteObject(iconinfo.hbmMask);
+
+ DeleteDC(imgDC);
+ DeleteDC(maskDC);
}
}