From 253b9857e7b4317275b50795ddc53508e1cbd181 Mon Sep 17 00:00:00 2001 From: Jonas Kümmerlin Date: Fri, 12 Jun 2020 17:05:26 +0200 Subject: icon view and helper functions initial implementation, needs more testing --- Makefile.mingw | 7 +- Makefile.mingw-amd64 | 7 +- Makefile.vc6 | 5 +- Makefile.vc6-ansi | 5 +- alf/alf.h | 20 +++++ alf/alfcompat.cpp | 20 +++++ alf/alfcompat.h | 2 + alf/alficon.cpp | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++ widgetfactory.cpp | 49 +++++++++++- 9 files changed, 313 insertions(+), 8 deletions(-) create mode 100644 alf/alficon.cpp 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")); -- cgit v1.2.3