display icons of size 24x24 per default in the start menu root
Modified: trunk/reactos/subsys/system/explorer/explorer.cpp
Modified: trunk/reactos/subsys/system/explorer/explorer_intres.rc
Modified: trunk/reactos/subsys/system/explorer/globals.h
Modified: trunk/reactos/subsys/system/explorer/resource.h
Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp
Modified: trunk/reactos/subsys/system/explorer/shell/entries.h
Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp
Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp
Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.h
Modified: trunk/reactos/subsys/system/explorer/utility/window.h

Modified: trunk/reactos/subsys/system/explorer/explorer.cpp
--- trunk/reactos/subsys/system/explorer/explorer.cpp	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/explorer.cpp	2006-01-16 23:00:38 UTC (rev 20924)
@@ -253,6 +253,13 @@
 {
 }
 
+Icon::Icon(ICON_ID id, UINT nid, int icon_size)
+ :	_id(id),
+	_itype(IT_STATIC),
+	_hicon(ResIconEx(nid, icon_size, icon_size))
+{
+}
+
 Icon::Icon(ICON_TYPE itype, int id, HICON hIcon)
  :	_id((ICON_ID)id),
 	_itype(itype),
@@ -322,10 +329,10 @@
 	return ret;
 }
 
-HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, bool large_icons*/)
+HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/)
 {
-	int cx = GetSystemMetrics(SM_CXSMICON);	//ICON_SIZE_X;
-	int cy = GetSystemMetrics(SM_CYSMICON);	//ICON_SIZE_Y;
+	int cx = ICON_SIZE_SMALL;
+	int cy = ICON_SIZE_SMALL;
 	HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
 
 	MemCanvas canvas;
@@ -373,33 +380,35 @@
 
 void IconCache::init()
 {
+	int icon_size = STARTMENUROOT_ICON_SIZE;
+
 	_icons[ICID_NONE]		= Icon(IT_STATIC, ICID_NONE, (HICON)0);
 
 	_icons[ICID_FOLDER]		= Icon(ICID_FOLDER,		IDI_FOLDER);
 	//_icons[ICID_DOCUMENT]	= Icon(ICID_DOCUMENT,	IDI_DOCUMENT);
 	_icons[ICID_EXPLORER]	= Icon(ICID_EXPLORER,	IDI_EXPLORER);
-	_icons[ICID_APP]		= Icon(ICID_APP,		IDI_APPICON);
+//	_icons[ICID_APP]		= Icon(ICID_APP,		IDI_APPICON);
 
-	_icons[ICID_CONFIG]		= Icon(ICID_CONFIG,		IDI_CONFIG);
-	_icons[ICID_DOCUMENTS]	= Icon(ICID_DOCUMENTS,	IDI_DOCUMENTS);
-	_icons[ICID_FAVORITES]	= Icon(ICID_FAVORITES,	IDI_FAVORITES);
-	_icons[ICID_INFO]		= Icon(ICID_INFO,		IDI_INFO);
-	_icons[ICID_APPS]		= Icon(ICID_APPS,		IDI_APPS);
-	_icons[ICID_SEARCH]		= Icon(ICID_SEARCH,		IDI_SEARCH);
-	_icons[ICID_ACTION]		= Icon(ICID_ACTION,		IDI_ACTION);
-	_icons[ICID_SEARCH_DOC] = Icon(ICID_SEARCH_DOC,	IDI_SEARCH_DOC);
-	_icons[ICID_PRINTER]	= Icon(ICID_PRINTER,	IDI_PRINTER);
-	_icons[ICID_NETWORK]	= Icon(ICID_NETWORK,	IDI_NETWORK);
-	_icons[ICID_COMPUTER]	= Icon(ICID_COMPUTER,	IDI_COMPUTER);
-	_icons[ICID_LOGOFF]		= Icon(ICID_LOGOFF,		IDI_LOGOFF);
-    _icons[ICID_SHUTDOWN]	= Icon(ICID_SHUTDOWN,	IDI_SHUTDOWN);
-	_icons[ICID_BOOKMARK]	= Icon(ICID_BOOKMARK,	IDI_DOT_TRANS);
-    _icons[ICID_MINIMIZE]	= Icon(ICID_MINIMIZE,	IDI_MINIMIZE);
-	_icons[ICID_CONTROLPAN]	    = Icon(ICID_CONTROLPAN,		IDI_CONTROLPAN);
-    _icons[ICID_DESKSETTING]    = Icon(ICID_DESKSETTING,    IDI_DESKSETTING);
-	_icons[ICID_NETCONNS]	    = Icon(ICID_NETCONNS,	    IDI_NETCONNS);
-    _icons[ICID_ADMINISTRATION]	= Icon(ICID_ADMINISTRATION,	IDI_ADMINISTRATION);
-	_icons[ICID_RECENT]     = Icon(ICID_RECENT,	    IDI_RECENT);
+	_icons[ICID_CONFIG]		= Icon(ICID_CONFIG,		IDI_CONFIG,		icon_size);
+	_icons[ICID_DOCUMENTS]	= Icon(ICID_DOCUMENTS,	IDI_DOCUMENTS,	icon_size);
+	_icons[ICID_FAVORITES]	= Icon(ICID_FAVORITES,	IDI_FAVORITES,	icon_size);
+	_icons[ICID_INFO]		= Icon(ICID_INFO,		IDI_INFO,		icon_size);
+	_icons[ICID_APPS]		= Icon(ICID_APPS,		IDI_APPS,		icon_size);
+	_icons[ICID_SEARCH] 	= Icon(ICID_SEARCH, 	IDI_SEARCH,		icon_size);
+	_icons[ICID_ACTION] 	= Icon(ICID_ACTION, 	IDI_ACTION,		icon_size);
+	_icons[ICID_SEARCH_DOC] = Icon(ICID_SEARCH_DOC, IDI_SEARCH_DOC,	icon_size);
+	_icons[ICID_PRINTER]	= Icon(ICID_PRINTER,	IDI_PRINTER,	icon_size);
+	_icons[ICID_NETWORK]	= Icon(ICID_NETWORK,	IDI_NETWORK,	icon_size);
+	_icons[ICID_COMPUTER]	= Icon(ICID_COMPUTER,	IDI_COMPUTER,	icon_size);
+	_icons[ICID_LOGOFF] 	= Icon(ICID_LOGOFF, 	IDI_LOGOFF,		icon_size);
+	_icons[ICID_SHUTDOWN]	= Icon(ICID_SHUTDOWN,	IDI_SHUTDOWN,	icon_size);
+	_icons[ICID_BOOKMARK]	= Icon(ICID_BOOKMARK,	IDI_DOT_TRANS,	icon_size);
+	_icons[ICID_MINIMIZE]	= Icon(ICID_MINIMIZE,	IDI_MINIMIZE,	icon_size);
+	_icons[ICID_CONTROLPAN] = Icon(ICID_CONTROLPAN, IDI_CONTROLPAN,	icon_size);
+	_icons[ICID_DESKSETTING]= Icon(ICID_DESKSETTING,IDI_DESKSETTING,icon_size);
+	_icons[ICID_NETCONNS]	= Icon(ICID_NETCONNS,	IDI_NETCONNS,	icon_size);
+	_icons[ICID_ADMIN]		= Icon(ICID_ADMIN,		IDI_ADMIN,		icon_size);
+	_icons[ICID_RECENT] 	= Icon(ICID_RECENT, 	IDI_RECENT,		icon_size);
 }
 
 
@@ -437,10 +446,10 @@
 	if (flags & ICF_OPEN)
 		shgfi_flags |= SHGFI_OPENICON;
 
-	if ((flags&(ICF_LARGE|ICF_OVERLAYS|ICF_HICON)) && !(flags&ICF_SYSCACHE)) {
+	if ((flags&(ICF_LARGE|ICF_MIDDLE|ICF_OVERLAYS|ICF_HICON)) && !(flags&ICF_SYSCACHE)) {
 		shgfi_flags |= SHGFI_ICON;
 
-		if (!(flags & ICF_LARGE))
+		if (!(flags & (ICF_LARGE|ICF_MIDDLE)))
 			shgfi_flags |= SHGFI_SMALLICON;
 
 		if (flags & ICF_OVERLAYS)
@@ -510,11 +519,11 @@
 	HICON hIconLarge = 0;
 	HICON hIcon;
 
-	bool large_icons = flags & ICF_LARGE;
-	HRESULT hr = pExtract->Extract(path, icon_idx, &hIconLarge, &hIcon, MAKELONG(GetSystemMetrics(SM_CXICON), ICON_SIZE_X));
+	int icon_size = ICON_SIZE_FROM_ICF(flags);
+	HRESULT hr = pExtract->Extract(path, icon_idx, &hIconLarge, &hIcon, MAKELONG(GetSystemMetrics(SM_CXICON), icon_size));
 
 	if (hr == NOERROR) {	//@@ oder SUCCEEDED(hr) ?
-		if (large_icons) {	//@@ OK?
+		if (icon_size > ICON_SIZE_SMALL) {	//@@ OK?
 			if (hIcon)
 				DestroyIcon(hIcon);
 

Modified: trunk/reactos/subsys/system/explorer/explorer_intres.rc
--- trunk/reactos/subsys/system/explorer/explorer_intres.rc	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/explorer_intres.rc	2006-01-16 23:00:38 UTC (rev 20924)
@@ -169,7 +169,7 @@
 IDI_CONTROLPAN          ICON    DISCARDABLE     "res/control-panel.ico"
 IDI_DESKSETTING         ICON    DISCARDABLE     "res/desktop-settings.ico"
 IDI_NETCONNS            ICON    DISCARDABLE     "res/network-conns.ico"
-IDI_ADMINISTRATION      ICON    DISCARDABLE     "res/administration.ico"
+IDI_ADMIN               ICON    DISCARDABLE     "res/administration.ico"
 IDI_RECENT              ICON    DISCARDABLE     "res/recent-documents.ico"
 #endif    // Neutral resources
 /////////////////////////////////////////////////////////////////////////////

Modified: trunk/reactos/subsys/system/explorer/globals.h
--- trunk/reactos/subsys/system/explorer/globals.h	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/globals.h	2006-01-16 23:00:38 UTC (rev 20924)
@@ -86,7 +86,7 @@
     ICID_CONTROLPAN,
     ICID_DESKSETTING,
     ICID_NETCONNS,
-    ICID_ADMINISTRATION,
+    ICID_ADMIN,
     ICID_RECENT,
 
 	ICID_DYNAMIC
@@ -95,6 +95,7 @@
 struct Icon {
 	Icon();
 	Icon(ICON_ID id, UINT nid);
+	Icon(ICON_ID id, UINT nid, int icon_size);
 	Icon(ICON_TYPE itype, int id, HICON hIcon);
 	Icon(ICON_TYPE itype, int id, int sys_idx);
 
@@ -157,12 +158,18 @@
 };
 
 
-#define	ICON_SIZE_X		GetSystemMetrics(large_icons? SM_CXICON: SM_CXSMICON)
-#define	ICON_SIZE_Y		GetSystemMetrics(large_icons? SM_CYICON: SM_CYSMICON)
+#define ICON_SIZE_SMALL		16	// GetSystemMetrics(SM_CXSMICON)
+#define ICON_SIZE_MIDDLE	24	// special size for start menu root icons
+#define ICON_SIZE_LARGE		32	// GetSystemMetrics(SM_CXICON)
 
+#define STARTMENUROOT_ICON_SIZE		ICON_SIZE_MIDDLE	// ICON_SIZE_LARGE
 
+#define ICON_SIZE_FROM_ICF(flags)	(flags&ICF_LARGE? ICON_SIZE_LARGE: flags&ICF_MIDDLE? ICON_SIZE_MIDDLE: ICON_SIZE_SMALL)
+#define ICF_FROM_ICON_SIZE(size)	(size>=ICON_SIZE_LARGE? ICF_LARGE: size>=ICON_SIZE_MIDDLE? ICF_MIDDLE: ICF_NORMAL)
+
+
  /// create a bitmap from an icon
-extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, bool large_icons*/);
+extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/);
 
  /// add icon with alpha channel to imagelist using the specified background color
 extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd);

Modified: trunk/reactos/subsys/system/explorer/resource.h
--- trunk/reactos/subsys/system/explorer/resource.h	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/resource.h	2006-01-16 23:00:38 UTC (rev 20924)
@@ -121,7 +121,7 @@
 #define IDI_CONTROLPAN                  173
 #define IDI_DESKSETTING                 174
 #define IDI_NETCONNS                    175
-#define IDI_ADMINISTRATION              176
+#define IDI_ADMIN                       176
 #define IDI_RECENT                      178
 #define ID_VIEW_NAME                    401
 #define ID_VIEW_ALL_ATTRIBUTES          402

Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp
--- trunk/reactos/subsys/system/explorer/shell/entries.cpp	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/shell/entries.cpp	2006-01-16 23:00:38 UTC (rev 20924)
@@ -361,9 +361,9 @@
 
 	ICON_ID icon_id = ICID_NONE;
 
-	 // not for ET_SHELL to display the correct desktop icon
-	if (_etype!=ET_SHELL && get_path(path, COUNTOF(path)))
-		icon_id = g_Globals._icon_cache.extract(path, flags);
+	if (_etype!=ET_SHELL && get_path(path, COUNTOF(path)))	// not for ET_SHELL to display the correct desktop icon
+		if (!(flags & ICF_MIDDLE))	// not for ICF_MIDDLE to extract 24x24 icons because SHGetFileInfo() doesn't support this icon size
+			icon_id = g_Globals._icon_cache.extract(path, flags);
 
 	if (icon_id == ICID_NONE) {
 		if (!(flags & ICF_OVERLAYS)) {
@@ -418,7 +418,7 @@
 
 			int shgfi_flags = SHGFI_PIDL;
 
-			if (!(flags & ICF_LARGE))
+			if (!(flags & (ICF_LARGE|ICF_MIDDLE)))
 				shgfi_flags |= SHGFI_SMALLICON;
 
 			if (flags & ICF_OPEN)

Modified: trunk/reactos/subsys/system/explorer/shell/entries.h
--- trunk/reactos/subsys/system/explorer/shell/entries.h	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/shell/entries.h	2006-01-16 23:00:38 UTC (rev 20924)
@@ -65,11 +65,12 @@
 
 enum ICONCACHE_FLAGS {
 	ICF_NORMAL	 =  0,
-	ICF_LARGE	 =  1,
-	ICF_OPEN	 =  2,
-	ICF_OVERLAYS =  4,
-	ICF_HICON	 =  8,
-	ICF_SYSCACHE = 16
+	ICF_MIDDLE	 =  1,
+	ICF_LARGE	 =  2,
+	ICF_OPEN	 =  4,
+	ICF_OVERLAYS =  8,
+	ICF_HICON	 = 16,
+	ICF_SYSCACHE = 32
 };
 
 #ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005)

Modified: trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp
--- trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/taskbar/desktopbar.cpp	2006-01-16 23:00:38 UTC (rev 20924)
@@ -161,7 +161,7 @@
 	RegisterHotkeys();
 
 	 // prepare Startmenu, but hide it for now
-	_startMenuRoot = GET_WINDOW(StartMenuRoot, StartMenuRoot::Create(_hwnd, true));	//@@ _large_icons
+	_startMenuRoot = GET_WINDOW(StartMenuRoot, StartMenuRoot::Create(_hwnd, STARTMENUROOT_ICON_SIZE));
 
 	return 0;
 }

Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp
--- trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp	2006-01-16 23:00:38 UTC (rev 20924)
@@ -46,9 +46,9 @@
 #define	SHELLPATH_NET_CONNECTIONS	TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}")
 
 
-StartMenu::StartMenu(HWND hwnd, bool large_icons)
+StartMenu::StartMenu(HWND hwnd, int icon_size)
  :	super(hwnd),
-	_large_icons(large_icons)
+	_icon_size(icon_size)
 {
 	_next_id = IDC_FIRST_MENU;
 	_submenu_id = 0;
@@ -70,10 +70,10 @@
 #endif
 }
 
-StartMenu::StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, bool large_icons)
+StartMenu::StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size)
  :	super(hwnd),
 	_create_info(create_info),
-	_large_icons(large_icons)
+	_icon_size(icon_size)
 {
 	for(StartMenuFolders::const_iterator it=create_info._folders.begin(); it!=create_info._folders.end(); ++it)
 		if (*it)
@@ -133,11 +133,11 @@
 		top_height = 0;
 	}
 
-	bool large_icons = false;
-	RECT rect = {x, y-STARTMENU_LINE_HEIGHT-top_height, x+STARTMENU_WIDTH_MIN, y};
+	int icon_size = ICON_SIZE_SMALL;
+	RECT rect = {x, y-STARTMENU_LINE_HEIGHT(icon_size)-top_height, x+STARTMENU_WIDTH_MIN, y};
 
 #ifndef _LIGHT_STARTMENU
-	rect.top += STARTMENU_LINE_HEIGHT;
+	rect.top += STARTMENU_LINE_HEIGHT(icon_size);
 #endif
 
 	AdjustWindowRectEx(&rect, style, FALSE, ex_style);
@@ -391,7 +391,7 @@
 			if (_arrow_btns) {
 				RECT rect_up, rect_down;
 
-				GetArrowButtonRects(&rect_up, &rect_down, _large_icons);
+				GetArrowButtonRects(&rect_up, &rect_down, _icon_size);
 
 				SCROLL_MODE scroll_mode = SCROLL_NOT;
 
@@ -515,8 +515,8 @@
 int StartMenu::ButtonHitTest(POINT pt)
 {
 	ClientRect clnt(_hwnd);
-	const bool large_icons = _large_icons;
-	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
+	const int icon_size = _icon_size;
+	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
 
 	if (pt.x<rect.left || pt.x>rect.right)
 		return 0;
@@ -527,7 +527,7 @@
 		if (rect.top > pt.y)
 			break;
 
-		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT);
+		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
 
 		if (rect.bottom > _bottom_max)
 			break;
@@ -547,13 +547,13 @@
 		return;
 
 	ClientRect clnt(_hwnd);
-	const bool large_icons = _large_icons;
-	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
+	const int icon_size = _icon_size;
+	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
 
 	for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
 		const SMBtnInfo& info = *it;
 
-		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT);
+		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
 
 		if (info._id == _selected_id) {
 			InvalidateRect(_hwnd, &rect, TRUE);
@@ -773,13 +773,13 @@
 {
 #ifdef _LIGHT_STARTMENU
 	ClientRect clnt(_hwnd);
-	const bool large_icons = _large_icons;
-	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
+	const int icon_size = _icon_size;
+	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
 
 	for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
 		const SMBtnInfo& info = *it;
 
-		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT);
+		rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
 
 		if (info._id == id) {
 			*prect = rect;
@@ -823,10 +823,10 @@
 }
 
 
-void StartMenu::DrawArrows(HDC hdc, bool large_icons)
+void StartMenu::DrawArrows(HDC hdc, int icon_size)
 {
-	int cx = large_icons? 16: 8;
-	int cy = large_icons? 8: 4;
+	int cx = icon_size / 2;
+	int cy = icon_size / 4;
 
 	ResIconEx arrowUpIcon(IDI_ARROW_UP, cx, cy);
 	ResIconEx arrowDownIcon(IDI_ARROW_DOWN, cx, cy);
@@ -837,10 +837,10 @@
 	DrawIconEx(hdc, clnt.right/2-cx/2, clnt.bottom-cy-1, arrowDownIcon, cx, cy, 0, 0, DI_NORMAL);
 }
 
-void StartMenu::GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, bool large_icons)
+void StartMenu::GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, int icon_size)
 {
-	int cx = large_icons? 16: 8;
-	int cy = large_icons? 8: 4;
+	int cx = icon_size / 2;
+	int cy = icon_size / 4;
 
 	GetClientRect(_hwnd, prect_up);
 	*prect_down = *prect_up;
@@ -865,11 +865,11 @@
 
 #ifdef _LIGHT_STARTMENU
 	if (_arrow_btns)
-		DrawArrows(canvas, _large_icons);
+		DrawArrows(canvas, _icon_size);
 
 	ClientRect clnt(_hwnd);
-	const bool large_icons = _large_icons;
-	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
+	const int icon_size = _icon_size;
+	RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
 
 	int sep_width = rect.right-rect.left - 4;
 
@@ -883,24 +883,24 @@
 			break;
 
 		if (btn._id == -1) {	// a separator?
-			rect.bottom = rect.top + STARTMENU_SEP_HEIGHT;
+			rect.bottom = rect.top + STARTMENU_SEP_HEIGHT(icon_size);
 
 			if (rect.bottom > _bottom_max)
 				break;
 
 			BrushSelection brush_sel(canvas, GetSysColorBrush(COLOR_BTNSHADOW));
-			PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT/2-1, sep_width, 1, PATCOPY);
+			PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT(icon_size)/2-1, sep_width, 1, PATCOPY);
 
 			SelectBrush(canvas, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
-			PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT/2, sep_width, 1, PATCOPY);
+			PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT(icon_size)/2, sep_width, 1, PATCOPY);
 		} else {
-			rect.bottom = rect.top + STARTMENU_LINE_HEIGHT;
+			rect.bottom = rect.top + STARTMENU_LINE_HEIGHT(icon_size);
 
 			if (rect.bottom > _bottom_max)
 				break;
 
 			if (rect.top >= canvas.rcPaint.top)
-				DrawStartMenuButton(canvas, rect, btn._title, btn, btn._id==_selected_id, false, _large_icons);
+				DrawStartMenuButton(canvas, rect, btn._title, btn, btn._id==_selected_id, false, _icon_size);
 		}
 
 		rect.top = rect.bottom;
@@ -930,7 +930,7 @@
 				Entry* entry = *it;
 
 				if (entry->_icon_id == ICID_UNKNOWN)
-					entry->_icon_id = entry->safe_extract_icon(_large_icons? ICF_LARGE: ICF_NORMAL);
+					entry->_icon_id = entry->safe_extract_icon(ICF_FROM_ICON_SIZE(_icon_size));
 
 				if (entry->_icon_id > ICID_NONE) {
 					btn._icon_id = (ICON_ID)/*@@*/ entry->_icon_id;
@@ -943,7 +943,7 @@
 						break;
 
 					WindowCanvas canvas(_hwnd);
-					DrawStartMenuButton(canvas, rect, NULL, btn, btn._id==_selected_id, false, _large_icons);
+					DrawStartMenuButton(canvas, rect, NULL, btn, btn._id==_selected_id, false, _icon_size);
 
 					//InvalidateRect(_hwnd, &rect, FALSE);
 					//UpdateWindow(_hwnd);
@@ -966,7 +966,7 @@
 	for(StartMenuShellDirs::iterator it=_dirs.begin(); it!=_dirs.end(); ++it) {
 		ShellDirectory& dir = it->_dir;
 
-		icons_extracted += dir.extract_icons();
+		icons_extracted += dir.extract_icons(icon_size);
 	}
 
 	if (icons_extracted) {
@@ -1132,19 +1132,19 @@
 	ClientRect clnt(_hwnd);
 
 	 // increase window height to make room for the new button
-	rect.top -= STARTMENU_LINE_HEIGHT;
+	rect.top -= STARTMENU_LINE_HEIGHT(icon_size);
 
 	 // move down if we are too high now
 	if (rect.top < 0) {
-		rect.top += STARTMENU_LINE_HEIGHT;
-		rect.bottom += STARTMENU_LINE_HEIGHT;
+		rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+		rect.bottom += STARTMENU_LINE_HEIGHT(icon_size);
 	}
 
 	WindowCanvas canvas(_hwnd);
 	FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
 
 	 // widen window, if it is too small
-	int text_width = GetStartMenuBtnTextWidth(canvas, title, _hwnd) + ICON_SIZE_X + 10/*placeholder*/ + 16/*arrow*/;
+	int text_width = GetStartMenuBtnTextWidth(canvas, title, _hwnd) + icon_size + 10/*placeholder*/ + 16/*arrow*/;
 
 	int cx = clnt.right - _border_left;
 	if (text_width > cx)
@@ -1166,12 +1166,12 @@
 	ClientRect clnt(_hwnd);
 
 	 // increase window height to make room for the new separator
-	rect.top -= STARTMENU_SEP_HEIGHT;
+	rect.top -= STARTMENU_SEP_HEIGHT(icon_size);
 
 	 // move down if we are too high now
 	if (rect.top < 0) {
-		rect.top += STARTMENU_LINE_HEIGHT;
-		rect.bottom += STARTMENU_LINE_HEIGHT;
+		rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+		rect.bottom += STARTMENU_LINE_HEIGHT(icon_size);
 	}
 
 	MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
@@ -1262,8 +1262,8 @@
 		ClientToScreen(_hwnd, &rect);
 
 		x = rect.right;	// Submenus should overlap their parent a bit.
-		const bool large_icons = _large_icons;
-		y = rect.top+STARTMENU_LINE_HEIGHT +_border_top/*own border*/ -STARTMENU_TOP_BTN_SPACE/*border of new submenu*/;
+		const int icon_size = _icon_size;
+		y = rect.top+STARTMENU_LINE_HEIGHT(icon_size) +_border_top/*own border*/ -STARTMENU_TOP_BTN_SPACE/*border of new submenu*/;
 	} else {
 		WindowRect pos(_hwnd);
 
@@ -1364,10 +1364,10 @@
 }
 
 #ifdef _LIGHT_STARTMENU
-void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, bool large_icons)
+void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, int icon_size)
 #else
 void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, HICON hIcon,
-								bool hasSubmenu, bool enabled, bool has_focus, bool pushed, bool large_icons);
+								bool hasSubmenu, bool enabled, bool has_focus, bool pushed, int icon_size);
 #endif
 {
 	UINT style = DFCS_BUTTONPUSH;
@@ -1375,8 +1375,8 @@
 	if (!btn._enabled)
 		style |= DFCS_INACTIVE;
 
-	POINT iconPos = {rect.left+2, (rect.top+rect.bottom-ICON_SIZE_Y)/2};
-	RECT textRect = {rect.left+ICON_SIZE_X+4, rect.top+2, rect.right-4, rect.bottom-4};
+	POINT iconPos = {rect.left+2, (rect.top+rect.bottom-icon_size)/2};
+	RECT textRect = {rect.left+icon_size+4, rect.top+2, rect.right-4, rect.bottom-4};
 
 	if (pushed) {
 		style |= DFCS_PUSHED;
@@ -1400,16 +1400,16 @@
 		FillRect(hdc, &rect, bk_brush);
 
 	if (btn._icon_id > ICID_NONE)
-		g_Globals._icon_cache.get_icon(btn._icon_id).draw(hdc, iconPos.x, iconPos.y, ICON_SIZE_X, ICON_SIZE_Y, bk_color, bk_brush/*, large_icons*/);
+		g_Globals._icon_cache.get_icon(btn._icon_id).draw(hdc, iconPos.x, iconPos.y, icon_size, icon_size, bk_color, bk_brush/*, icon_size*/);
 
 	 // draw submenu arrow at the right
 	if (btn._hasSubmenu) {
-		ResIconEx arrowIcon(IDI_ARROW, ICON_SIZE_X, ICON_SIZE_Y);
-		ResIconEx selArrowIcon(IDI_ARROW_SELECTED, ICON_SIZE_X, ICON_SIZE_Y);
+		ResIconEx arrowIcon(IDI_ARROW, icon_size, icon_size);
+		ResIconEx selArrowIcon(IDI_ARROW_SELECTED, icon_size, icon_size);
 
-		DrawIconEx(hdc, rect.right-ICON_SIZE_X, iconPos.y,
+		DrawIconEx(hdc, rect.right-icon_size, iconPos.y,
 					has_focus? selArrowIcon: arrowIcon,
-					ICON_SIZE_X, ICON_SIZE_Y, 0, bk_brush, DI_NORMAL);
+					icon_size, icon_size, 0, bk_brush, DI_NORMAL);
 	}
 
 	if (title) {
@@ -1434,7 +1434,7 @@
 	WindowCanvas canvas(_hwnd);
 	FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
 
-	const bool large_icons = _large_icons;
+	const int icon_size = _icon_size;
 
 	int max_width = STARTMENU_WIDTH_MIN;
 	int height = 0;
@@ -1446,13 +1446,13 @@
 			max_width = w;
 
 		if (it->_id == -1)
-			height += STARTMENU_SEP_HEIGHT;
+			height += STARTMENU_SEP_HEIGHT(icon_size);
 		else
-			height += STARTMENU_LINE_HEIGHT;
+			height += STARTMENU_LINE_HEIGHT(icon_size);
 	}
 
 	 // calculate new window size
-	int text_width = max_width + ICON_SIZE_X + 10/*placeholder*/ + 16/*arrow*/;
+	int text_width = max_width + icon_size + 10/*placeholder*/ + 16/*arrow*/;
 
 	RECT rt_hgt = {rect.left, rect.bottom-_border_top-height, rect.left+_border_left+text_width, rect.bottom};
 	AdjustWindowRectEx(&rt_hgt, GetWindowStyle(_hwnd), FALSE, GetWindowExStyle(_hwnd));
@@ -1475,8 +1475,8 @@
 	if (rect.bottom > cyscreen) {
 		_arrow_btns = true;
 
-		_invisible_lines = (rect.bottom-cyscreen+(STARTMENU_LINE_HEIGHT-1))/STARTMENU_LINE_HEIGHT + 1;
-		rect.bottom -= _invisible_lines * STARTMENU_LINE_HEIGHT;
+		_invisible_lines = (rect.bottom-cyscreen+(STARTMENU_LINE_HEIGHT(icon_size)-1))/STARTMENU_SEP_HEIGHT(icon_size) + 1;
+		rect.bottom -= _invisible_lines * STARTMENU_LINE_HEIGHT(icon_size);
 
 		bottom_max = rect.bottom;
 
@@ -1541,8 +1541,8 @@
 #endif
 
 
-StartMenuRoot::StartMenuRoot(HWND hwnd)
- :	super(hwnd, false)	///@todo big icons in start menu root
+StartMenuRoot::StartMenuRoot(HWND hwnd, const StartMenuRootCreateInfo& info)
+ :	super(hwnd, info._icon_size)
 {
 #ifndef __MINGW32__	// SHRestricted() missing in MinGW (as of 29.10.2003)
 	if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCOMMONGROUPS))
@@ -1579,29 +1579,33 @@
 }
 
 
-static void CalculateStartPos(HWND hwndOwner, RECT& rect, bool large_icons)
+static void CalculateStartPos(HWND hwndOwner, RECT& rect, int icon_size)
 {
 	WindowRect pos(hwndOwner);
 
 	rect.left = pos.left;
-	rect.top = pos.top-STARTMENU_LINE_HEIGHT-4;
+	rect.top = pos.top-STARTMENU_LINE_HEIGHT(icon_size)-4;
 	rect.right = pos.left+STARTMENU_WIDTH_MIN;
 	rect.bottom = pos.top;
 
 #ifndef _LIGHT_STARTMENU
-	rect.top += STARTMENU_LINE_HEIGHT;
+	rect.top += STARTMENU_LINE_HEIGHT(icon_size);
 #endif
 
 	AdjustWindowRectEx(&rect, WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE, FALSE, 0);
 }
 
-HWND StartMenuRoot::Create(HWND hwndOwner, bool large_icons)
+HWND StartMenuRoot::Create(HWND hwndOwner, int icon_size)
 {
 	RECT rect;
 
-	CalculateStartPos(hwndOwner, rect, large_icons);
+	CalculateStartPos(hwndOwner, rect, icon_size);
 
-	return Window::Create(WINDOW_CREATOR(StartMenuRoot), 0, GetWndClasss(), TITLE_STARTMENU,
+	StartMenuRootCreateInfo create_info;
+
+	create_info._icon_size = icon_size;
+
+	return Window::Create(WINDOW_CREATOR_INFO(StartMenuRoot,StartMenuRootCreateInfo), &create_info, 0, GetWndClasss(), TITLE_STARTMENU,
 							WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN,
 							rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, hwndOwner);
 }
@@ -1620,7 +1624,7 @@
 	 // recalculate start menu root position
 	RECT rect;
 
-	CalculateStartPos(GetParent(hwnd), rect, _large_icons);
+	CalculateStartPos(GetParent(hwnd), rect, _icon_size);
 
 	SetWindowPos(hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 0);
 
@@ -2150,7 +2154,7 @@
 //TODO	AddButton(ResString(IDS_PRINTERS),			ICID_PRINTER, true, IDC_PRINTERS_MENU);
 	AddButton(ResString(IDS_CONNECTIONS),		ICID_NETCONNS, false, IDC_CONNECTIONS);
 #endif
-	AddButton(ResString(IDS_ADMIN),				ICID_ADMINISTRATION, true, IDC_ADMIN);
+	AddButton(ResString(IDS_ADMIN),				ICID_ADMIN, true, IDC_ADMIN);
 
 #ifndef __MINGW32__	// SHRestricted() missing in MinGW (as of 29.10.2003)
 	if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL))

Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.h
--- trunk/reactos/subsys/system/explorer/taskbar/startmenu.h	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/taskbar/startmenu.h	2006-01-16 23:00:38 UTC (rev 20924)
@@ -30,10 +30,10 @@
 #define	TITLE_STARTMENU			TEXT("Start Menu")
 
 
-#define	STARTMENU_WIDTH_MIN		120
-#define	STARTMENU_LINE_HEIGHT	(ICON_SIZE_X+4)
-#define	STARTMENU_SEP_HEIGHT	(STARTMENU_LINE_HEIGHT/2)
-#define	STARTMENU_TOP_BTN_SPACE	8
+#define	STARTMENU_WIDTH_MIN					120
+#define	STARTMENU_LINE_HEIGHT(icon_size)	(icon_size+4)
+#define	STARTMENU_SEP_HEIGHT(icon_size)		(STARTMENU_LINE_HEIGHT(icon_size)/2)
+#define	STARTMENU_TOP_BTN_SPACE				8
 
 
  // private message constants
@@ -110,7 +110,7 @@
 {
 	StartMenuCtrl(HWND parent, int x, int y, int w, LPCTSTR title,
 					UINT id, HICON hIcon=0, bool hasSubmenu=false, DWORD style=WS_VISIBLE|WS_CHILD|BS_OWNERDRAW, DWORD exStyle=0)
-	 :	Button(parent, title, x, y, w, STARTMENU_LINE_HEIGHT, id, style, exStyle)
+	 :	Button(parent, title, x, y, w, STARTMENU_LINE_HEIGHT(icon_size), id, style, exStyle)
 	{
 		*new StartMenuButton(_hwnd, hIcon, hasSubmenu);
 
@@ -123,7 +123,7 @@
 struct StartMenuSeparator : public Static
 {
 	StartMenuSeparator(HWND parent, int x, int y, int w, DWORD style=WS_VISIBLE|WS_CHILD|WS_DISABLED|SS_ETCHEDHORZ, DWORD exStyle=0)
-	 :	Static(parent, NULL, x, y+STARTMENU_SEP_HEIGHT/2-1, w, 2, -1, style, exStyle)
+	 :	Static(parent, NULL, x, y+STARTMENU_SEP_HEIGHT(icon_size)/2-1, w, 2, -1, style, exStyle)
 	{
 	}
 };
@@ -182,12 +182,12 @@
 
 typedef vector<SMBtnInfo> SMBtnVector;
 
-extern void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, bool large_icons);
+extern void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, int icon_size);
 
 #else
 
 extern void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, HICON hIcon,
-								bool hasSubmenu, bool enabled, bool has_focus, bool pushed, bool large_icons);
+								bool hasSubmenu, bool enabled, bool has_focus, bool pushed, int icon_size);
 
 #endif
 
@@ -209,8 +209,8 @@
 	typedef ExtContextMenuHandlerT<OwnerDrawParent<DialogWindow> > super;
 #endif
 
-	StartMenu(HWND hwnd, bool large_icons=false);
-	StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, bool large_icons=false);
+	StartMenu(HWND hwnd, int icon_size=ICON_SIZE_SMALL);
+	StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size=ICON_SIZE_SMALL);
 	~StartMenu();
 
 	static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title,
@@ -248,7 +248,7 @@
 
 	StartMenuCreateInfo _create_info;	// copy of the original create info
 
-	bool	_large_icons;
+	int		_icon_size;
 
 #ifdef _LIGHT_STARTMENU
 	SMBtnVector _buttons;
@@ -296,9 +296,9 @@
 
 	void	DrawFloatingButton(HDC hdc);
 	void	GetFloatingButtonRect(LPRECT prect);
-	void	GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, bool large_icons);
+	void	GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, int icon_size);
 
-	void	DrawArrows(HDC hdc, bool large_icons);
+	void	DrawArrows(HDC hdc, int icon_size);
 
 	void	Paint(PaintCanvas& canvas);
 	void	UpdateIcons(/*int idx*/);
@@ -333,13 +333,13 @@
 {
 	typedef StartMenu super;
 
-	StartMenuHandler(HWND hwnd, bool large_icons=false)
-	 :	super(hwnd, large_icons)
+	StartMenuHandler(HWND hwnd, int icon_size=ICON_SIZE_SMALL)
+	 :	super(hwnd, icon_size)
 	{
 	}
 
-	StartMenuHandler(HWND hwnd, const StartMenuCreateInfo& create_info, bool large_icons=false)
-	 :	super(hwnd, create_info, large_icons)
+	StartMenuHandler(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size=ICON_SIZE_SMALL)
+	 :	super(hwnd, create_info, icon_size)
 	{
 	}
 
@@ -353,14 +353,20 @@
 };
 
 
+struct StartMenuRootCreateInfo
+{
+	int	_icon_size;
+};
+
+
  /// Startmenu root window
 struct StartMenuRoot : public StartMenuHandler
 {
 	typedef StartMenuHandler super;
 
-	StartMenuRoot(HWND hwnd);
+	StartMenuRoot(HWND hwnd, const StartMenuRootCreateInfo& info);
 
-	static HWND Create(HWND hwndDesktopBar, bool large_icons);
+	static HWND Create(HWND hwndDesktopBar, int icon_size);
 	void	TrackStartmenu();
 
 protected:

Modified: trunk/reactos/subsys/system/explorer/utility/window.h
--- trunk/reactos/subsys/system/explorer/utility/window.h	2006-01-16 22:07:38 UTC (rev 20923)
+++ trunk/reactos/subsys/system/explorer/utility/window.h	2006-01-16 23:00:38 UTC (rev 20924)
@@ -66,8 +66,8 @@
 	typedef Window* (*CREATORFUNC)(HWND);
 	typedef Window* (*CREATORFUNC_INFO)(HWND, const void*);
 
-	static HWND Create(CREATORFUNC creator, DWORD dwExStyle,
-				LPCTSTR lpClassName, LPCTSTR lpWindowName,
+	static HWND Create(CREATORFUNC creator,
+				DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
 				DWORD dwStyle, int x, int y, int w, int h,
 				HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);