mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
draw startmenu subfolder arrows
svn path=/trunk/; revision=5696
This commit is contained in:
parent
9a3c91b31d
commit
10f0f6628e
16 changed files with 107 additions and 86 deletions
|
@ -63,12 +63,12 @@ ResString::ResString(UINT nid)
|
||||||
|
|
||||||
ResIcon::ResIcon(UINT nid)
|
ResIcon::ResIcon(UINT nid)
|
||||||
{
|
{
|
||||||
_hicon = LoadIcon(g_Globals._hInstance, MAKEINTRESOURCE(nid));
|
_hIcon = LoadIcon(g_Globals._hInstance, MAKEINTRESOURCE(nid));
|
||||||
}
|
}
|
||||||
|
|
||||||
SmallIcon::SmallIcon(UINT nid)
|
SmallIcon::SmallIcon(UINT nid)
|
||||||
{
|
{
|
||||||
_hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
|
_hIcon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -509,6 +509,10 @@ SOURCE=.\shell\winfs.h
|
||||||
# End Group
|
# End Group
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\res\arrow.ico
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\explorer.cpp
|
SOURCE=.\explorer.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#define ID_EXECUTE 111
|
#define ID_EXECUTE 111
|
||||||
#define IDM_WINEFILE 112
|
#define IDM_WINEFILE 112
|
||||||
#define IDI_LOGOFF 124
|
#define IDI_LOGOFF 124
|
||||||
|
#define IDI_FOLDERARROW 125
|
||||||
#define ID_VIEW_NAME 401
|
#define ID_VIEW_NAME 401
|
||||||
#define ID_VIEW_ALL_ATTRIBUTES 402
|
#define ID_VIEW_ALL_ATTRIBUTES 402
|
||||||
#define ID_VIEW_SELECTED_ATTRIBUTES 403
|
#define ID_VIEW_SELECTED_ATTRIBUTES 403
|
||||||
|
@ -62,7 +63,7 @@
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 126
|
#define _APS_NEXT_RESOURCE_VALUE 127
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
|
|
|
@ -94,6 +94,7 @@ IDI_REACTOS ICON DISCARDABLE "res/reactos.ico"
|
||||||
IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico"
|
IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico"
|
||||||
IDI_STARTMENU ICON DISCARDABLE "res/startmenu.ico"
|
IDI_STARTMENU ICON DISCARDABLE "res/startmenu.ico"
|
||||||
IDI_LOGOFF ICON DISCARDABLE "res/logoff.ico"
|
IDI_LOGOFF ICON DISCARDABLE "res/logoff.ico"
|
||||||
|
IDI_FOLDERARROW ICON DISCARDABLE "res/arrow.ico"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
|
|
@ -48,18 +48,18 @@ struct ResIcon
|
||||||
{
|
{
|
||||||
ResIcon(UINT nid);
|
ResIcon(UINT nid);
|
||||||
|
|
||||||
operator HICON() const {return _hicon;}
|
operator HICON() const {return _hIcon;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HICON _hicon;
|
HICON _hIcon;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SmallIcon
|
struct SmallIcon
|
||||||
{
|
{
|
||||||
SmallIcon(UINT nid);
|
SmallIcon(UINT nid);
|
||||||
|
|
||||||
operator HICON() const {return _hicon;}
|
operator HICON() const {return _hIcon;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HICON _hicon;
|
HICON _hIcon;
|
||||||
};
|
};
|
||||||
|
|
BIN
reactos/subsys/system/explorer/res/arrow.ico
Normal file
BIN
reactos/subsys/system/explorer/res/arrow.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 318 B |
|
@ -44,7 +44,7 @@ Entry::Entry(ENTRY_TYPE etype)
|
||||||
_scanned = false;
|
_scanned = false;
|
||||||
_bhfi_valid = false;
|
_bhfi_valid = false;
|
||||||
_level = 0;
|
_level = 0;
|
||||||
_hicon = 0;
|
_hIcon = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry::Entry(Entry* parent)
|
Entry::Entry(Entry* parent)
|
||||||
|
@ -57,14 +57,14 @@ Entry::Entry(Entry* parent)
|
||||||
_scanned = false;
|
_scanned = false;
|
||||||
_bhfi_valid = false;
|
_bhfi_valid = false;
|
||||||
_level = 0;
|
_level = 0;
|
||||||
_hicon = 0;
|
_hIcon = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// free a directory entry
|
// free a directory entry
|
||||||
Entry::~Entry()
|
Entry::~Entry()
|
||||||
{
|
{
|
||||||
if (_hicon && _hicon!=(HICON)-1)
|
if (_hIcon && _hIcon!=(HICON)-1)
|
||||||
DestroyIcon(_hicon);
|
DestroyIcon(_hIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ public:
|
||||||
SFGAOF _shell_attribs;
|
SFGAOF _shell_attribs;
|
||||||
|
|
||||||
ENTRY_TYPE _etype;
|
ENTRY_TYPE _etype;
|
||||||
HICON _hicon;
|
HICON _hIcon;
|
||||||
|
|
||||||
BY_HANDLE_FILE_INFORMATION _bhfi;
|
BY_HANDLE_FILE_INFORMATION _bhfi;
|
||||||
bool _bhfi_valid;
|
bool _bhfi_valid;
|
||||||
|
|
|
@ -472,8 +472,8 @@ void Pane::draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol)
|
||||||
if (cx > IMAGE_WIDTH)
|
if (cx > IMAGE_WIDTH)
|
||||||
cx = IMAGE_WIDTH;
|
cx = IMAGE_WIDTH;
|
||||||
|
|
||||||
if (entry->_hicon && entry->_hicon!=(HICON)-1)
|
if (entry->_hIcon && entry->_hIcon!=(HICON)-1)
|
||||||
DrawIconEx(dis->hDC, img_pos, dis->rcItem.top, entry->_hicon, cx, GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL);
|
DrawIconEx(dis->hDC, img_pos, dis->rcItem.top, entry->_hIcon, cx, GetSystemMetrics(SM_CYSMICON), 0, 0, DI_NORMAL);
|
||||||
else
|
else
|
||||||
ImageList_DrawEx(_himl, img, dis->hDC,
|
ImageList_DrawEx(_himl, img, dis->hDC,
|
||||||
img_pos, dis->rcItem.top, cx,
|
img_pos, dis->rcItem.top, cx,
|
||||||
|
|
|
@ -175,7 +175,7 @@ static HICON extract_icon(IShellFolder* folder, LPCITEMIDLIST pidl)
|
||||||
if (SUCCEEDED(folder->GetUIObjectOf(0, 1, (LPCITEMIDLIST*)&pidl, IID_IExtractIcon, 0, (LPVOID*)&pExtract))) {
|
if (SUCCEEDED(folder->GetUIObjectOf(0, 1, (LPCITEMIDLIST*)&pidl, IID_IExtractIcon, 0, (LPVOID*)&pExtract))) {
|
||||||
TCHAR path[_MAX_PATH];
|
TCHAR path[_MAX_PATH];
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
HICON hicon;
|
HICON hIcon;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
if (SUCCEEDED(pExtract->GetIconLocation(GIL_FORSHELL, path, _MAX_PATH, &idx, &flags))) {
|
if (SUCCEEDED(pExtract->GetIconLocation(GIL_FORSHELL, path, _MAX_PATH, &idx, &flags))) {
|
||||||
|
@ -183,18 +183,18 @@ static HICON extract_icon(IShellFolder* folder, LPCITEMIDLIST pidl)
|
||||||
if (idx == -1)
|
if (idx == -1)
|
||||||
idx = 0; // special case for some control panel applications
|
idx = 0; // special case for some control panel applications
|
||||||
|
|
||||||
if ((int)ExtractIconEx(path, idx, 0, &hicon, 1) > 0)
|
if ((int)ExtractIconEx(path, idx, 0, &hIcon, 1) > 0)
|
||||||
flags &= ~GIL_DONTCACHE;
|
flags &= ~GIL_DONTCACHE;
|
||||||
} else {
|
} else {
|
||||||
HICON hIconLarge = 0;
|
HICON hIconLarge = 0;
|
||||||
|
|
||||||
HRESULT hr = pExtract->Extract(path, idx, &hIconLarge, &hicon, MAKELONG(0/*GetSystemMetrics(SM_CXICON)*/,GetSystemMetrics(SM_CXSMICON)));
|
HRESULT hr = pExtract->Extract(path, idx, &hIconLarge, &hIcon, MAKELONG(0/*GetSystemMetrics(SM_CXICON)*/,GetSystemMetrics(SM_CXSMICON)));
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
DestroyIcon(hIconLarge);
|
DestroyIcon(hIconLarge);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hicon;
|
return hIcon;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,10 +275,10 @@ void ShellDirectory::read_directory()
|
||||||
// get display icons for files and virtual objects
|
// get display icons for files and virtual objects
|
||||||
if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
|
if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
|
||||||
!(attribs & SFGAO_FILESYSTEM)) {
|
!(attribs & SFGAO_FILESYSTEM)) {
|
||||||
entry->_hicon = extract_icon(_folder, pidls[n]);
|
entry->_hIcon = extract_icon(_folder, pidls[n]);
|
||||||
|
|
||||||
if (!entry->_hicon)
|
if (!entry->_hIcon)
|
||||||
entry->_hicon = (HICON)-1; // don't try again later
|
entry->_hIcon = (HICON)-1; // don't try again later
|
||||||
}
|
}
|
||||||
|
|
||||||
entry->_down = NULL;
|
entry->_down = NULL;
|
||||||
|
|
|
@ -84,10 +84,19 @@ LRESULT StartMenu::Init(LPCREATESTRUCT pcs)
|
||||||
if (super::Init(pcs))
|
if (super::Init(pcs))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
// create buttons for registered entries in _entries
|
||||||
|
if (_entries.empty()) {
|
||||||
|
AddButton(ResString(IDS_EMPTY), 0, false, (UINT)-1, WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW|WS_DISABLED);
|
||||||
|
} else {
|
||||||
for(ShellEntryMap::const_iterator it=_entries.begin(); it!=_entries.end(); ++it) {
|
for(ShellEntryMap::const_iterator it=_entries.begin(); it!=_entries.end(); ++it) {
|
||||||
const StartMenuEntry& sme = it->second;
|
const StartMenuEntry& sme = it->second;
|
||||||
|
bool showArrow = false;
|
||||||
|
|
||||||
AddButton(sme._title, sme._hIcon, it->first);
|
if (sme._entry && (sme._entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
|
||||||
|
showArrow = true;
|
||||||
|
|
||||||
|
AddButton(sme._title, sme._hIcon, showArrow, it->first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -194,7 +203,7 @@ StartMenuEntry& StartMenu::AddEntry(LPCTSTR title, HICON hIcon, UINT id)
|
||||||
|
|
||||||
StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, const ShellEntry* entry)
|
StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, const ShellEntry* entry)
|
||||||
{
|
{
|
||||||
HICON hIcon = entry->_hicon;
|
HICON hIcon = entry->_hIcon;
|
||||||
|
|
||||||
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
hIcon = SmallIcon(IDI_EXPLORER);
|
hIcon = SmallIcon(IDI_EXPLORER);
|
||||||
|
@ -209,7 +218,7 @@ StartMenuEntry& StartMenu::AddEntry(const ShellFolder folder, const ShellEntry*
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void StartMenu::AddButton(LPCTSTR title, HICON hIcon, UINT id)
|
void StartMenu::AddButton(LPCTSTR title, HICON hIcon, bool showArrow, UINT id, DWORD style)
|
||||||
{
|
{
|
||||||
WindowRect rect(_hwnd);
|
WindowRect rect(_hwnd);
|
||||||
|
|
||||||
|
@ -222,7 +231,7 @@ void StartMenu::AddButton(LPCTSTR title, HICON hIcon, UINT id)
|
||||||
|
|
||||||
MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
|
MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
|
||||||
|
|
||||||
StartMenuButton(_hwnd, rect.bottom-rect.top-STARTMENU_LINE_HEIGHT-4, title, id, hIcon);
|
StartMenuButton(_hwnd, rect.bottom-rect.top-STARTMENU_LINE_HEIGHT-4, title, id, hIcon, showArrow, style);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartMenu::AddSeparator()
|
void StartMenu::AddSeparator()
|
||||||
|
@ -250,13 +259,13 @@ void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, CREAT
|
||||||
if (btn) {
|
if (btn) {
|
||||||
WindowRect pos(btn);
|
WindowRect pos(btn);
|
||||||
|
|
||||||
x = pos.right;
|
x = pos.right-8; // Submenus should overlap their parent a bit.
|
||||||
y = pos.top+STARTMENU_HEIGHT-4;
|
y = pos.top;
|
||||||
} else {
|
} else {
|
||||||
WindowRect pos(_hwnd);
|
WindowRect pos(_hwnd);
|
||||||
|
|
||||||
x = pos.right;
|
x = pos.right-8;
|
||||||
y = pos.top+STARTMENU_HEIGHT-4;
|
y = pos.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartMenu::Create(x, y, new_folders, _hwnd, creator);
|
StartMenu::Create(x, y, new_folders, _hwnd, creator);
|
||||||
|
@ -283,12 +292,10 @@ void StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, CREATORFUN
|
||||||
if (folder1)
|
if (folder1)
|
||||||
new_folders.push_back(folder1);
|
new_folders.push_back(folder1);
|
||||||
|
|
||||||
if (folder_id2 != -1) {
|
|
||||||
SpecialFolder folder2(folder_id2, _hwnd);
|
SpecialFolder folder2(folder_id2, _hwnd);
|
||||||
|
|
||||||
if (folder2)
|
if (folder2)
|
||||||
new_folders.push_back(folder2);
|
new_folders.push_back(folder2);
|
||||||
}
|
|
||||||
|
|
||||||
CreateSubmenu(id, new_folders, creator);
|
CreateSubmenu(id, new_folders, creator);
|
||||||
}
|
}
|
||||||
|
@ -335,21 +342,21 @@ LRESULT StartMenuRoot::Init(LPCREATESTRUCT pcs)
|
||||||
AddSeparator();
|
AddSeparator();
|
||||||
|
|
||||||
// insert hard coded start entries
|
// insert hard coded start entries
|
||||||
AddButton(ResString(IDS_PROGRAMS), 0, IDC_PROGRAMS);
|
AddButton(ResString(IDS_PROGRAMS), 0, true, IDC_PROGRAMS);
|
||||||
AddButton(ResString(IDS_EXPLORE), SmallIcon(IDI_EXPLORER), IDC_EXPLORE);
|
AddButton(ResString(IDS_EXPLORE), SmallIcon(IDI_EXPLORER), false, IDC_EXPLORE);
|
||||||
AddButton(ResString(IDS_FAVORITES), 0, IDC_FAVORITES);
|
AddButton(ResString(IDS_FAVORITES), 0, true, IDC_FAVORITES);
|
||||||
AddButton(ResString(IDS_DOCUMENTS), 0, IDC_DOCUMENTS);
|
AddButton(ResString(IDS_DOCUMENTS), 0, true, IDC_DOCUMENTS);
|
||||||
AddButton(ResString(IDS_RECENT), 0, IDC_RECENT);
|
AddButton(ResString(IDS_RECENT), 0, true, IDC_RECENT);
|
||||||
AddButton(ResString(IDS_SETTINGS), 0, IDC_SETTINGS);
|
AddButton(ResString(IDS_SETTINGS), 0, true, IDC_SETTINGS);
|
||||||
AddButton(ResString(IDS_ADMIN), 0, IDC_ADMIN);
|
AddButton(ResString(IDS_ADMIN), 0, true, IDC_ADMIN);
|
||||||
AddButton(ResString(IDS_SEARCH), 0, IDC_SEARCH);
|
AddButton(ResString(IDS_SEARCH), 0, false, IDC_SEARCH);
|
||||||
AddButton(ResString(IDS_START_HELP),0, IDC_START_HELP);
|
AddButton(ResString(IDS_START_HELP),0, false, IDC_START_HELP);
|
||||||
AddButton(ResString(IDS_LAUNCH), 0, IDC_LAUNCH);
|
AddButton(ResString(IDS_LAUNCH), 0, false, IDC_LAUNCH);
|
||||||
|
|
||||||
AddSeparator();
|
AddSeparator();
|
||||||
|
|
||||||
AddButton(ResString(IDS_SHUTDOWN), SmallIcon(IDI_LOGOFF), IDC_SHUTDOWN);
|
AddButton(ResString(IDS_SHUTDOWN), SmallIcon(IDI_LOGOFF), false, IDC_SHUTDOWN);
|
||||||
AddButton(ResString(IDS_LOGOFF), SmallIcon(IDI_LOGOFF), IDC_LOGOFF);
|
AddButton(ResString(IDS_LOGOFF), SmallIcon(IDI_LOGOFF), false, IDC_LOGOFF);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,14 +33,19 @@
|
||||||
#define TITLE_STARTMENU _T("Start Menu")
|
#define TITLE_STARTMENU _T("Start Menu")
|
||||||
|
|
||||||
|
|
||||||
|
#define STARTMENU_WIDTH 150
|
||||||
|
#define STARTMENU_LINE_HEIGHT 22
|
||||||
|
#define STARTMENU_SEP_HEIGHT (STARTMENU_LINE_HEIGHT/2)
|
||||||
|
|
||||||
|
|
||||||
// Startmenu button
|
// Startmenu button
|
||||||
struct StartMenuButton : public Button
|
struct StartMenuButton : public Button
|
||||||
{
|
{
|
||||||
StartMenuButton(HWND parent, int y, LPCTSTR title,
|
StartMenuButton(HWND parent, int y, LPCTSTR title,
|
||||||
UINT id, HICON hIcon=0, DWORD style=WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW, DWORD exStyle=0)
|
UINT id, HICON hIcon=0, bool showArrow=false, DWORD style=WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW, DWORD exStyle=0)
|
||||||
: Button(parent, title, 2, y, STARTMENU_WIDTH-4, STARTMENU_LINE_HEIGHT, id, style, exStyle)
|
: Button(parent, title, 0, y, ClientRect(parent).right, STARTMENU_LINE_HEIGHT, id, style, exStyle)
|
||||||
{
|
{
|
||||||
*new StartmenuEntry(_hwnd, hIcon);
|
*new StartmenuEntry(_hwnd, hIcon, showArrow);
|
||||||
|
|
||||||
SetWindowFont(_hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
|
SetWindowFont(_hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
|
||||||
}
|
}
|
||||||
|
@ -50,7 +55,7 @@ struct StartMenuButton : public Button
|
||||||
struct StartMenuSeparator : public Static
|
struct StartMenuSeparator : public Static
|
||||||
{
|
{
|
||||||
StartMenuSeparator(HWND parent, int y, DWORD style=WS_VISIBLE|WS_CHILD|SS_ETCHEDHORZ, DWORD exStyle=0)
|
StartMenuSeparator(HWND parent, int y, DWORD style=WS_VISIBLE|WS_CHILD|SS_ETCHEDHORZ, DWORD exStyle=0)
|
||||||
: Static(parent, NULL, 2, y+STARTMENU_SEP_HEIGHT/2-1, STARTMENU_WIDTH-4, 2, -1, style, exStyle)
|
: Static(parent, NULL, 0, y+STARTMENU_SEP_HEIGHT/2-1, ClientRect(parent).right, 2, -1, style, exStyle)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -114,7 +119,7 @@ protected:
|
||||||
|
|
||||||
void AddShellEntries(const ShellDirectory& dir, int max=-1, bool subfolders=true);
|
void AddShellEntries(const ShellDirectory& dir, int max=-1, bool subfolders=true);
|
||||||
|
|
||||||
void AddButton(LPCTSTR title, HICON hIcon=0, UINT id=(UINT)-1);
|
void AddButton(LPCTSTR title, HICON hIcon=0, bool showArrow=false, UINT id=(UINT)-1, DWORD style=WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_OWNERDRAW);
|
||||||
void AddSeparator();
|
void AddSeparator();
|
||||||
|
|
||||||
void CreateSubmenu(int id, const StartMenuFolders& new_folders, CREATORFUNC creator=s_def_creator);
|
void CreateSubmenu(int id, const StartMenuFolders& new_folders, CREATORFUNC creator=s_def_creator);
|
||||||
|
|
|
@ -164,32 +164,32 @@ int DesktopBar::Command(int id, int code)
|
||||||
|
|
||||||
static HICON get_window_icon(HWND hwnd)
|
static HICON get_window_icon(HWND hwnd)
|
||||||
{
|
{
|
||||||
HICON hicon = 0;
|
HICON hIcon = 0;
|
||||||
|
|
||||||
SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hicon);
|
SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hicon);
|
SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hicon);
|
SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
hicon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
|
hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
hicon = (HICON)GetClassLong(hwnd, GCL_HICON);
|
hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hicon);
|
SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon);
|
||||||
|
|
||||||
if (!hicon)
|
if (!hIcon)
|
||||||
hicon = LoadIcon(0, IDI_APPLICATION);
|
hIcon = LoadIcon(0, IDI_APPLICATION);
|
||||||
|
|
||||||
return hicon;
|
return hIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HBITMAP create_bitmap_from_icon(HICON hicon, HWND hwnd, HBRUSH hbrush_bkgnd)
|
static HBITMAP create_bitmap_from_icon(HICON hIcon, HWND hwnd, HBRUSH hbrush_bkgnd)
|
||||||
{
|
{
|
||||||
HDC hdc_wnd = GetDC(hwnd);
|
HDC hdc_wnd = GetDC(hwnd);
|
||||||
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, 16, 16);
|
HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, 16, 16);
|
||||||
|
@ -197,7 +197,7 @@ static HBITMAP create_bitmap_from_icon(HICON hicon, HWND hwnd, HBRUSH hbrush_bkg
|
||||||
|
|
||||||
HDC hdc = CreateCompatibleDC(0);
|
HDC hdc = CreateCompatibleDC(0);
|
||||||
HBITMAP hbmp_org = SelectBitmap(hdc, hbmp);
|
HBITMAP hbmp_org = SelectBitmap(hdc, hbmp);
|
||||||
DrawIconEx(hdc, 0, 0, hicon, 16, 16, 0, hbrush_bkgnd, DI_IMAGE);
|
DrawIconEx(hdc, 0, 0, hIcon, 16, 16, 0, hbrush_bkgnd, DI_IMAGE);
|
||||||
SelectBitmap(hdc, hbmp_org);
|
SelectBitmap(hdc, hbmp_org);
|
||||||
DeleteDC(hdc);
|
DeleteDC(hdc);
|
||||||
|
|
||||||
|
@ -352,8 +352,8 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
|
||||||
if (!last_id)
|
if (!last_id)
|
||||||
found->second._id = pThis->_next_id++;
|
found->second._id = pThis->_next_id++;
|
||||||
} else {
|
} else {
|
||||||
HICON hicon = get_window_icon(hwnd);
|
HICON hIcon = get_window_icon(hwnd);
|
||||||
HBITMAP hbmp = create_bitmap_from_icon(hicon, pThis->_htoolbar, GetSysColorBrush(COLOR_BTNFACE));
|
HBITMAP hbmp = create_bitmap_from_icon(hIcon, pThis->_htoolbar, GetSysColorBrush(COLOR_BTNFACE));
|
||||||
|
|
||||||
TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
|
TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
|
||||||
int bmp_idx = SendMessage(pThis->_htoolbar, TB_ADDBITMAP, 1, (LPARAM)&ab);
|
int bmp_idx = SendMessage(pThis->_htoolbar, TB_ADDBITMAP, 1, (LPARAM)&ab);
|
||||||
|
|
|
@ -34,11 +34,6 @@
|
||||||
#define TASKBAR_LEFT 70
|
#define TASKBAR_LEFT 70
|
||||||
//#define TASKBAR_AT_TOP
|
//#define TASKBAR_AT_TOP
|
||||||
|
|
||||||
#define STARTMENU_WIDTH 150
|
|
||||||
#define STARTMENU_HEIGHT 4
|
|
||||||
#define STARTMENU_LINE_HEIGHT 22
|
|
||||||
#define STARTMENU_SEP_HEIGHT (STARTMENU_LINE_HEIGHT/2)
|
|
||||||
|
|
||||||
#define WM_SHELLHOOK_NOTIFY (WM_APP+0x10)
|
#define WM_SHELLHOOK_NOTIFY (WM_APP+0x10)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
#include "../globals.h"
|
#include "../globals.h"
|
||||||
|
#include "../explorer_intres.h"
|
||||||
|
|
||||||
|
|
||||||
WindowClass::WindowClass(LPCTSTR classname, UINT style_, WNDPROC wndproc)
|
WindowClass::WindowClass(LPCTSTR classname, UINT style_, WNDPROC wndproc)
|
||||||
|
@ -593,7 +594,7 @@ void PictureButton::DrawItem(LPDRAWITEMSTRUCT dis)
|
||||||
} else
|
} else
|
||||||
DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, style);
|
DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, style);
|
||||||
|
|
||||||
DrawIconEx(dis->hDC, iconPos.x, iconPos.y, _hicon, 16, 16, 0, GetSysColorBrush(COLOR_BTNFACE), DI_NORMAL);
|
DrawIconEx(dis->hDC, iconPos.x, iconPos.y, _hIcon, 16, 16, 0, GetSysColorBrush(COLOR_BTNFACE), DI_NORMAL);
|
||||||
|
|
||||||
TCHAR text[BUFFER_LEN];
|
TCHAR text[BUFFER_LEN];
|
||||||
GetWindowText(_hwnd, text, BUFFER_LEN);
|
GetWindowText(_hwnd, text, BUFFER_LEN);
|
||||||
|
@ -648,13 +649,19 @@ void StartmenuEntry::DrawItem(LPDRAWITEMSTRUCT dis)
|
||||||
HBRUSH bk_brush = GetSysColorBrush(bk_color);
|
HBRUSH bk_brush = GetSysColorBrush(bk_color);
|
||||||
|
|
||||||
FillRect(dis->hDC, &dis->rcItem, bk_brush);
|
FillRect(dis->hDC, &dis->rcItem, bk_brush);
|
||||||
DrawIconEx(dis->hDC, iconPos.x, iconPos.y, _hicon, 16, 16, 0, bk_brush, DI_NORMAL);
|
DrawIconEx(dis->hDC, iconPos.x, iconPos.y, _hIcon, 16, 16, 0, bk_brush, DI_NORMAL);
|
||||||
|
|
||||||
|
// draw submenu arrow at the right
|
||||||
|
if (_showArrow) {
|
||||||
|
SmallIcon arrowIcon(IDI_FOLDERARROW);
|
||||||
|
DrawIconEx(dis->hDC, dis->rcItem.right-16, iconPos.y, arrowIcon, 16, 16, 0, bk_brush, DI_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
TCHAR text[BUFFER_LEN];
|
TCHAR text[BUFFER_LEN];
|
||||||
GetWindowText(_hwnd, text, BUFFER_LEN);
|
GetWindowText(_hwnd, text, BUFFER_LEN);
|
||||||
|
|
||||||
if (dis->itemState & (ODS_DISABLED|ODS_GRAYED))
|
if (dis->itemState & (ODS_DISABLED|ODS_GRAYED))
|
||||||
DrawGrayText(dis, &textRect, text, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
|
DrawGrayText(dis, &textRect, text, DT_SINGLELINE|DT_VCENTER);
|
||||||
else {
|
else {
|
||||||
BkMode mode(dis->hDC, TRANSPARENT);
|
BkMode mode(dis->hDC, TRANSPARENT);
|
||||||
TextColor lcColor(dis->hDC, GetSysColor(text_color));
|
TextColor lcColor(dis->hDC, GetSysColor(text_color));
|
||||||
|
|
|
@ -434,13 +434,13 @@ struct PictureButton : public OwnerdrawnButton
|
||||||
{
|
{
|
||||||
typedef OwnerdrawnButton super;
|
typedef OwnerdrawnButton super;
|
||||||
|
|
||||||
PictureButton(HWND hwnd, HICON hicon, bool flat=false)
|
PictureButton(HWND hwnd, HICON hIcon, bool flat=false)
|
||||||
: super(hwnd), _hicon(hicon), _flat(flat) {}
|
: super(hwnd), _hIcon(hIcon), _flat(flat) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DrawItem(LPDRAWITEMSTRUCT dis);
|
virtual void DrawItem(LPDRAWITEMSTRUCT dis);
|
||||||
|
|
||||||
HICON _hicon;
|
HICON _hIcon;
|
||||||
bool _flat;
|
bool _flat;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -452,11 +452,12 @@ struct StartmenuEntry : public OwnerdrawnButton
|
||||||
{
|
{
|
||||||
typedef OwnerdrawnButton super;
|
typedef OwnerdrawnButton super;
|
||||||
|
|
||||||
StartmenuEntry(HWND hwnd, HICON hicon)
|
StartmenuEntry(HWND hwnd, HICON hIcon, bool showArrow)
|
||||||
: super(hwnd), _hicon(hicon) {}
|
: super(hwnd), _hIcon(hIcon), _showArrow(showArrow) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DrawItem(LPDRAWITEMSTRUCT dis);
|
virtual void DrawItem(LPDRAWITEMSTRUCT dis);
|
||||||
|
|
||||||
HICON _hicon;
|
HICON _hIcon;
|
||||||
|
bool _showArrow;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue