mirror of
https://github.com/reactos/reactos.git
synced 2025-05-25 20:18:22 +00:00
[PROGMAN]: Use a ListView to list program items. On systems that support it (aka. Vista+), enable ListView theming.
svn path=/trunk/; revision=71324
This commit is contained in:
parent
80d2a73871
commit
021e1a40a4
1 changed files with 161 additions and 0 deletions
|
@ -29,6 +29,83 @@
|
||||||
|
|
||||||
#include "progman.h"
|
#include "progman.h"
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
*
|
||||||
|
* UX Theming helpers, dropped from msconfig_new/comctl32ex/uxthemesupp.c
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static HMODULE hUxTheme = NULL;
|
||||||
|
|
||||||
|
typedef HRESULT (WINAPI* ETDTProc)(HWND, DWORD);
|
||||||
|
static ETDTProc fnEnableThemeDialogTexture = NULL;
|
||||||
|
|
||||||
|
typedef HRESULT (WINAPI* SWTProc)(HWND, LPCWSTR, LPCWSTR);
|
||||||
|
static SWTProc fnSetWindowTheme = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
InitUxTheme(VOID)
|
||||||
|
{
|
||||||
|
if (hUxTheme) return TRUE;
|
||||||
|
|
||||||
|
hUxTheme = LoadLibraryW(L"uxtheme.dll");
|
||||||
|
if (hUxTheme == NULL) return FALSE;
|
||||||
|
|
||||||
|
fnEnableThemeDialogTexture =
|
||||||
|
(ETDTProc)GetProcAddress(hUxTheme, "EnableThemeDialogTexture");
|
||||||
|
fnSetWindowTheme =
|
||||||
|
(SWTProc)GetProcAddress(hUxTheme, "SetWindowTheme");
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static VOID
|
||||||
|
CleanupUxTheme(VOID)
|
||||||
|
{
|
||||||
|
FreeLibrary(hUxTheme);
|
||||||
|
hUxTheme = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Taken from WinSpy++ 1.7
|
||||||
|
// http://www.catch22.net/software/winspy
|
||||||
|
// Copyright (c) 2002 by J Brown
|
||||||
|
//
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
WINAPI
|
||||||
|
EnableThemeDialogTexture(_In_ HWND hwnd,
|
||||||
|
_In_ DWORD dwFlags)
|
||||||
|
{
|
||||||
|
if (!InitUxTheme())
|
||||||
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
|
if (!fnEnableThemeDialogTexture)
|
||||||
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
|
return fnEnableThemeDialogTexture(hwnd, dwFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
WINAPI
|
||||||
|
SetWindowTheme(_In_ HWND hwnd,
|
||||||
|
_In_ LPCWSTR pszSubAppName,
|
||||||
|
_In_ LPCWSTR pszSubIdList)
|
||||||
|
{
|
||||||
|
if (!InitUxTheme())
|
||||||
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
|
if (!fnSetWindowTheme)
|
||||||
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
|
||||||
|
return fnSetWindowTheme(hwnd, pszSubAppName, pszSubIdList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*
|
*
|
||||||
* GROUP_GroupWndProc
|
* GROUP_GroupWndProc
|
||||||
|
@ -40,6 +117,8 @@ CALLBACK
|
||||||
GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PROGGROUP* group;
|
PROGGROUP* group;
|
||||||
|
INT iItem;
|
||||||
|
LVITEMW lvItem;
|
||||||
|
|
||||||
group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
|
group = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
|
||||||
|
|
||||||
|
@ -89,6 +168,53 @@ GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
SetWindowLongPtrW(hWnd, 0, 0);
|
SetWindowLongPtrW(hWnd, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_CREATE:
|
||||||
|
{
|
||||||
|
DWORD dwStyle;
|
||||||
|
RECT rect;
|
||||||
|
GetClientRect(hWnd, &rect);
|
||||||
|
group->hListView = CreateWindowW(WC_LISTVIEW,
|
||||||
|
NULL,
|
||||||
|
WS_CHILD | WS_VISIBLE | WS_OVERLAPPED,
|
||||||
|
0, 0,
|
||||||
|
rect.right - rect.left,
|
||||||
|
rect.bottom - rect.top,
|
||||||
|
hWnd,
|
||||||
|
NULL,
|
||||||
|
Globals.hInstance,
|
||||||
|
NULL);
|
||||||
|
dwStyle = (GetWindowLongPtrW(group->hListView, GWL_STYLE) | LVS_SHOWSELALWAYS) & ~LVS_AUTOARRANGE;
|
||||||
|
SetWindowLongPtrW(group->hListView, GWL_STYLE, dwStyle);
|
||||||
|
dwStyle = SendMessageA(group->hListView, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0) | LVS_EX_BORDERSELECT;
|
||||||
|
SendMessageA(group->hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_SNAPTOGRID, dwStyle);
|
||||||
|
InitUxTheme();
|
||||||
|
SetWindowTheme(group->hListView, L"Explorer", NULL);
|
||||||
|
group->hListLarge = ImageList_Create(GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), ILC_COLOR24 | ILC_MASK, 1, 1);
|
||||||
|
SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, (LPARAM)group->hListLarge);
|
||||||
|
SendMessageA(group->hListView, LVM_SETICONSPACING, 0, MAKELPARAM(80, 64));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
SendMessageA(group->hListView, LVM_SETIMAGELIST, 0, 0);
|
||||||
|
ImageList_Destroy(group->hListLarge);
|
||||||
|
DestroyWindow(group->hListView);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_SIZE:
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = LOWORD(lParam);
|
||||||
|
rect.bottom = HIWORD(lParam);
|
||||||
|
AdjustWindowRectEx(&rect, GetWindowLongPtrW(group->hListView, GWL_STYLE), FALSE, GetWindowLongPtrW(group->hListView, GWL_EXSTYLE));
|
||||||
|
MoveWindow(group->hListView, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
|
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
|
||||||
break;
|
break;
|
||||||
|
@ -102,6 +228,41 @@ GROUP_GroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
|
Globals.hActiveGroup = (PROGGROUP*)GetWindowLongPtrW(hWnd, 0);
|
||||||
Globals.hActiveGroup->hActiveProgram = NULL;
|
Globals.hActiveGroup->hActiveProgram = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_NOTIFY:
|
||||||
|
switch (((LPNMHDR)lParam)->code)
|
||||||
|
{
|
||||||
|
case NM_CLICK:
|
||||||
|
{
|
||||||
|
iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
|
||||||
|
if (iItem == -1)
|
||||||
|
{
|
||||||
|
group->hActiveProgram = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lvItem.mask = LVIF_PARAM;
|
||||||
|
lvItem.iItem = iItem;
|
||||||
|
SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem);
|
||||||
|
group->hActiveProgram = (PROGRAM*)lvItem.lParam;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case NM_DBLCLK:
|
||||||
|
{
|
||||||
|
iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
|
||||||
|
if (iItem == -1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lvItem.mask = LVIF_PARAM;
|
||||||
|
lvItem.iItem = iItem;
|
||||||
|
SendMessageW(group->hListView, LVM_GETITEMW, 0, (LPARAM)&lvItem);
|
||||||
|
/* ... or use group->hActiveProgram */
|
||||||
|
PROGRAM_ExecuteProgram((PROGRAM*)lvItem.lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefMDIChildProcW(hWnd, uMsg, wParam, lParam);
|
return DefMDIChildProcW(hWnd, uMsg, wParam, lParam);
|
||||||
|
|
Loading…
Reference in a new issue