Win32 GUI Generics Library : Save_dlg
save_dlg
True binding of your data to UI controls on your dialog.
I know a lot of you won't believe this, since it's quite close to impossible. So, just to give you a taste, I'll show you a few examples:
Here's how you create a simple dialog to allow editing of user-name and passw.
std::string user_name = "john", passw = "secret"; create_modal_save_dlg( IDD_login, // in-line correspondence. No validation save_dlg::corresp() .add_corresp(&user_name, ID_user_name) .add_corresp(&passw, ID_passw), null_wnd); msg_box(null_wnd, "You selected '" + user_name + "' and '" + passw + "'");
This will result in the following:
and
Synchronizing width/height according to a certain ratio:
struct picture_size { int width; int height; bool preserve_ratio; }; void on_change_width(const int & old_val, int & new_val, save_dlg::info<picture_size> & info) { if ( !info.new_val.preserve_ratio) return; if (info.new_val.height == 0) return; // avoid divide by zero static double ratio = (double)old_val / info.new_val.height; if (ratio > .05) info.new_val.height = (int)((double)new_val / ratio); } void on_change_height(const int & old_val, int & new_val, save_dlg::info<picture_size> & info) { // ... similar } int APIENTRY WinMain(...) { picture_size pict; pict.width = 800; pict.height = 600; pict.preserve_ratio = true; create_modal_save_dlg( IDD_SAMPLE, save_dlg::corresp() .add_var(pict) .add_corresp(&picture_size::width, ID_width) .add_corresp(&picture_size::height, ID_height) .add_corresp(&picture_size::preserve_ratio, ID_ratio) .add_validator(ID_width, on_change_width, validate::on_change) .add_validator(ID_height, on_change_height, validate::on_change) , null_wnd); }
This will result in the following:
And finally, a slightly more complex one:
// Full example: win32gui/samples/simple_empl_edit // employee.h struct employee { std::string first_name; std::string last_name; // ... }; // ui_empl.h #include#include "employee.h" struct ui_empl : win32::gui::save_dlg::corresp { ui_empl(employee & empl); // ... }; // ui_empl.cpp ui_empl::ui_empl(employee & empl) { add_var(empl); add_corresp( &employee::first_name, ID_first_name); add_corresp( &employee::last_name, ID_last_name); add_corresp( &employee::birth_date, IDC_birth); add_corresp( &employee::id, ID_id); add_corresp( &employee::salary, ID_salary); add_corresp( &employee::country, ID_country); add_corresp( &employee::address, ID_address); add_corresp( &employee::email, ID_email); add_corresp( &employee::has_homepage, IDC_has_hp); add_corresp( &employee::homepage, IDC_hp); add_validator(ID_first_name, at_least_6_chars); add_validator(ID_last_name, at_least_6_chars); add_validator(ID_salary, salary_too_big); add_validator(ID_salary, salary_too_small); add_validator(ID_id, in_range("Employee ID", 10000, 11000) ); // on cancel, ask the user if he wants to save... add_validator(ID_first_name, what, validate::on_cancel); } // main.cpp int APIENTRY WinMain(...) { using namespace win32::gui; employee john; john.first_name = "John"; john.last_name = "Doe"; john.birth_date = mktime_t(1978, one_month(2), 15); // 15th of Feb, 1978 // ... ui_empl ui(john); create_modal_save_dlg(IDD_empl, ui, null_wnd); std::ostringstream out; out << "You have chosen: \n" << "\nName: " << john.first_name << ' ' << john.last_name << "\nID: " << john.id ... msg_box(null_wnd, out.str() ); }
This will result in:
and