summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.mingw7
-rw-r--r--Makefile.mingw-amd647
-rw-r--r--Makefile.vc65
-rw-r--r--Makefile.vc6-ansi5
-rw-r--r--alf/alf.h20
-rw-r--r--alf/alfcompat.cpp20
-rw-r--r--alf/alfcompat.h2
-rw-r--r--alf/alficon.cpp206
-rw-r--r--widgetfactory.cpp49
9 files changed, 313 insertions, 8 deletions
diff --git a/Makefile.mingw b/Makefile.mingw
index cf2ba63..5b8fe5d 100644
--- a/Makefile.mingw
+++ b/Makefile.mingw
@@ -8,7 +8,7 @@ LDFLAGS = -luser32 -lcomctl32 -lshell32 -lversion -static
all: out/widgetfactory.exe out/alf/alf.c out/widgetfactory-c.exe
-out/widgetfactory.exe: out/widgetfactory.o out/alfbutton.o out/alfcombobox.o out/alfcompat.o out/alfcontrol.o out/alf.o out/alfdpiaware.o out/alfedit.o out/alfgroupbox.o out/alflabel.o out/alflayout.o out/alfnativebtn.o out/alfnotebook.o out/alfpanel.o out/alftoplevel.o
+out/widgetfactory.exe: out/widgetfactory.o out/alfbutton.o out/alfcombobox.o out/alfcompat.o out/alfcontrol.o out/alf.o out/alfdpiaware.o out/alfedit.o out/alfgroupbox.o out/alficon.o out/alflabel.o out/alflayout.o out/alfnativebtn.o out/alfnotebook.o out/alfpanel.o out/alftoplevel.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
out/alfbutton.o: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -35,6 +35,9 @@ out/alfedit.o: alf/alfedit.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/al
out/alfgroupbox.o: alf/alfgroupbox.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
+out/alficon.o: alf/alficon.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CXXFLAGS) -c -o $@ $<
+
out/alflabel.o: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
@@ -56,7 +59,7 @@ out/alftoplevel.o: alf/alftoplevel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.
out/widgetfactory.o: widgetfactory.cpp alf/alf.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
-out/alf/alf.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alftoplevel.cpp
+out/alf/alf.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alficon.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alftoplevel.cpp
@mkdir -p out/alf
@printf "#include \"alf.h\"\\n" > $@
@cat $^ | grep -v "^#pragma once" | grep -v "^#include \"alf" >> $@
diff --git a/Makefile.mingw-amd64 b/Makefile.mingw-amd64
index b723180..2ad5eb8 100644
--- a/Makefile.mingw-amd64
+++ b/Makefile.mingw-amd64
@@ -8,7 +8,7 @@ LDFLAGS = -luser32 -lcomctl32 -lshell32 -lversion -static
all: out/widgetfactory64.exe out/alf/alf64.c out/widgetfactory64-c.exe
-out/widgetfactory64.exe: out/widgetfactory.amd64.o out/alfbutton.amd64.o out/alfcombobox.amd64.o out/alfcompat.amd64.o out/alfcontrol.amd64.o out/alf.amd64.o out/alfdpiaware.amd64.o out/alfedit.amd64.o out/alfgroupbox.amd64.o out/alflabel.amd64.o out/alflayout.amd64.o out/alfnativebtn.amd64.o out/alfnotebook.amd64.o out/alfpanel.amd64.o out/alftoplevel.amd64.o
+out/widgetfactory64.exe: out/widgetfactory.amd64.o out/alfbutton.amd64.o out/alfcombobox.amd64.o out/alfcompat.amd64.o out/alfcontrol.amd64.o out/alf.amd64.o out/alfdpiaware.amd64.o out/alfedit.amd64.o out/alfgroupbox.amd64.o out/alficon.amd64.o out/alflabel.amd64.o out/alflayout.amd64.o out/alfnativebtn.amd64.o out/alfnotebook.amd64.o out/alfpanel.amd64.o out/alftoplevel.amd64.o
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
out/alfbutton.amd64.o: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -35,6 +35,9 @@ out/alfedit.amd64.o: alf/alfedit.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h
out/alfgroupbox.amd64.o: alf/alfgroupbox.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
+out/alficon.amd64.o: alf/alficon.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CXXFLAGS) -c -o $@ $<
+
out/alflabel.amd64.o: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
@@ -56,7 +59,7 @@ out/alftoplevel.amd64.o: alf/alftoplevel.cpp alf/alfcompat.h alf/alf.h alf/alfl
out/widgetfactory.amd64.o: widgetfactory.cpp alf/alf.h
$(CXX) $(CXXFLAGS) -c -o $@ $<
-out/alf/alf64.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alftoplevel.cpp
+out/alf/alf64.c: alf/alflist.h alf/alflayout.h alf/alfcompat.h alf/alfpriv.h alf/alfbutton.cpp alf/alfcombobox.cpp alf/alfcompat.cpp alf/alfcontrol.cpp alf/alf.cpp alf/alfdpiaware.cpp alf/alfedit.cpp alf/alfgroupbox.cpp alf/alficon.cpp alf/alflabel.cpp alf/alflayout.cpp alf/alfnativebtn.cpp alf/alfnotebook.cpp alf/alfpanel.cpp alf/alftoplevel.cpp
@mkdir -p out/alf
@printf "#include \"alf.h\"\\n" > $@
@cat $^ | grep -v "^#pragma once" | grep -v "^#include \"alf" >> $@
diff --git a/Makefile.vc6 b/Makefile.vc6
index 95a6681..fad4fa0 100644
--- a/Makefile.vc6
+++ b/Makefile.vc6
@@ -4,7 +4,7 @@ CXX = cl.exe
CFLAGS = -O2 -GA -W3 -DUNICODE -D_UNICODE -D_WIN32=0x0501 -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0501 -nologo
LDFLAGS = /link unicows.lib kernel32.lib user32.lib comctl32.lib shell32.lib gdi32.lib version.lib
-out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alftoplevel.obj
+out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alficon.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alftoplevel.obj
$(CXX) $(CFLAGS) -Fe$@ $** $(LDFLAGS)
out/alfbutton.obj: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -31,6 +31,9 @@ out/alfedit.obj: alf/alfedit.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/
out/alfgroupbox.obj: alf/alfgroupbox.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alfgroupbox.cpp
+out/alficon.obj: alf/alficon.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CFLAGS) -c -Fo$@ alf/alficon.cpp
+
out/alflabel.obj: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alflabel.cpp
diff --git a/Makefile.vc6-ansi b/Makefile.vc6-ansi
index adf38bf..8d534e6 100644
--- a/Makefile.vc6-ansi
+++ b/Makefile.vc6-ansi
@@ -4,7 +4,7 @@ CXX = cl.exe
CFLAGS = -O2 -GA -W3 -D_WIN32=0x0501 -D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0501 -nologo
LDFLAGS = /link /entry:_entry /opt:nowin98 /fixed:no kernel32.lib user32.lib comctl32.lib shell32.lib gdi32.lib version.lib
-out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alftoplevel.obj
+out/widgetfactory.exe: out/widgetfactory.obj out/alfbutton.obj out/alfcombobox.obj out/alfcompat.obj out/alfcontrol.obj out/alf.obj out/alfdpiaware.obj out/alfedit.obj out/alfgroupbox.obj out/alficon.obj out/alflabel.obj out/alflayout.obj out/alfnativebtn.obj out/alfnotebook.obj out/alfpanel.obj out/alftoplevel.obj
$(CXX) $(CFLAGS) -Fe$@ $** $(LDFLAGS)
out/alfbutton.obj: alf/alfbutton.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
@@ -31,6 +31,9 @@ out/alfedit.obj: alf/alfedit.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/
out/alfgroupbox.obj: alf/alfgroupbox.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alfgroupbox.cpp
+out/alficon.obj: alf/alficon.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
+ $(CXX) $(CFLAGS) -c -Fo$@ alf/alficon.cpp
+
out/alflabel.obj: alf/alflabel.cpp alf/alfcompat.h alf/alf.h alf/alflayout.h alf/alflist.h alf/alfpriv.h
$(CXX) $(CFLAGS) -c -Fo$@ alf/alflabel.cpp
diff --git a/alf/alf.h b/alf/alf.h
index ad15ed7..db0481f 100644
--- a/alf/alf.h
+++ b/alf/alf.h
@@ -122,6 +122,9 @@ typedef struct {
#define ALF_WM_TPLVL_SETDEFFONT (ALF_WM__BASE + 201)
+#define ALF_WM_ICONVIEW_GETICON (ALF_WM__BASE + 201)
+#define ALF_WM_ICONVIEW_SETICON (ALF_WM__BASE + 202)
+
#define ALF_WM_USER (ALF_WM__BASE + 300)
typedef DWORD ALFColor;
@@ -580,6 +583,23 @@ ALF_AddNativeCheckbox(HWND parent, WORD id, int x, int y, const TCHAR *text);
HWND
ALF_AddNativeRadioButton(HWND parent, WORD id, int x, int y, const TCHAR *text);
+// icons and icon widget
+HWND
+ALF_AddIconView(HWND parent, WORD id, int x, int y, HICON icon);
+
+HICON
+ALF_IconView_Icon(HWND control);
+
+HICON
+ALF_IconView_SetIcon(HWND control, HICON icon);
+
+HICON
+ALF_LoadIcon(HINSTANCE hinst, const TCHAR *name, int cx, int cy);
+
+SIZE
+ALF_IconSize(HICON icon);
+
+
#ifdef __cplusplus
} // extern C
#endif
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index df7f27d..7b30eac 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -476,6 +476,22 @@ ALF_Compat_fallbackGetThemeMargins(HTHEME hTheme,
return E_NOTIMPL;
}
+static HRESULT WINAPI
+ALF_Compat_fallbackLoadIconWithScaleDown(HINSTANCE hinst,
+ PCWSTR pszName,
+ int cx,
+ int cy,
+ HICON *phico)
+{
+ (void)hinst;
+ (void)pszName;
+ (void)cx;
+ (void)cy;
+ (void)phico;
+
+ return E_NOTIMPL;
+}
+
static BOOL CALLBACK
ALF_Compat_DrawDisabledText_DrawStateProc(HDC hdc,
@@ -612,6 +628,8 @@ void ALF_LoadCompatFunctions(void)
LOAD_FUNC(uxtheme, GetThemeColor);
LOAD_FUNC(uxtheme, GetThemeMargins);
+ LOAD_FUNC(comctl32, LoadIconWithScaleDown);
+
// initialize helper function for disabled text
if (ALF_Compat_Is40()) {
if (GetSystemMetrics(SM_SLOWMACHINE)) {
@@ -704,6 +722,7 @@ void ALF_UnloadCompatFunctions(void)
UNLOAD_FUNC(GetThemePartSize);
UNLOAD_FUNC(GetThemeColor);
UNLOAD_FUNC(GetThemeMargins);
+ UNLOAD_FUNC(LoadIconWithScaleDown);
FreeLibrary(_alf_dll_uxtheme);
FreeLibrary(_alf_dll_user32);
@@ -741,3 +760,4 @@ BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC) = NULL;
HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*) = NULL;
HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*) = NULL;
HRESULT (WINAPI *ALF_Compat_GetThemeMargins)(HTHEME,HDC,int,int,int,const RECT *,MARGINS *) = NULL;
+HRESULT (WINAPI *ALF_Compat_LoadIconWithScaleDown)(HINSTANCE,PCWSTR,int,int,HICON *) = NULL;
diff --git a/alf/alfcompat.h b/alf/alfcompat.h
index 5360d9d..e839df4 100644
--- a/alf/alfcompat.h
+++ b/alf/alfcompat.h
@@ -137,6 +137,8 @@ extern BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC);
extern HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*);
extern HRESULT (WINAPI *ALF_Compat_GetThemeColor)(HTHEME,int,int,int,COLORREF*);
extern HRESULT (WINAPI *ALF_Compat_GetThemeMargins)(HTHEME,HDC,int,int,int,const RECT *,MARGINS *);
+extern HRESULT (WINAPI *ALF_Compat_LoadIconWithScaleDown)(HINSTANCE,PCWSTR,int,int,HICON *);
+
// compatibility bits
diff --git a/alf/alficon.cpp b/alf/alficon.cpp
new file mode 100644
index 0000000..eb83815
--- /dev/null
+++ b/alf/alficon.cpp
@@ -0,0 +1,206 @@
+#include "alfpriv.h"
+
+/* ICONS */
+
+typedef struct {
+ ALFColor bgcolor;
+ HICON icon;
+ SIZE iconsize;
+} ALFIconViewPriv;
+
+static void
+ALF_IconView_Paint(HWND hwnd, ALFIconViewPriv *priv, HDC hdc, RECT *r)
+{
+ if (priv->bgcolor == ALF_COLOR_TRANSPARENT) {
+ ALF_Compat_DrawThemeParentBackground(hwnd, hdc, r);
+ SetBkMode(hdc, TRANSPARENT);
+ } else {
+ ALF_FillRect(hdc, r, priv->bgcolor);
+ SetBkMode(hdc, OPAQUE);
+ SetBkColor(hdc, ALF_ColorToGdi(priv->bgcolor));
+ }
+
+ if (priv->icon) {
+ RECT rcClient;
+ GetClientRect(hwnd, &rcClient);
+ int iconx = (rcClient.right - rcClient.left - priv->iconsize.cx) / 2;
+ int icony = (rcClient.bottom - rcClient.top - priv->iconsize.cy) / 2;
+
+ DrawIconEx(hdc, iconx, icony, priv->icon, 0, 0, 0, NULL, DI_NORMAL);
+ }
+}
+
+static LRESULT CALLBACK
+ALF_IconView_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ ALFIconViewPriv *priv = (ALFIconViewPriv*)GetWindowLongPtr(hwnd, 0);
+
+ if (uMsg == WM_CREATE && !priv) {
+ priv = ALF_New(ALFIconViewPriv, 1);
+ priv->bgcolor = ALF_COLOR_SYS(COLOR_BTNFACE);
+ SetWindowLongPtr(hwnd, 0, (LONG_PTR)priv);
+ }
+
+ if (!priv)
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+
+ if (uMsg == WM_GETDLGCODE) {
+ return DLGC_STATIC;
+ } else if (uMsg == WM_PAINT) {
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+
+ RECT rcClient;
+ GetClientRect(hwnd, &rcClient);
+ RECT rcPaint = { 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top };
+
+ HDC hdcBuffer = NULL;
+ ALF_Compat_HPAINTBUFFER hpb = ALF_Compat_BeginBufferedPaint(hdc, &rcPaint, 0, NULL, &hdcBuffer);
+ if (hpb) {
+ ALF_IconView_Paint(hwnd, priv, hdcBuffer, &ps.rcPaint);
+ ALF_Compat_EndBufferedPaint(hpb, TRUE);
+ } else {
+ ALF_IconView_Paint(hwnd, priv, hdc, &ps.rcPaint);
+ }
+
+ EndPaint(hwnd, &ps);
+
+ return TRUE;
+ } else if (uMsg == WM_PRINTCLIENT) {
+ RECT rcClient;
+ GetClientRect(hwnd, &rcClient);
+ RECT rcPaint = { 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top };
+
+ ALF_IconView_Paint(hwnd, priv, (HDC)wParam, &rcPaint);
+ } else if (uMsg == WM_NCHITTEST) {
+ return HTTRANSPARENT;
+ } else if (uMsg == ALF_WM_QUERYSIZE) {
+ *(SIZE*)lParam = priv->iconsize;
+ return TRUE;
+ } else if (uMsg == WM_WINDOWPOSCHANGED) {
+ WINDOWPOS *p = (WINDOWPOS *)lParam;
+ if (!(p->flags & SWP_NOSIZE)) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ }
+ } else if (uMsg == ALF_WM_BACKGROUNDCHANGE) {
+ if (priv->bgcolor == ALF_COLOR_TRANSPARENT) {
+ InvalidateRect(hwnd, NULL, TRUE);
+ }
+ return TRUE;
+ } else if (uMsg == ALF_WM_SETBGCOLOR) {
+ ALFColor newcolor = (ALFColor)lParam;
+ if (priv->bgcolor == newcolor)
+ return TRUE;
+
+ priv->bgcolor = newcolor;
+ InvalidateRect(hwnd, NULL, TRUE);
+
+ return TRUE;
+ } else if (uMsg == ALF_WM_GETBGCOLOR) {
+ return (LRESULT)priv->bgcolor;
+ } else if (uMsg == ALF_WM_ICONVIEW_GETICON) {
+ return (LRESULT)priv->icon;
+ } else if (uMsg == ALF_WM_ICONVIEW_SETICON) {
+ HICON old = priv->icon;
+ SIZE oldsize = priv->iconsize;
+
+ priv->icon = (HICON)lParam;
+ priv->iconsize = ALF_IconSize(priv->icon);
+
+ InvalidateRect(hwnd, NULL, TRUE);
+ if (priv->iconsize.cx != oldsize.cx || priv->iconsize.cy != oldsize.cy) {
+ ALF_InvalidateLayout(GetParent(hwnd));
+ }
+
+ return (LRESULT)old;
+ } else if (uMsg == WM_DESTROY) {
+ ALF_Free(priv);
+ SetWindowLongPtr(hwnd, 0, 0);
+ }
+
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+}
+
+HWND
+ALF_AddIconView(HWND win, WORD id, int x, int y, HICON icon)
+{
+ HWND hwndIV = ALF_CreateControlWindow( 0,
+ TEXT(""),
+ WS_CHILD | WS_VISIBLE,
+ 0, 0, 100, 100,
+ win,
+ (HMENU)(ULONG_PTR)id,
+ ALF_IconView_WindowProc,
+ NULL);
+
+ ALF_AddControl(win, x, y, hwndIV, 0, 0, ALF_LAYOUT_SIZE_QUERY | ALF_LAYOUT_INHERITBGCOLOR | ALF_LAYOUT_SENDBGCHANGE);
+
+ ALF_IconView_SetIcon(hwndIV, icon);
+
+ return hwndIV;
+}
+
+HICON
+ALF_IconView_Icon(HWND control)
+{
+ return (HICON)SendMessage(control, ALF_WM_ICONVIEW_GETICON, 0, 0);
+}
+
+HICON
+ALF_IconView_SetIcon(HWND control, HICON icon)
+{
+ return (HICON)SendMessage(control, ALF_WM_ICONVIEW_SETICON, 0, (LPARAM)icon);
+}
+
+HICON
+ALF_LoadIcon(HINSTANCE hinst, const TCHAR *name, int cx, int cy)
+{
+ HICON hi;
+
+#ifdef UNICODE
+ const WCHAR *namew = name;
+#else
+ WCHAR namebuf[MAX_PATH] = {0};
+ const WCHAR *namew;
+
+ if (IS_INTRESOURCE(name)) {
+ namew = (WCHAR *)name;
+ } else {
+ MultiByteToWideChar(CP_ACP, 0, name, -1, namebuf, sizeof(namebuf)/sizeof(namebuf[0])-1);
+ namew = namebuf;
+ }
+#endif
+
+ if (SUCCEEDED(ALF_Compat_LoadIconWithScaleDown(hinst, namew, cx, cy, &hi))) {
+ return hi;
+ } else {
+ if (hinst == NULL) {
+ if (IS_INTRESOURCE(name)) { // standard icon
+ return CopyIcon(LoadIcon(hinst, name));
+ } else { // .ico file
+ return (HICON)LoadImage(hinst, name, IMAGE_ICON, cx, cy, LR_LOADFROMFILE);
+ }
+ } else {
+ return (HICON)LoadImage(hinst, name, IMAGE_ICON, cx, cy, 0);
+ }
+ }
+}
+
+SIZE
+ALF_IconSize(HICON icon)
+{
+ ICONINFO ii;
+ SIZE s = { 0, 0 };
+ if (GetIconInfo(icon, &ii)) {
+ BITMAP bm;
+ if (GetObject(ii.hbmMask, sizeof(bm), &bm) == sizeof(bm)) {
+ s.cx = bm.bmWidth;
+ s.cy = ii.hbmColor ? bm.bmHeight : bm.bmHeight / 2;
+ }
+
+ if (ii.hbmMask) DeleteObject(ii.hbmMask);
+ if (ii.hbmColor) DeleteObject(ii.hbmColor);
+ }
+
+ return s;
+}
diff --git a/widgetfactory.cpp b/widgetfactory.cpp
index 67d5c5c..ab362f1 100644
--- a/widgetfactory.cpp
+++ b/widgetfactory.cpp
@@ -9,6 +9,7 @@ enum {
PANE_NOTEBOOK,
PANE_CHECKBOX,
PANE_GROUPBOX,
+ PANE_ICONVIEW,
PANE__MAX
};
@@ -18,7 +19,8 @@ static const TCHAR *g_paneLabels[PANE__MAX] = {
TEXT("Combo Box"), //PANE_COMBO,
TEXT("Notebook"), //PANE_NOTEBOOK,
TEXT("Checkbox"), //PANE_CHECKBOX,
- TEXT("GroupBox") //PANE_GROUPBOX
+ TEXT("GroupBox"), //PANE_GROUPBOX,
+ TEXT("Icon View") //PANE_ICONVIEW
};
enum {
@@ -759,13 +761,55 @@ groupboxPanelInit(HWND panel)
ALF_Panel_SetVTable(panel, &groupboxPanelVtbl, priv);
}
+/* iconview panel */
+
+static void
+iconviewPanelAttach(void *closure, HWND panel)
+{
+ (void)closure;
+
+ HICON winlogo = ALF_LoadIcon(NULL, IDI_WINLOGO, 64, 64);
+ // FIXME! memory leak here
+ ALF_AddIconView(panel, (WORD)-1, 1, 3, winlogo);
+
+ ALF_Layout_SetRowMinSize(panel, 0, 825);
+ ALF_Layout_SetRowMinSize(panel, 2, 825);
+ ALF_Layout_SetRowMinSize(panel, 4, 825);
+ ALF_Layout_SetRowMinSize(panel, 6, 825);
+ ALF_Layout_SetColumnMinSize(panel, 0, 825);
+ ALF_Layout_SetColumnMinSize(panel, 2, 825);
+ ALF_Layout_SetColumnMinSize(panel, 4, 825);
+ ALF_Layout_SetRowExpandNumerator(panel, 3, 1);
+ ALF_Layout_SetRowExpandNumerator(panel, 5, 1);
+ ALF_Layout_SetColumnExpandNumerator(panel, 1, 1);
+ ALF_Layout_SetColumnExpandNumerator(panel, 3, 1);
+}
+
+static ALFPanelVTable iconviewPanelVtbl = {
+ iconviewPanelAttach,
+ commonPanelDestroy,
+ commonPanelMessage,
+ NULL,
+ NULL,
+ commonPanelPaint,
+ NULL
+};
+
+static void
+iconviewPanelInit(HWND panel)
+{
+ CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1);
+ ALF_Panel_SetVTable(panel, &iconviewPanelVtbl, priv);
+}
+
void (*g_paneInitTable[PANE__MAX])(HWND) = {
buttonPanelInit, //PANE_BUTTONS
labelPanelInit, //PANE_LABEL,
comboPanelInit, //PANE_COMBO,
notebookPanelInit, //PANE_NOTEBOOK,
checkboxPanelInit, //PANE_CHECKBOX,
- groupboxPanelInit //PANE_GROUPBOX,
+ groupboxPanelInit, //PANE_GROUPBOX,
+ iconviewPanelInit //PANE_ICONVIEW
};
static void
@@ -1006,6 +1050,7 @@ WinMain
addPaneToNotebook(hwndNtbk, PANE_NOTEBOOK);
addPaneToNotebook(hwndNtbk, PANE_COMBO);
addPaneToNotebook(hwndNtbk, PANE_GROUPBOX);
+ addPaneToNotebook(hwndNtbk, PANE_ICONVIEW);
ALF_AddNativeButton(win, ID_HELLO, 1, 3, TEXT("&Hello World!"));
ALF_AddNativeButton(win, (WORD)-1, 3, 3, TEXT("Goodbye, World"));