Quick addition: "Create shortcut" menu entry.
This commit is contained in:
parent
f978b6f7ea
commit
669f7e7f07
@ -90,7 +90,7 @@ STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
|
|||||||
WS_SYSMENU | WS_THICKFRAME
|
WS_SYSMENU | WS_THICKFRAME
|
||||||
EXSTYLE WS_EX_APPWINDOW
|
EXSTYLE WS_EX_APPWINDOW
|
||||||
CAPTION "CMakeSetupDialog"
|
CAPTION "CMakeSetupDialog"
|
||||||
FONT 8, "MS Sans Serif"
|
FONT 8, "MS Sans Serif", 0, 0, 0x1
|
||||||
BEGIN
|
BEGIN
|
||||||
COMBOBOX IDC_WhereSource,96,6,133,66,CBS_DROPDOWN |
|
COMBOBOX IDC_WhereSource,96,6,133,66,CBS_DROPDOWN |
|
||||||
CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
|
CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
|
||||||
@ -191,6 +191,7 @@ END
|
|||||||
STRINGTABLE DISCARDABLE
|
STRINGTABLE DISCARDABLE
|
||||||
BEGIN
|
BEGIN
|
||||||
IDS_ABOUTBOX "&About CMakeSetup..."
|
IDS_ABOUTBOX "&About CMakeSetup..."
|
||||||
|
IDS_CREATESHORTCUT "&Create shortcut"
|
||||||
END
|
END
|
||||||
|
|
||||||
#endif // English (U.S.) resources
|
#endif // English (U.S.) resources
|
||||||
|
@ -149,6 +149,12 @@ BOOL CMakeSetupDialog::OnInitDialog()
|
|||||||
{
|
{
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
|
|
||||||
|
// Add "Create shortcut" menu item to system menu.
|
||||||
|
|
||||||
|
// IDM_CREATESHORTCUT must be in the system command range.
|
||||||
|
ASSERT((IDM_CREATESHORTCUT & 0xFFF0) == IDM_CREATESHORTCUT);
|
||||||
|
ASSERT(IDM_CREATESHORTCUT < 0xF000);
|
||||||
|
|
||||||
// Add "About..." menu item to system menu.
|
// Add "About..." menu item to system menu.
|
||||||
|
|
||||||
// IDM_ABOUTBOX must be in the system command range.
|
// IDM_ABOUTBOX must be in the system command range.
|
||||||
@ -158,12 +164,24 @@ BOOL CMakeSetupDialog::OnInitDialog()
|
|||||||
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
||||||
if (pSysMenu != NULL)
|
if (pSysMenu != NULL)
|
||||||
{
|
{
|
||||||
|
CString strCreateShortcutMenu;
|
||||||
|
strCreateShortcutMenu.LoadString(IDS_CREATESHORTCUT);
|
||||||
|
if (!strCreateShortcutMenu.IsEmpty())
|
||||||
|
{
|
||||||
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
||||||
|
pSysMenu->AppendMenu(MF_STRING,
|
||||||
|
IDM_CREATESHORTCUT,
|
||||||
|
strCreateShortcutMenu);
|
||||||
|
}
|
||||||
|
|
||||||
CString strAboutMenu;
|
CString strAboutMenu;
|
||||||
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
||||||
if (!strAboutMenu.IsEmpty())
|
if (!strAboutMenu.IsEmpty())
|
||||||
{
|
{
|
||||||
pSysMenu->AppendMenu(MF_SEPARATOR);
|
pSysMenu->AppendMenu(MF_SEPARATOR);
|
||||||
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
pSysMenu->AppendMenu(MF_STRING,
|
||||||
|
IDM_ABOUTBOX,
|
||||||
|
strAboutMenu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,6 +225,10 @@ void CMakeSetupDialog::OnSysCommand(UINT nID, LPARAM lParam)
|
|||||||
CAboutDlg dlgAbout;
|
CAboutDlg dlgAbout;
|
||||||
dlgAbout.DoModal();
|
dlgAbout.DoModal();
|
||||||
}
|
}
|
||||||
|
else if ((nID & 0xFFF0) == IDM_CREATESHORTCUT)
|
||||||
|
{
|
||||||
|
CreateShortcut();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CDialog::OnSysCommand(nID, lParam);
|
CDialog::OnSysCommand(nID, lParam);
|
||||||
@ -816,3 +838,137 @@ void CMakeSetupDialog::OnEditchangeGenerator()
|
|||||||
// TODO: Add your control notification handler code here
|
// TODO: Add your control notification handler code here
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Create a shortcut on the desktop with the current Source/Build dir.
|
||||||
|
int CMakeSetupDialog::CreateShortcut()
|
||||||
|
{
|
||||||
|
// m_WhereSource = cmdInfo.m_WhereSource;
|
||||||
|
// m_WhereBuild = cmdInfo.m_WhereBuild;
|
||||||
|
|
||||||
|
// Find the desktop folder and create the link name
|
||||||
|
|
||||||
|
HKEY hKey;
|
||||||
|
if(RegOpenKeyEx(HKEY_CURRENT_USER,
|
||||||
|
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
|
||||||
|
0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: unable to find 'Shell Folders' key in registry!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD dwType, dwSize;
|
||||||
|
#define MAXPATH 1024
|
||||||
|
char link_name[MAXPATH];
|
||||||
|
dwSize = MAXPATH;
|
||||||
|
if(RegQueryValueEx(hKey,
|
||||||
|
(LPCTSTR)"Desktop",
|
||||||
|
NULL,
|
||||||
|
&dwType,
|
||||||
|
(BYTE *)link_name,
|
||||||
|
&dwSize) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: unable to find 'Desktop' registry value in 'Shell Folders' key!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dwType != REG_SZ)
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: 'Desktop' registry value in 'Shell Folders' key has wrong type!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(link_name, "\\CMake - ");
|
||||||
|
std::string current_dir = cmSystemTools::GetFilenameName((LPCTSTR)m_WhereSource);
|
||||||
|
strcat(link_name, current_dir.c_str());
|
||||||
|
strcat(link_name, ".lnk");
|
||||||
|
|
||||||
|
// Find the path to the current executable
|
||||||
|
|
||||||
|
char path_to_current_exe[MAXPATH];
|
||||||
|
::GetModuleFileName(NULL, path_to_current_exe, MAXPATH);
|
||||||
|
|
||||||
|
// Create the shortcut
|
||||||
|
|
||||||
|
HRESULT hres;
|
||||||
|
IShellLink *psl;
|
||||||
|
|
||||||
|
// Initialize the COM library
|
||||||
|
|
||||||
|
hres = CoInitialize(NULL);
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: unable to initialize the COM library!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an IShellLink object and get a pointer to the IShellLink
|
||||||
|
// interface (returned from CoCreateInstance).
|
||||||
|
|
||||||
|
hres = CoCreateInstance(CLSID_ShellLink,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_INPROC_SERVER,
|
||||||
|
IID_IShellLink,
|
||||||
|
(void **)&psl);
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: unable to create IShellLink instance!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPersistFile *ppf;
|
||||||
|
|
||||||
|
// Query IShellLink for the IPersistFile interface for
|
||||||
|
// saving the shortcut in persistent storage.
|
||||||
|
|
||||||
|
hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);
|
||||||
|
|
||||||
|
if (SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
// Set the path to the shortcut target.
|
||||||
|
hres = psl->SetPath(path_to_current_exe);
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: SetPath failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the arguments of the shortcut.
|
||||||
|
CString args = " /H=" + m_WhereSource + " /B=" + m_WhereBuild;
|
||||||
|
hres = psl->SetArguments(args);
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: SetArguments failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the description of the shortcut.
|
||||||
|
hres = psl->SetDescription("Shortcut to CMakeSetup");
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: SetDescription failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the string consists of ANSI characters.
|
||||||
|
WORD wsz[MAX_PATH];
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, link_name, -1, wsz, MAX_PATH);
|
||||||
|
|
||||||
|
// Save the shortcut via the IPersistFile::Save member function.
|
||||||
|
hres = ppf->Save(wsz, TRUE);
|
||||||
|
|
||||||
|
if (! SUCCEEDED (hres))
|
||||||
|
{
|
||||||
|
AfxMessageBox ("Create shortcut: Save failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Release the pointer to IPersistFile.
|
||||||
|
ppf->Release ();
|
||||||
|
}
|
||||||
|
// Release the pointer to IShellLink.
|
||||||
|
psl->Release ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -65,7 +65,8 @@ protected:
|
|||||||
void FillCacheGUIFromCacheManager();
|
void FillCacheGUIFromCacheManager();
|
||||||
// copy from the list box to the cache manager
|
// copy from the list box to the cache manager
|
||||||
void FillCacheManagerFromCacheGUI();
|
void FillCacheManagerFromCacheGUI();
|
||||||
|
// Create a shortcut on the desktop with the current Source/Build dir.
|
||||||
|
int CreateShortcut();
|
||||||
|
|
||||||
HICON m_hIcon;
|
HICON m_hIcon;
|
||||||
CString m_RegistryKey;
|
CString m_RegistryKey;
|
||||||
|
@ -3,9 +3,11 @@
|
|||||||
// Used by CMakeSetup.rc
|
// Used by CMakeSetup.rc
|
||||||
//
|
//
|
||||||
#define IDM_ABOUTBOX 0x0010
|
#define IDM_ABOUTBOX 0x0010
|
||||||
|
#define IDM_CREATESHORTCUT 0x0020
|
||||||
#define IDD_ABOUTBOX 100
|
#define IDD_ABOUTBOX 100
|
||||||
#define IDS_ABOUTBOX 101
|
#define IDS_ABOUTBOX 101
|
||||||
#define IDD_CMakeSetupDialog_DIALOG 102
|
#define IDD_CMakeSetupDialog_DIALOG 102
|
||||||
|
#define IDS_CREATESHORTCUT 102
|
||||||
#define IDR_MAINFRAME 128
|
#define IDR_MAINFRAME 128
|
||||||
#define IDC_WhereSource 1001
|
#define IDC_WhereSource 1001
|
||||||
#define IDC_BUTTON2 1002
|
#define IDC_BUTTON2 1002
|
||||||
@ -28,6 +30,6 @@
|
|||||||
#define _APS_NEXT_RESOURCE_VALUE 133
|
#define _APS_NEXT_RESOURCE_VALUE 133
|
||||||
#define _APS_NEXT_COMMAND_VALUE 32771
|
#define _APS_NEXT_COMMAND_VALUE 32771
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1021
|
#define _APS_NEXT_CONTROL_VALUE 1021
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 102
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user