1 #pragma warning(disable: 4786)
2 #include "FilenamesDialog.h"
4 static void AddStr(char *&p, const wchar_t *item)
6 size_t sz = (wcslen(item) + 1) * 2;
11 void AddItem(char *&p, const DLGITEMTEMPLATE &item_tmpl, WORD item_class, const wchar_t *title)
13 // make sure the beginning of each DLGITEMTEMPLATE is DWORD aligned.
16 *(DLGITEMTEMPLATE*)p = item_tmpl;
17 p += sizeof(DLGITEMTEMPLATE);
18 *(WORD*)p = (WORD)0xffff;
20 *(WORD*)p = item_class;
31 static BOOL CALLBACK DlgProc(HWND dlg, UINT msg, WPARAM w, LPARAM l);
32 static void LoadCameraIntrinsicsFilenames(std::vector<std::string> &filenames);
33 static void SaveCameraIntrinsicsFilenames(const std::vector<std::string> &filenames);
35 bool FilenamesDialog(HWND parent, int num_filenames, std::vector<std::string> &filenames)
39 if (num_filenames > 20)
42 if (filenames.size() == 0)
43 LoadCameraIntrinsicsFilenames(filenames);
45 filenames.resize(num_filenames);
48 for (i = 0; i < num_filenames; i++)
49 name_size += filenames[i].length() + 1;
51 int num_items = num_filenames*3 + 2;
53 int height = 35 + num_filenames * 20;
54 size_t sz = sizeof(DLGTEMPLATE)+90 + num_items * (sizeof(DLGITEMTEMPLATE)+18) + name_size*2;
55 char *dlgtmpl = (char *)malloc(sz);
57 DLGTEMPLATE dlgtemplate = { WS_POPUP|WS_CAPTION|DS_MODALFRAME|DS_SETFONT|DS_SETFOREGROUND, 0, num_items, 0, 0, width, height };
58 *(DLGTEMPLATE*)p = dlgtemplate;
59 p += sizeof(DLGTEMPLATE);
62 AddStr(p, L"Camera Intrinsics Filenames"); // title
65 AddStr(p, L"MS Sans Serif"); // font
70 for (i = 0; i < num_filenames; i++)
72 DLGITEMTEMPLATE label = { SS_LEFT|WS_CHILD|WS_VISIBLE, 0, 10, 12+i*20, 40, 13, ID_LABEL+i };
73 DLGITEMTEMPLATE edit = { ES_LEFT|WS_BORDER|WS_TABSTOP|WS_CHILD|WS_VISIBLE, 0, 50, 10+i*20, width-75, 13, ID_EDIT+i };
74 DLGITEMTEMPLATE browse = { BS_PUSHBUTTON|WS_TABSTOP|WS_CHILD|WS_VISIBLE, 0, width-25, 10+i*20, 13, 13, ID_BROWSE+i };
75 wchar_t text[MAX_PATH];
76 swprintf(text, L"Camera %d", i+1);
77 AddItem(p, label, STATIC, text);
78 mbstowcs(text, filenames[i].c_str(), sizeof(text));
79 AddItem(p, edit, EDIT, text);
80 AddItem(p, browse, BUTTON, L"...");
82 DLGITEMTEMPLATE ok = { BS_DEFPUSHBUTTON|WS_TABSTOP|WS_CHILD|WS_VISIBLE, 0, 40, height - 20, 50, 14, IDOK };
83 DLGITEMTEMPLATE cancel = { BS_PUSHBUTTON|WS_TABSTOP|WS_CHILD|WS_VISIBLE, 0, width-90, height - 20, 50, 14, IDCANCEL };
84 AddItem(p, ok, BUTTON, L"OK");
85 AddItem(p, cancel, BUTTON, L"Cancel");
87 int r = DialogBoxIndirectParam(0, (DLGTEMPLATE *)dlgtmpl, parent, DlgProc, (LPARAM)&filenames);
91 SaveCameraIntrinsicsFilenames(filenames);
96 static BOOL CALLBACK DlgProc(HWND dlg, UINT msg, WPARAM w, LPARAM l)
98 char filename[MAX_PATH];
102 SetWindowLong(dlg, GWL_USERDATA, l);
106 int control = LOWORD(w);
109 std::vector<std::string> *filenames = (std::vector<std::string> *)GetWindowLong(dlg, GWL_USERDATA);
110 for (int i = 0; i < filenames->size(); i++)
112 GetWindowText(GetDlgItem(dlg, ID_EDIT+i), filename, sizeof(filename));
113 (*filenames)[i] = filename;
116 EndDialog(dlg, IDOK);
119 else if (control == IDCANCEL)
121 EndDialog(dlg, IDCANCEL);
124 else if (control >= ID_BROWSE && control < ID_BROWSE+20)
126 const char filter[] = "*.txt\0*.txt\0All files\0*.*\0";
127 int index = control-ID_BROWSE;
128 HWND edit = GetDlgItem(dlg, ID_EDIT+index);
129 GetWindowText(edit, filename, sizeof(filename));
130 OPENFILENAME ofn = { sizeof(OPENFILENAME), dlg, 0, filter, NULL, 0, 1,
131 filename, sizeof(filename), NULL, 0, NULL, "Camera Intrinsics File",
132 OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_NOCHANGEDIR|OFN_HIDEREADONLY };
133 if (GetOpenFileName(&ofn))
134 SetWindowText(edit, filename);
147 AutoCloseKey(HKEY *pkey) : m_pkey(pkey) { };
152 RegCloseKey(*m_pkey);
158 #define AUTO_CLOSE_KEY(f) AutoCloseKey AutoCloseKey##f(&f)
160 static const char key_name[] = "Software\\Intel\\VAI\\3d Tracker\\";
163 static void LoadCameraIntrinsicsFilenames(std::vector<std::string> &filenames)
167 HKEY key = 0; AUTO_CLOSE_KEY(key);
168 r = RegOpenKeyEx(HKEY_LOCAL_MACHINE, key_name, 0, KEY_READ, &key);
169 if (r != ERROR_SUCCESS)
173 DWORD size = sizeof(names);
174 r = RegQueryValueEx(key, "CameraIntrinsicsFilenames", 0, NULL, (BYTE *)names, &size);
175 if (r != ERROR_SUCCESS)
179 const char *p = names;
182 filenames.push_back(p);
187 static void SaveCameraIntrinsicsFilenames(const std::vector<std::string> &filenames)
191 HKEY key = 0; AUTO_CLOSE_KEY(key);
192 r = RegCreateKeyEx(HKEY_LOCAL_MACHINE, key_name, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL);
193 if (r != ERROR_SUCCESS)
197 // Warning: no overflow protection
199 for (int i = 0; i < filenames.size(); i++)
201 strcpy(p, filenames[i].c_str());
202 p += filenames[i].length() + 1;
206 DWORD size = p - names + 1;
208 RegSetValueEx(key, "CameraIntrinsicsFilenames", 0, REG_MULTI_SZ, (BYTE *)names, size);