1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
use crateco;
use crateffi;
use crate*;
use crate*;
use crate*;
/// [`InitCommonControls`](https://learn.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-initcommoncontrols)
/// function.
/// [`InitCommonControlsEx`](https://learn.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-initcommoncontrolsex)
/// function.
/// [`InitMUILanguage`](https://learn.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-initmuilanguage)
/// function.
/// [`PropertySheet`](https://learn.microsoft.com/en-us/windows/win32/api/prsht/nf-prsht-propertysheetw)
/// function.
///
/// # Safety
///
/// This function will use pointers declared in
/// [`PROPSHEETHEADER`](crate::PROPSHEETHEADER), make sure these pointers are
/// correct.
pub unsafe
/// [`TaskDialogIndirect`](https://learn.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-taskdialogindirect)
/// function.
///
/// Fill the [`TASKDIALOGCONFIG`](crate::TASKDIALOGCONFIG) fields you need, and
/// leave the others as default. The needed flags will be automatically set.
///
/// Returns:
/// 1. the ID of the button clicked by the user. If you passed custom
/// buttons in the `buttons` field, the corresponding ID will be wrapped in a
/// [`co::DLGID`](crate::co::DLGID) constant, whose `u16` can be retrieved by
/// calling [`co::DLGID::raw`](crate::co::DLGID::raw) method;
/// 2. the ID of the radio button selected by the user, if you used the
/// `radio_buttons` field;
/// 3. `true` if the custom check box is checked, if you used the
/// `verification_text` field.
///
/// [`HWND::TaskDialog`](crate::HWND::TaskDialog) is a simpler version of this
/// function.
///
/// # Examples
///
/// Simple information dialog:
///
/// ```no_run
/// use winsafe::{self as w, prelude::*, co};
///
/// w::TaskDialogIndirect(&w::TASKDIALOGCONFIG {
/// common_buttons: co::TDCBF::OK,
/// main_icon: w::IconIdTd::Td(co::TD_ICON::INFORMATION),
/// flags: co::TDF::ALLOW_DIALOG_CANCELLATION,
/// window_title: Some("Title"),
/// content: Some("Content"),
/// ..Default::default()
/// })?;
/// # w::HrResult::Ok(())
/// ```
///
/// OK/Cancel confirmation:
///
/// ```no_run
/// use winsafe::{self as w, prelude::*, co};
///
/// let (ret, _, _) = w::TaskDialogIndirect(&w::TASKDIALOGCONFIG {
/// common_buttons: co::TDCBF::OK | co::TDCBF::CANCEL,
/// main_icon: w::IconIdTd::Td(co::TD_ICON::WARNING),
/// flags: co::TDF::ALLOW_DIALOG_CANCELLATION,
/// window_title: Some("Title"),
/// content: Some("Do you want?"),
/// ..Default::default()
/// })?;
///
/// if ret == co::DLGID::OK {
/// println!("Yes.");
/// }
/// # w::HrResult::Ok(())
/// ```
///
/// Callback handling:
///
/// ```no_run
/// use winsafe::{self as w, prelude::*, co};
///
/// w::TaskDialogIndirect(&w::TASKDIALOGCONFIG {
/// common_buttons: co::TDCBF::OK,
/// window_title: Some("Title"),
/// content: Some("Content"),
/// callback: Some(Box::new(
/// |hwnd: &w::HWND, tdn: w::Tdn| -> co::HRESULT {
/// match tdn {
/// w::Tdn::Created => println!("created"),
/// _ => {},
/// }
/// co::HRESULT::S_OK
/// },
/// )),
/// ..Default::default()
/// })?;
/// # w::HrResult::Ok(())
///
/// ```