// The new task dialog does not support the existing // Win32 functions for closing (e.g. EndDialog()); instead, // a "click button" message is sent. In this case, we're // abstracting out to say that the TaskDialog consumer can // simply call "Close" and we'll "click" the cancel button. // Note that the cancel button doesn't actually // have to exist for this to work. internal void NativeClose(TaskDialogResult result) { showState = DialogShowState.Closing; int id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDCANCEL; if (result == TaskDialogResult.Close) { id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDCLOSE; } else if (result == TaskDialogResult.CustomButtonClicked) { id = DialogsDefaults.MinimumDialogControlId; // custom buttons } else if (result == TaskDialogResult.No) { id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDNO; } else if (result == TaskDialogResult.Ok) { id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDOK; } else if (result == TaskDialogResult.Retry) { id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDRETRY; } else if (result == TaskDialogResult.Yes) { id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDYES; } SendMessageHelper(TaskDialogNativeMethods.TASKDIALOG_MESSAGES.TDM_CLICK_BUTTON, id, 0); }
/// <summary> /// Displays the dialog. /// </summary> /// <returns>A <see cref="CommonFileDialogResult"/> object.</returns> public CommonFileDialogResult ShowDialog() { CommonFileDialogResult result; // Fetch derived native dialog (i.e. Save or Open). InitializeNativeFileDialog(); nativeDialog = GetNativeFileDialog(); // Apply outer properties to native dialog instance. ApplyNativeSettings(nativeDialog); InitializeEventSink(nativeDialog); // Clear user data if Reset has been called // since the last show. if (resetSelections) { resetSelections = false; } // Show dialog. showState = DialogShowState.Showing; int hresult = nativeDialog.Show(parentWindow); showState = DialogShowState.Closed; // Create return information. if (CoreErrorHelper.Matches(hresult, (int)HResult.Win32ErrorCanceled)) { canceled = true; result = CommonFileDialogResult.Cancel; filenames.Clear(); } else { canceled = false; result = CommonFileDialogResult.Ok; // Populate filenames if user didn't cancel. PopulateWithFileNames(filenames); // Populate the actual IShellItems PopulateWithIShellItems(items); } return(result); }
// The new task dialog does not support the existing Win32 functions for closing (e.g. EndDialog()); instead, a "click button" // message is sent. In this case, we're abstracting out to say that the TaskDialog consumer can simply call "Close" and we'll "click" // the cancel button. Note that the cancel button doesn't actually have to exist for this to work. internal void NativeClose(TaskDialogResult result) { ShowState = DialogShowState.Closing; int id; switch (result) { case TaskDialogResult.Close: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Close; break; case TaskDialogResult.CustomButtonClicked: id = DialogsDefaults.MinimumDialogControlId; // custom buttons break; case TaskDialogResult.No: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.No; break; case TaskDialogResult.Ok: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Ok; break; case TaskDialogResult.Retry: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Retry; break; case TaskDialogResult.Yes: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Yes; break; default: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Cancel; break; } SendMessageHelper(TaskDialogNativeMethods.TaskDialogMessages.ClickButton, id, 0); }
internal void NativeShow() { // Applies config struct and other settings, then calls main Win32 function. if (settings == null) { throw new InvalidOperationException(LocalizedMessages.NativeTaskDialogConfigurationError); } // Do a last-minute parse of the various dialog control lists, and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread WILL re-enter via the DialogProc. try { ShowState = DialogShowState.Showing; int selectedButtonId; int selectedRadioButtonId; bool checkBoxChecked; // Here is the way we use "vanilla" P/Invoke to call TaskDialogIndirect(). HResult hresult; using (new EnableThemingInScope(true)) { hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonId, out selectedRadioButtonId, out checkBoxChecked); } if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HResult.InvalidArguments: msg = LocalizedMessages.NativeTaskDialogInternalErrorArgs; break; case HResult.OutOfMemory: msg = LocalizedMessages.NativeTaskDialogInternalErrorComplex; break; default: msg = string.Format(System.Globalization.CultureInfo.InvariantCulture, LocalizedMessages.NativeTaskDialogInternalErrorUnexpected, hresult); break; } var e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } SelectedButtonId = selectedButtonId; SelectedRadioButtonId = selectedRadioButtonId; CheckBoxChecked = checkBoxChecked; } catch (EntryPointNotFoundException exc) { throw new NotSupportedException(LocalizedMessages.NativeTaskDialogVersionError, exc); } finally { ShowState = DialogShowState.Closed; } }
/// <summary> /// Displays the dialog. /// </summary> /// <returns>A <see cref="CommonFileDialogResult"/> object.</returns> public CommonFileDialogResult ShowDialog() { CommonFileDialogResult result; // Fetch derived native dialog (i.e. Save or Open). InitializeNativeFileDialog(); nativeDialog = GetNativeFileDialog(); // Apply outer properties to native dialog instance. ApplyNativeSettings(nativeDialog); InitializeEventSink(nativeDialog); // Clear user data if Reset has been called // since the last show. if (resetSelections) { resetSelections = false; } // Show dialog. showState = DialogShowState.Showing; int hresult = nativeDialog.Show(parentWindow); showState = DialogShowState.Closed; // Create return information. if (CoreErrorHelper.Matches(hresult, (int)HResult.Win32ErrorCanceled)) { canceled = true; result = CommonFileDialogResult.Cancel; filenames.Clear(); } else { canceled = false; result = CommonFileDialogResult.Ok; // Populate filenames if user didn't cancel. PopulateWithFileNames(filenames); // Populate the actual IShellItems PopulateWithIShellItems(items); } return result; }
internal void NativeShow() { // Applies config struct and other settings, then // calls main Win32 function. if (settings == null) throw new InvalidOperationException( "An error has occurred in dialog configuration."); // Do a last-minute parse of the various dialog control lists, // and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread // WILL re-enter via the DialogProc. try { showState = DialogShowState.Showing; // Here is the way we use "vanilla" P/Invoke to call // TaskDialogIndirect(). HRESULT hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonID, out selectedRadioButtonID, out checkBoxChecked); if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HRESULT.E_INVALIDARG: msg = "Invalid arguments to Win32 call."; break; case HRESULT.E_OUTOFMEMORY: msg = "Dialog contents too complex."; break; default: msg = String.Format( "An unexpected internal error occurred in the Win32 call:{0:x}", hresult); break; } Exception e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } } catch (EntryPointNotFoundException) { throw new NotSupportedException("TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory."); } finally { showState = DialogShowState.Closed; } }
// The new task dialog does not support the existing // Win32 functions for closing (e.g. EndDialog()); instead, // a "click button" message is sent. In this case, we're // abstracting out to say that the TaskDialog consumer can // simply call "Close" and we'll "click" the cancel button. // Note that the cancel button doesn't actually // have to exist for this to work. internal void NativeClose(TaskDialogResult result) { showState = DialogShowState.Closing; int id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDCANCEL; if(result == TaskDialogResult.Close) id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDCLOSE; else if(result == TaskDialogResult.CustomButtonClicked) id = DialogsDefaults.MinimumDialogControlId; // custom buttons else if(result == TaskDialogResult.No) id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDNO; else if(result == TaskDialogResult.Ok) id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDOK; else if(result == TaskDialogResult.Retry) id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDRETRY; else if(result == TaskDialogResult.Yes) id = (int)TaskDialogNativeMethods.TASKDIALOG_COMMON_BUTTON_RETURN_ID.IDYES; SendMessageHelper(TaskDialogNativeMethods.TASKDIALOG_MESSAGES.TDM_CLICK_BUTTON, id, 0); }
public void NativeShow() { // Applies config struct and other settings, then // calls main Win32 function. if (settings == null) { throw new InvalidOperationException(LocalizedMessages.NativeTaskDialogConfigurationError); } // Do a last-minute parse of the various dialog control lists, // and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread // WILL re-enter via the DialogProc. try { ShowState = DialogShowState.Showing; int selectedButtonId; int selectedRadioButtonId; bool checkBoxChecked; // Here is the way we use "vanilla" P/Invoke to call TaskDialogIndirect(). HResult hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonId, out selectedRadioButtonId, out checkBoxChecked); if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HResult.InvalidArguments: msg = LocalizedMessages.NativeTaskDialogInternalErrorArgs; break; case HResult.OutOfMemory: msg = LocalizedMessages.NativeTaskDialogInternalErrorComplex; break; default: msg = string.Format(System.Globalization.CultureInfo.InvariantCulture, LocalizedMessages.NativeTaskDialogInternalErrorUnexpected, hresult); break; } Exception e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } SelectedButtonId = selectedButtonId; SelectedRadioButtonId = selectedRadioButtonId; CheckBoxChecked = checkBoxChecked; } catch (EntryPointNotFoundException exc) { throw new NotSupportedException(LocalizedMessages.NativeTaskDialogVersionError, exc); } finally { ShowState = DialogShowState.Closed; } }
// The new task dialog does not support the existing // Win32 functions for closing (e.g. EndDialog()); instead, // a "click button" message is sent. In this case, we're // abstracting out to say that the TaskDialog consumer can // simply call "Close" and we'll "click" the cancel button. // Note that the cancel button doesn't actually // have to exist for this to work. public void NativeClose(TaskDialogResult result) { ShowState = DialogShowState.Closing; int id; switch (result) { case TaskDialogResult.Close: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Close; break; case TaskDialogResult.CustomButtonClicked: id = DialogsDefaults.MinimumDialogControlId; // custom buttons break; case TaskDialogResult.No: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.No; break; case TaskDialogResult.Ok: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Ok; break; case TaskDialogResult.Retry: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Retry; break; case TaskDialogResult.Yes: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Yes; break; default: id = (int)TaskDialogNativeMethods.TaskDialogCommonButtonReturnIds.Cancel; break; } SendMessageHelper(TaskDialogNativeMethods.TaskDialogMessages.ClickButton, id, 0); }
internal void NativeShow() { // Applies config struct and other settings, then // calls main Win32 function. if (settings == null) { throw new InvalidOperationException( "An error has occurred in dialog configuration."); } // Do a last-minute parse of the various dialog control lists, // and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread // WILL re-enter via the DialogProc. try { showState = DialogShowState.Showing; // Here is the way we use "vanilla" P/Invoke to call // TaskDialogIndirect(). HRESULT hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonID, out selectedRadioButtonID, out checkBoxChecked); if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HRESULT.E_INVALIDARG: msg = "Invalid arguments to Win32 call."; break; case HRESULT.E_OUTOFMEMORY: msg = "Dialog contents too complex."; break; default: msg = String.Format( "An unexpected internal error occurred in the Win32 call:{0:x}", hresult); break; } Exception e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } } catch (EntryPointNotFoundException) { throw new NotSupportedException("TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory."); } finally { showState = DialogShowState.Closed; } }
/// <summary> /// Raises the <see cref="CommonFileDialog.FileOk"/> event just before the dialog is about to return with a result. /// </summary> /// <param name="e">The event data.</param> protected virtual void OnFileOk(CancelEventArgs e) { showState = DialogShowState.Closing; CancelEventHandler handler = FileOk; // Populate filenames if user didn't cancel. PopulateWithFileNames(filenames); // Populate the actual IShellItems PopulateWithIShellItems(items); if (handler != null) { handler(this, e); } }