📄 startmenu.cpp
字号:
{
switch(vk) {
case VK_LEFT:
if (_submenu)
CloseOtherSubmenus();
// don't close start menu root
break;
default:
super::ProcessKey(vk);
}
}
int StartMenuHandler::Command(int id, int code)
{
switch(id) {
// start menu root
case IDC_PROGRAMS:
CreateSubmenu(id, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAMS, ResString(IDS_PROGRAMS));
break;
case IDC_EXPLORE:
CloseStartMenu(id);
explorer_show_frame(SW_SHOWNORMAL);
break;
case IDC_LAUNCH:
CloseStartMenu(id);
ShowLaunchDialog(g_Globals._hwndDesktopBar);
break;
case IDC_DOCUMENTS:
CreateSubmenu(id, CSIDL_PERSONAL, ResString(IDS_DOCUMENTS));
break;
case IDC_RECENT:
CreateSubmenu(id, CSIDL_RECENT, ResString(IDS_RECENT), STARTMENU_CREATOR(RecentStartMenu));
break;
case IDC_FAVORITES:
#ifndef _SHELL32_FAVORITES
CreateSubmenu(id, ResString(IDS_FAVORITES), STARTMENU_CREATOR(FavoritesMenu), &static_cast<BookmarkList&>(g_Globals._favorites));
#else
CreateSubmenu(id, CSIDL_COMMON_FAVORITES, CSIDL_FAVORITES, ResString(IDS_FAVORITES));
#endif
break;
case IDC_BROWSE:
CreateSubmenu(id, ResString(IDS_BROWSE), STARTMENU_CREATOR(BrowseMenu));
break;
case IDC_SETTINGS:
CreateSubmenu(id, ResString(IDS_SETTINGS), STARTMENU_CREATOR(SettingsMenu));
break;
case IDC_SEARCH:
CreateSubmenu(id, ResString(IDS_SEARCH), STARTMENU_CREATOR(SearchMenu));
break;
case IDC_START_HELP:
CloseStartMenu(id);
MessageBox(g_Globals._hwndDesktopBar, TEXT("Help not yet implemented"), ResString(IDS_TITLE), MB_OK);
break;
case IDC_LOGOFF:
CloseStartMenu(id);
ShowLogoffDialog(g_Globals._hwndDesktopBar);
break;
#ifndef _ROS_
case IDC_TERMINATE:
DestroyWindow(GetParent(_hwnd));
break;
#endif
case IDC_SHUTDOWN:
CloseStartMenu(id);
ShowExitWindowsDialog(g_Globals._hwndDesktop);
break;
case IDC_RESTART:
CloseStartMenu(id);
ShowRestartDialog(g_Globals._hwndDesktop, EWX_REBOOT);
/* An alternative way to do restart without shell32 help */
//launch_file(_hwnd, TEXT("shutdown.exe"), SW_HIDE, TEXT("-r"));
break;
// settings menu
case ID_DESKTOPBAR_SETTINGS:
CloseStartMenu(id);
ExplorerPropertySheet(g_Globals._hwndDesktopBar);
break;
case IDC_CONTROL_PANEL: {
CloseStartMenu(id);
#ifndef ROSSHELL
#ifndef _NO_MDI
XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
bool mdi = XMLBool(explorer_options, "mdi", true);
if (mdi)
MDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0);
else
#endif
SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0);
#else
launch_file(_hwnd, SHELLPATH_CONTROL_PANEL);
#endif
break;}
case IDC_SETTINGS_MENU:
CreateSubmenu(id, CSIDL_CONTROLS, ResString(IDS_SETTINGS_MENU));
break;
case IDC_PRINTERS: {
CloseStartMenu(id);
#ifndef ROSSHELL
#ifdef _ROS_ // to be removed when printer folder will be implemented
MessageBox(0, TEXT("printer folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
#else
#ifndef _NO_MDI
XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
bool mdi = XMLBool(explorer_options, "mdi", true);
if (mdi)
MDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}"), 0);
else
#endif
SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}"), 0);
#endif
#else
launch_file(_hwnd, SHELLPATH_PRINTERS);
#endif
break;}
#if 0 ///@todo use printer start menu folder per default and allow opening "printers" cabinet window using the context menu
case IDC_PRINTERS_MENU:
CreateSubmenu(id, CSIDL_PRINTERS, CSIDL_PRINTHOOD, ResString(IDS_PRINTERS));
/* StartMenuFolders new_folders;
try {
new_folders.push_back(ShellPath(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}")));
} catch(COMException&) {
}
CreateSubmenu(id, new_folders, ResString(IDS_PRINTERS));*/
break;
#endif
case IDC_ADMIN:
#ifndef ROSSHELL
CreateSubmenu(id, CSIDL_COMMON_ADMINTOOLS, CSIDL_ADMINTOOLS, ResString(IDS_ADMIN));
//CloseStartMenu(id);
//MainFrame::Create(SpecialFolderPath(CSIDL_COMMON_ADMINTOOLS, _hwnd), OWM_PIDL);
#else
launch_file(_hwnd, SpecialFolderFSPath(CSIDL_COMMON_ADMINTOOLS, _hwnd));
#endif
break;
case IDC_CONNECTIONS:
#ifndef ROSSHELL
#ifdef _ROS_ // to be removed when RAS will be implemented
MessageBox(0, TEXT("RAS folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
#else
CreateSubmenu(id, CSIDL_CONNECTIONS, ResString(IDS_CONNECTIONS));
//CloseStartMenu(id);
//MainFrame::Create(SpecialFolderPath(CSIDL_CONNECTIONS, _hwnd), OWM_PIDL);
#endif
#else
launch_file(_hwnd, SHELLPATH_NET_CONNECTIONS);
#endif
break;
// browse menu
case IDC_NETWORK:
#ifdef _ROS_ ///@todo to be removed when network browsing will be implemented in shell namespace
MessageBox(0, TEXT("network not yet implemented"), ResString(IDS_TITLE), MB_OK);
#else
CreateSubmenu(id, CSIDL_NETWORK, ResString(IDS_NETWORK));
#endif
break;
case IDC_DRIVES:
///@todo exclude removable drives
CreateSubmenu(id, CSIDL_DRIVES, ResString(IDS_DRIVES));
break;
// search menu
case IDC_SEARCH_PROGRAM:
CloseStartMenu(id);
Dialog::DoModal(IDD_SEARCH_PROGRAM, WINDOW_CREATOR(FindProgramDlg));
break;
case IDC_SEARCH_FILES:
CloseStartMenu(id);
ShowSearchDialog();
break;
case IDC_SEARCH_COMPUTER:
CloseStartMenu(id);
ShowSearchComputer();
break;
default:
return super::Command(id, code);
}
return 0;
}
void StartMenuHandler::ShowSearchDialog()
{
#ifndef _ROS_ ///@todo to be removed when SHFindFiles() will be implemented in shell32.dll
static DynamicFct<SHFINDFILES> SHFindFiles(TEXT("SHELL32"), 90);
if (SHFindFiles)
(*SHFindFiles)(NULL, NULL);
else
#endif
MessageBox(0, TEXT("SHFindFiles() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
}
void StartMenuHandler::ShowSearchComputer()
{
#ifndef _ROS_ ///@todo to be removed when SHFindComputer() will be implemented in shell32.dll
static DynamicFct<SHFINDCOMPUTER> SHFindComputer(TEXT("SHELL32"), 91);
if (SHFindComputer)
(*SHFindComputer)(NULL, NULL);
else
#endif
MessageBox(0, TEXT("SHFindComputer() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
}
void StartMenuHandler::ShowLaunchDialog(HWND hwndOwner)
{
///@todo All text phrases should be put into the resources.
static LPCSTR szTitle = "Run";
static LPCSTR szText = "Type the name of a program, folder, document, or Internet resource, and Explorer will open it for you.";
static DynamicFct<RUNFILEDLG> RunFileDlg(TEXT("SHELL32"), 61);
// Show "Run..." dialog
if (RunFileDlg) {
#ifndef _ROS_ /* FIXME: our shell32 always expects Ansi strings */
if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
WCHAR wTitle[40], wText[256];
MultiByteToWideChar(CP_ACP, 0, szTitle, -1, wTitle, 40);
MultiByteToWideChar(CP_ACP, 0, szText, -1, wText, 256);
(*RunFileDlg)(hwndOwner, 0, NULL, (LPCSTR)wTitle, (LPCSTR)wText, RFF_CALCDIRECTORY);
}
else
#endif
(*RunFileDlg)(hwndOwner, 0, NULL, szTitle, szText, RFF_CALCDIRECTORY);
}
}
void StartMenuHandler::ShowLogoffDialog(HWND hwndOwner)
{
static DynamicFct<LOGOFFWINDOWSDIALOG> LogoffWindowsDialog(TEXT("SHELL32"), 54);
// static DynamicFct<RESTARTWINDOWSDLG> RestartDialog(TEXT("SHELL32"), 59);
if (LogoffWindowsDialog)
(*LogoffWindowsDialog)(0);
/* The RestartDialog function prompts about some system setting change. This is not what we want to display here.
else if (RestartDialog)
return (*RestartDialog)(hwndOwner, (LPWSTR)L"You selected <Log Off>.\n\n", EWX_LOGOFF) == 1; ///@todo ANSI string conversion if needed
*/
else
MessageBox(hwndOwner, TEXT("LogoffWindowsDialog() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
}
void ShowExitWindowsDialog(HWND hwndOwner)
{
static DynamicFct<EXITWINDOWSDLG> ExitWindowsDialog(TEXT("SHELL32"), 60);
if (ExitWindowsDialog)
(*ExitWindowsDialog)(hwndOwner);
else
MessageBox(hwndOwner, TEXT("ExitWindowsDialog() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
}
void StartMenuHandler::ShowRestartDialog(HWND hwndOwner, UINT flags)
{
static DynamicFct<RESTARTWINDOWSDLG> RestartDlg(TEXT("SHELL32"), 59);
if (RestartDlg)
(*RestartDlg)(hwndOwner, (LPWSTR)L"You selected restart.\n\n", flags);
else
MessageBox(hwndOwner, TEXT("RestartDlg() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
}
void SettingsMenu::AddEntries()
{
super::AddEntries();
#if defined(ROSSHELL) || defined(_ROS_) // _ROS_ to be removed when printer/network will be implemented
//TODO AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS_MENU);
AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, false, IDC_CONNECTIONS);
#else
//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_ADMIN, true, IDC_ADMIN);
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL))
#endif
AddButton(ResString(IDS_SETTINGS_MENU), ICID_CONFIG, true, IDC_SETTINGS_MENU);
AddButton(ResString(IDS_DESKTOPBAR_SETTINGS), ICID_DESKSETTING, false, ID_DESKTOPBAR_SETTINGS);
AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS);
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL))
#endif
AddButton(ResString(IDS_CONTROL_PANEL), ICID_CONTROLPAN, false, IDC_CONTROL_PANEL);
}
void BrowseMenu::AddEntries()
{
super::AddEntries();
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
if (!g_Globals._SHRestricted || !SHRestricted(REST_NONETHOOD)) // or REST_NOENTIRENETWORK ?
#endif
#if defined(ROSSHELL) || defined(_ROS_) // _ROS_ to be removed when printer/network will be implemented
AddButton(ResString(IDS_NETWORK), ICID_NETWORK, false, IDC_NETWORK);
#else
AddButton(ResString(IDS_NETWORK), ICID_NETWORK, true, IDC_NETWORK);
#endif
AddButton(ResString(IDS_DRIVES), ICID_FOLDER, true, IDC_DRIVES);
}
void SearchMenu::AddEntries()
{
super::AddEntries();
AddButton(ResString(IDS_SEARCH_FILES), ICID_SEARCH_DOC, false, IDC_SEARCH_FILES);
#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
if (!g_Globals._SHRestricted || !SHRestricted(REST_HASFINDCOMPUTERS))
#endif
AddButton(ResString(IDS_SEARCH_COMPUTER),ICID_COMPUTER, false, IDC_SEARCH_COMPUTER);
AddButton(ResString(IDS_SEARCH_PRG), ICID_APPS, false, IDC_SEARCH_PROGRAM);
}
void RecentStartMenu::AddEntries()
{
for(StartMenuShellDirs::iterator it=_dirs.begin(); it!=_dirs.end(); ++it) {
StartMenuDirectory& smd = *it;
ShellDirectory& dir = smd._dir;
if (!dir._scanned) {
WaitCursor wait;
#ifdef _LAZY_ICONEXTRACT
dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS);
#else
dir.smart_scan(SORT_NAME);
#endif
}
dir.sort_directory(SORT_DATE);
AddShellEntries(dir, RECENT_DOCS_COUNT, smd._ignore); ///@todo read max. count of entries from registry
}
}
#ifndef _SHELL32_FAVORITES
void FavoritesMenu::AddEntries()
{
super::AddEntries();
String lwr_filter = _create_info._filter;
lwr_filter.toLower();
for(BookmarkList::iterator it=_bookmarks.begin(); it!=_bookmarks.end(); ++it) {
BookmarkNode& node = *it;
int id = ++_next_id;
_entries[id] = node;
if (node._type == BookmarkNode::BMNT_FOLDER) {
BookmarkFolder& folder = *node._pfolder;
AddButton(folder._name, ICID_FOLDER, true, id);
} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
Bookmark& bookmark = *node._pbookmark;
ICON_ID icon = ICID_NONE;
if (!bookmark._icon_path.empty())
icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx);
// filter non-directory entries
if (!lwr_filter.empty()) {
String lwr_name = bookmark._name;
String lwr_desc = bookmark._description;
String lwr_url = bookmark._url;
lwr_name.toLower();
lwr_desc.toLower();
lwr_url.toLower();
if (!_tcsstr(lwr_name,lwr_filter) && !_tcsstr(lwr_desc,lwr_filter) && !_tcsstr(lwr_url,lwr_filter))
continue;
}
AddButton(bookmark._name, icon!=ICID_NONE?icon:ICID_BOOKMARK, false, id);
}
}
}
int FavoritesMenu::Command(int id, int code)
{
BookmarkMap::iterator found = _entries.find(id);
if (found != _entries.end()) {
BookmarkNode& node = found->second;
if (node._type == BookmarkNode::BMNT_FOLDER) {
BookmarkFolder& folder = *node._pfolder;
if (CloseOtherSubmenus(id))
CreateSubmenu(id, folder._name, STARTMENU_CREATOR(FavoritesMenu), &static_cast<BookmarkList&>(folder._bookmarks));
} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
Bookmark& bookmark = *node._pbookmark;
String url = bookmark._url;
HWND hparent = GetParent(_hwnd);
CloseStartMenu(id);
launch_file(hparent, url, SW_SHOWNORMAL);
}
return 0;
}
return super::Command(id, code);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -