Mercurial > msvpvf
comparison src/gui.c @ 68:207684d44b54
gui.c: Add drag and drop support
Utilizes the old Win 3.1 API for it, it does everything I need it to do
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Wed, 04 Jan 2023 21:54:22 -0500 |
parents | a2e979245441 |
children | 79a35af2cb56 |
comparison
equal
deleted
inserted
replaced
67:0902a957d9b0 | 68:207684d44b54 |
---|---|
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
23 * SOFTWARE. | 23 * SOFTWARE. |
24 **/ | 24 **/ |
25 #include <stdio.h> | 25 #include <stdio.h> |
26 #include <windows.h> | 26 #include <windows.h> |
27 #include <shellapi.h> | |
28 #include <shlwapi.h> | |
27 #include <stdint.h> | 29 #include <stdint.h> |
28 #include <stdbool.h> | 30 #include <stdbool.h> |
29 #include <commdlg.h> | 31 #include <commdlg.h> |
30 #include "../include/common.h" | 32 #include "../include/common.h" |
31 #define _WIN32_WINNT 0x0400 | 33 #define _WIN32_WINNT 0x0400 |
44 int16_t version = 13; | 46 int16_t version = 13; |
45 enum types { | 47 enum types { |
46 vf, | 48 vf, |
47 veg | 49 veg |
48 } type; | 50 } type; |
49 char* file_name = " "; | 51 char file_name[257] = {'\0'}; |
50 | 52 |
51 void display_file(char* path) { | 53 void display_file(char* path) { |
52 /* Read the file to memory */ | 54 /* Read the file to memory */ |
53 FILE* file; | 55 FILE* file; |
54 file = fopen(path, "rb"); | 56 file = fopen(path, "rb"); |
55 fseek(file, 0x46, SEEK_SET); | 57 fseek(file, 0x46, SEEK_SET); |
56 int f_version = fgetc(file); | 58 int f_version = fgetc(file)+1; |
57 fseek(file, 0x18, SEEK_SET); | 59 fseek(file, 0x18, SEEK_SET); |
58 TCHAR p[32]; | 60 TCHAR p[32]; |
59 switch (fgetc(file)) { | 61 switch (fgetc(file)) { |
60 case 0xEF: | 62 case 0xEF: |
61 snprintf(p, 32, "File version: %s %d", "VEGAS Pro", f_version); | 63 snprintf(p, 32, "File version: %s %d", "VEGAS Pro", f_version); |
65 break; | 67 break; |
66 default: | 68 default: |
67 snprintf(p, 32, "File version: %s %d", "Unknown", f_version); | 69 snprintf(p, 32, "File version: %s %d", "Unknown", f_version); |
68 break; | 70 break; |
69 } | 71 } |
70 printf("%s", p); | |
71 SendMessage(hWndVersion, WM_SETTEXT, (WPARAM)0, (LPARAM)p); | 72 SendMessage(hWndVersion, WM_SETTEXT, (WPARAM)0, (LPARAM)p); |
72 fclose(file); | 73 fclose(file); |
73 } | 74 } |
74 | 75 |
75 char* open_file(HWND hWnd) { | 76 char* open_file(HWND hWnd) { |
76 OPENFILENAME ofn; | 77 OPENFILENAME ofn; |
77 char filename[256]; | 78 char* filename = calloc(256, sizeof(char)); |
78 | 79 |
79 ZeroMemory(&ofn, OPENFILENAME_SIZE_VERSION_400); | 80 ZeroMemory(&ofn, OPENFILENAME_SIZE_VERSION_400); |
80 ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; | 81 ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; |
81 ofn.hwndOwner = hWnd; | 82 ofn.hwndOwner = hWnd; |
82 ofn.lpstrFile = filename; | 83 ofn.lpstrFile = filename; |
89 return " "; | 90 return " "; |
90 } | 91 } |
91 | 92 |
92 display_file(filename); | 93 display_file(filename); |
93 | 94 |
94 return strdup(filename); | 95 return filename; |
95 } | 96 } |
96 | 97 |
97 void save_file(HWND hWnd, char* input_file) { | 98 void save_file(HWND hWnd, char* input_file) { |
98 if (strcmp(input_file, " ") == 0) { | 99 if (strcmp(input_file, " ") == 0) { |
99 MessageBox(hWnd, | 100 MessageBox(hWnd, |
101 TEXT("Invalid input file!"), | 102 TEXT("Invalid input file!"), |
102 MB_ICONEXCLAMATION); | 103 MB_ICONEXCLAMATION); |
103 return; | 104 return; |
104 } | 105 } |
105 OPENFILENAME ofn; | 106 OPENFILENAME ofn; |
106 char output_file[256]; | 107 char output_file[256] = {'\0'}, *input_basename = strdup(input_file); |
108 PathStripPath(input_basename); | |
109 int amt_of_ch = snprintf(output_file, 256, "PRO_V%d_", version); | |
110 if (256-amt_of_ch > 0) | |
111 strncat(output_file, input_basename, 256-amt_of_ch); | |
107 | 112 |
108 ZeroMemory(&ofn, OPENFILENAME_SIZE_VERSION_400); | 113 ZeroMemory(&ofn, OPENFILENAME_SIZE_VERSION_400); |
109 ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; | 114 ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; |
110 ofn.hwndOwner = hWnd; | 115 ofn.hwndOwner = hWnd; |
111 ofn.lpstrFile = output_file; | 116 ofn.lpstrFile = output_file; |
112 ofn.lpstrFile[0] = '\0'; | |
113 ofn.nMaxFile = 256; | 117 ofn.nMaxFile = 256; |
114 ofn.lpstrFilter = "Movie Studio project files\0*.vf\0VEGAS Pro project files\0*.veg\0All files\0*.*\0"; | 118 ofn.lpstrFilter = "Movie Studio project files\0*.vf\0VEGAS Pro project files\0*.veg\0All files\0*.*\0"; |
115 ofn.nFilterIndex = (int)type+1; | 119 ofn.nFilterIndex = (int)type+1; |
116 | 120 |
117 if (GetSaveFileName(&ofn) == 0) { | 121 if (GetSaveFileName(&ofn) == 0) { |
125 FILE* output = fopen(output_file, "r+b"); | 129 FILE* output = fopen(output_file, "r+b"); |
126 if (output == NULL) { | 130 if (output == NULL) { |
127 MessageBox(hWnd, TEXT("Failed to save project file!"), TEXT("Saving project failed!"), MB_ICONEXCLAMATION); | 131 MessageBox(hWnd, TEXT("Failed to save project file!"), TEXT("Saving project failed!"), MB_ICONEXCLAMATION); |
128 return; | 132 return; |
129 } | 133 } |
134 | |
130 unsigned char magic_veg[] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; | 135 unsigned char magic_veg[] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; |
131 unsigned char magic_vf[] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F}; | 136 unsigned char magic_vf[] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F}; |
132 | 137 |
133 set_data(type == veg ? magic_veg : magic_vf, version, output); | 138 set_data(type == veg ? magic_veg : magic_vf, version-1, output); |
134 | 139 |
135 fclose(output); | 140 fclose(output); |
136 } | 141 } |
137 | 142 |
138 void AddControls(HWND hWnd) { | 143 void AddControls(HWND hWnd) { |
139 /* Versions */ | 144 /* Versions */ |
140 hWndComboBox = CreateWindow("ComboBox", NULL, | 145 hWndComboBox = CreateWindow("ComboBox", NULL, |
141 CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_VSCROLL, | 146 CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_VSCROLL, |
142 (int)((225 - 50)/2), 30, 50, 200, | 147 (int)((225 - 50)/2), 30, 50, 200, |
143 hWnd, (HMENU)COMBOBOX, NULL, NULL); /** | 148 hWnd, (HMENU)COMBOBOX, NULL, NULL); |
144 * I don't understand what half of | 149 |
145 * these arguments are for, so chances | |
146 * are that you don't either. | |
147 **/ | |
148 TCHAR versions[][10] = {TEXT("8"), TEXT("9"), TEXT("10"), | 150 TCHAR versions[][10] = {TEXT("8"), TEXT("9"), TEXT("10"), |
149 TEXT("11"), TEXT("12"), TEXT("13"), | 151 TEXT("11"), TEXT("12"), TEXT("13"), |
150 TEXT("14"), TEXT("15"), TEXT("16"), | 152 TEXT("14"), TEXT("15"), TEXT("16"), |
151 TEXT("17"), TEXT("18"), TEXT("19")}; | 153 TEXT("17"), TEXT("18"), TEXT("19")}; |
152 | 154 |
187 if (LOWORD(wParam) == LISTBOX) | 189 if (LOWORD(wParam) == LISTBOX) |
188 type = SendMessage((HWND) lParam, (UINT) LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); | 190 type = SendMessage((HWND) lParam, (UINT) LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); |
189 } | 191 } |
190 switch(wParam) { | 192 switch(wParam) { |
191 case OPEN_FILE_BUTTON: | 193 case OPEN_FILE_BUTTON: |
192 file_name = open_file(hWnd); | 194 strncpy(file_name, open_file(hWnd), 256); |
193 case COMBOBOX: | 195 case COMBOBOX: |
194 case LISTBOX: | 196 case LISTBOX: |
195 case VERSION: | 197 case VERSION: |
196 break; | 198 break; |
197 case SAVE_FILE_BUTTON: | 199 case SAVE_FILE_BUTTON: |
204 break; | 206 break; |
205 } | 207 } |
206 case WM_DESTROY: | 208 case WM_DESTROY: |
207 PostQuitMessage(0); | 209 PostQuitMessage(0); |
208 break; | 210 break; |
211 case WM_DROPFILES: | |
212 /* Drag and drop support */ | |
213 HDROP hDrop = (HDROP)wParam; | |
214 DragQueryFile(hDrop, 0, file_name, 256); | |
215 display_file(file_name); | |
216 break; | |
209 default: | 217 default: |
210 return DefWindowProc(hWnd, msg, wParam, lParam); | 218 return DefWindowProc(hWnd, msg, wParam, lParam); |
211 } | 219 } |
212 return false; | 220 return false; |
213 } | 221 } |
221 wc.lpszClassName = "msvpvf"; | 229 wc.lpszClassName = "msvpvf"; |
222 wc.lpfnWndProc = WindowProcedure; | 230 wc.lpfnWndProc = WindowProcedure; |
223 | 231 |
224 if (!RegisterClass(&wc)) return -1; | 232 if (!RegisterClass(&wc)) return -1; |
225 | 233 |
226 CreateWindow(TEXT("msvpvf"), TEXT("Movie Studio / Vegas Pro version spoofer"), WS_OVERLAPPED | WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU, 100, 100, 225, 200, NULL, NULL, hInstance, NULL); | 234 CreateWindowEx(WS_EX_ACCEPTFILES, TEXT("msvpvf"), TEXT("Movie Studio / Vegas Pro version spoofer"), WS_OVERLAPPED | WS_VISIBLE | WS_MINIMIZEBOX | WS_SYSMENU, 100, 100, 225, 200, NULL, NULL, hInstance, NULL); |
227 | 235 |
228 MSG msg = {0}; | 236 MSG msg = {0}; |
229 | 237 |
230 while (GetMessage(&msg, NULL, 0, 0)) { | 238 while (GetMessage(&msg, NULL, 0, 0)) { |
231 TranslateMessage(&msg); | 239 TranslateMessage(&msg); |