You sure remember a lot

Yes, I found it.
WTLized dialog class:
CODE
// Our configuration dialog is implemented as a WTL modal dialog.
class dialog_dsp_tutorial : public CDialogImpl<dialog_dsp_tutorial>
{
public:
enum {
IDD = IDD_CONFIG
};
BEGIN_MSG_MAP_EX(dialog_dsp_tutorial)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_HSCROLL(OnHScroll)
MSG_WM_COMMAND(OnCommand)
END_MSG_MAP()
public:
dialog_dsp_tutorial(const dsp_preset & p_data, dsp_preset_edit_callback & p_callback)
: m_old_data(p_data), m_callback(p_callback), m_dirty(false)
{
m_params.set_data(m_old_data);
}
protected:
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
{
CTrackBarCtrl slider(GetDlgItem(IDC_SLIDER));
slider.SetRange(-50, 200);
slider.SetPos(m_params.m_percent);
slider.SetTicFreq(25);
update_display();
return FALSE;
}
void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar)
{
m_dirty = true;
update_display();
}
void OnCommand(UINT uNotifyCode, int nID, CWindow wndCtl)
{
switch(nID) {
case IDOK:
EndDialog(1);
break;
case IDCANCEL:
m_callback.on_preset_changed(m_old_data);
EndDialog(0);
break;
}
}
//---
void update_display()
{
CTrackBarCtrl slider(GetDlgItem(IDC_SLIDER));
m_params.m_percent = slider.GetPos();
if (m_dirty) {
dsp_preset_impl data;
m_params.get_data(data);
m_callback.on_preset_changed(data);
m_dirty = false;
}
uSetDlgItemText(m_hWnd, IDC_STATIC_DISPLAY, pfc::string_formatter() << pfc::format_int(m_params.m_percent) << "%");
}
protected:
bool m_dirty;
const dsp_preset & m_old_data;
t_dsp_tutorial_params m_params;
dsp_preset_edit_callback & m_callback;
};
Then in the main class below:
CODE
static void g_show_config_popup(const dsp_preset & p_data, HWND p_parent, dsp_preset_edit_callback & p_callback) {
t_dsp_tutorial_params params;
if (params.set_data(p_data)) {
dialog_dsp_tutorial dlg(p_data, p_callback);
dlg.DoModal(p_parent); // <== CHANGED
}
}