2 * Unit test suite for comdlg32 API functions: file dialogs
4 * Copyright 2007 Google (Lei Zhang)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include <wine/test.h>
32 static UINT_PTR CALLBACK
OFNHookProc( HWND hDlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
38 nmh
= (LPNMHDR
) lParam
;
39 if( nmh
->code
== CDN_INITDONE
)
41 PostMessage( GetParent(hDlg
), WM_COMMAND
, IDCANCEL
, FALSE
);
42 } else if (nmh
->code
== CDN_FOLDERCHANGE
)
47 memset(buf
, 0x66, sizeof(buf
));
48 ret
= SendMessage( GetParent(hDlg
), CDM_GETFOLDERIDLIST
, 5, (LPARAM
)buf
);
49 ok(ret
> 0, "CMD_GETFOLDERIDLIST not implemented\n");
51 ok(buf
[0] == 0x66 && buf
[1] == 0x66, "CMD_GETFOLDERIDLIST: The buffer was touched on failure\n");
59 static void test_DialogCancel(void)
63 char szFileName
[MAX_PATH
] = "";
64 char szInitialDir
[MAX_PATH
];
66 GetWindowsDirectory(szInitialDir
, MAX_PATH
);
68 ZeroMemory(&ofn
, sizeof(ofn
));
70 ofn
.lStructSize
= sizeof(ofn
);
72 ofn
.lpstrFilter
= "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
73 ofn
.lpstrFile
= szFileName
;
74 ofn
.nMaxFile
= MAX_PATH
;
75 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
| OFN_HIDEREADONLY
| OFN_ENABLEHOOK
;
76 ofn
.lpstrDefExt
= "txt";
77 ofn
.lpfnHook
= OFNHookProc
;
78 ofn
.lpstrInitialDir
= szInitialDir
;
81 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
82 CDERR_INITIALIZATION
, CommDlgExtendedError());
84 result
= GetOpenFileNameA(&ofn
);
85 ok(0 == result
, "expected %d, got %d\n", 0, result
);
86 ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0,
87 CommDlgExtendedError());
90 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
91 CDERR_INITIALIZATION
, CommDlgExtendedError());
93 result
= GetSaveFileNameA(&ofn
);
94 ok(0 == result
, "expected %d, got %d\n", 0, result
);
95 ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0,
96 CommDlgExtendedError());
99 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
100 CDERR_INITIALIZATION
, CommDlgExtendedError());
102 /* Before passing the ofn to Unicode functions, remove the ANSI strings */
103 ofn
.lpstrFilter
= NULL
;
104 ofn
.lpstrInitialDir
= NULL
;
105 ofn
.lpstrDefExt
= NULL
;
108 ok(CDERR_INITIALIZATION
== CommDlgExtendedError(), "expected %d, got %d\n",
109 CDERR_INITIALIZATION
, CommDlgExtendedError());
111 SetLastError(0xdeadbeef);
112 result
= GetOpenFileNameW((LPOPENFILENAMEW
) &ofn
);
113 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
114 win_skip("GetOpenFileNameW is not implemented\n");
117 ok(0 == result
, "expected %d, got %d\n", 0, result
);
118 ok(0 == CommDlgExtendedError() ||
119 CDERR_INITIALIZATION
== CommDlgExtendedError(), /* win9x */
120 "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION
,
121 CommDlgExtendedError());
124 SetLastError(0xdeadbeef);
125 result
= GetSaveFileNameW((LPOPENFILENAMEW
) &ofn
);
126 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
127 win_skip("GetSaveFileNameW is not implemented\n");
130 ok(0 == result
, "expected %d, got %d\n", 0, result
);
131 ok(0 == CommDlgExtendedError() ||
132 CDERR_INITIALIZATION
== CommDlgExtendedError(), /* win9x */
133 "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION
,
134 CommDlgExtendedError());
138 static UINT_PTR CALLBACK
create_view_window2_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
140 if (msg
== WM_NOTIFY
)
142 if (((LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
)
144 IShellBrowser
*shell_browser
= (IShellBrowser
*)SendMessage(GetParent(dlg
), WM_USER
+ 7 /* WM_GETISHELLBROWSER */, 0, 0);
145 IShellView
*shell_view
= NULL
;
146 IShellView2
*shell_view2
= NULL
;
147 SV2CVW2_PARAMS view_params
;
148 FOLDERSETTINGS folder_settings
;
150 RECT rect
= {0, 0, 0, 0};
152 hr
= IShellBrowser_QueryActiveShellView(shell_browser
, &shell_view
);
153 ok(SUCCEEDED(hr
), "QueryActiveShellView returned %#x\n", hr
);
154 if (FAILED(hr
)) goto cleanup
;
156 hr
= IShellView_QueryInterface(shell_view
, &IID_IShellView2
, (void **)&shell_view2
);
157 if (hr
== E_NOINTERFACE
)
159 win_skip("IShellView2 not supported\n");
162 ok(SUCCEEDED(hr
), "QueryInterface returned %#x\n", hr
);
163 if (FAILED(hr
)) goto cleanup
;
165 hr
= IShellView2_DestroyViewWindow(shell_view2
);
166 ok(SUCCEEDED(hr
), "DestroyViewWindow returned %#x\n", hr
);
168 folder_settings
.ViewMode
= FVM_LIST
;
169 folder_settings
.fFlags
= 0;
171 view_params
.cbSize
= sizeof(view_params
);
172 view_params
.psvPrev
= NULL
;
173 view_params
.pfs
= &folder_settings
;
174 view_params
.psbOwner
= shell_browser
;
175 view_params
.prcView
= &rect
;
176 view_params
.pvid
= NULL
;
177 view_params
.hwndView
= NULL
;
179 hr
= IShellView2_CreateViewWindow2(shell_view2
, &view_params
);
180 ok(SUCCEEDED(hr
), "CreateViewWindow2 returned %#x\n", hr
);
181 if (FAILED(hr
)) goto cleanup
;
183 hr
= IShellView2_GetCurrentInfo(shell_view2
, &folder_settings
);
184 ok(SUCCEEDED(hr
), "GetCurrentInfo returned %#x\n", hr
);
185 ok(folder_settings
.ViewMode
== FVM_LIST
, "view mode is %d, expected %d\n", folder_settings
.ViewMode
, FVM_LIST
);
187 hr
= IShellView2_DestroyViewWindow(shell_view2
);
188 ok(SUCCEEDED(hr
), "DestroyViewWindow returned %#x\n", hr
);
190 /* XP and W2K3 need this. On Win9x and W2K the call to DestroyWindow() fails and has
191 * no side effects. NT4 doesn't get here. (FIXME: Vista doesn't get here yet).
193 DestroyWindow(view_params
.hwndView
);
195 view_params
.pvid
= &VID_Details
;
196 hr
= IShellView2_CreateViewWindow2(shell_view2
, &view_params
);
197 ok(SUCCEEDED(hr
), "CreateViewWindow2 returned %#x\n", hr
);
198 if (FAILED(hr
)) goto cleanup
;
200 hr
= IShellView2_GetCurrentInfo(shell_view2
, &folder_settings
);
201 ok(SUCCEEDED(hr
), "GetCurrentInfo returned %#x\n", hr
);
202 ok(folder_settings
.ViewMode
== FVM_DETAILS
||
203 broken(folder_settings
.ViewMode
== FVM_LIST
), /* Win9x */
204 "view mode is %d, expected %d\n", folder_settings
.ViewMode
, FVM_DETAILS
);
207 if (shell_view2
) IShellView2_Release(shell_view2
);
208 if (shell_view
) IShellView_Release(shell_view
);
209 PostMessage(GetParent(dlg
), WM_COMMAND
, IDCANCEL
, 0);
215 static LONG_PTR WINAPI
template_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
217 if (msg
== WM_INITDIALOG
)
222 ok(p
!=NULL
, "Failed to get parent of template\n");
223 cb
= GetDlgItem(p
,0x470);
224 ok(cb
!=NULL
, "Failed to get filter combobox\n");
225 sel
= SendMessage(cb
, CB_GETCURSEL
, 0, 0);
226 ok (sel
!= -1, "Failed to get selection from filter listbox\n");
228 if (msg
== WM_NOTIFY
)
230 if (((LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
)
231 PostMessage(GetParent(dlg
), WM_COMMAND
, IDCANCEL
, 0);
236 static void test_create_view_window2(void)
238 OPENFILENAMEA ofn
= {0};
239 char filename
[1024] = {0};
242 ofn
.lStructSize
= sizeof(ofn
);
243 ofn
.lpstrFile
= filename
;
245 ofn
.lpfnHook
= create_view_window2_hook
;
246 ofn
.Flags
= OFN_ENABLEHOOK
| OFN_EXPLORER
;
247 ret
= GetOpenFileNameA(&ofn
);
248 ok(!ret
, "GetOpenFileNameA returned %#x\n", ret
);
249 ret
= CommDlgExtendedError();
250 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
253 static void test_create_view_template(void)
255 OPENFILENAMEA ofn
= {0};
256 char filename
[1024] = {0};
259 ofn
.lStructSize
= sizeof(ofn
);
260 ofn
.lpstrFile
= filename
;
262 ofn
.lpfnHook
= (LPOFNHOOKPROC
)template_hook
;
263 ofn
.Flags
= OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_ENABLETEMPLATE
;
264 ofn
.hInstance
= GetModuleHandleA(NULL
);
265 ofn
.lpTemplateName
= "template1";
266 ofn
.lpstrFilter
="text\0*.txt\0All\0*\0\0";
267 ret
= GetOpenFileNameA(&ofn
);
268 ok(!ret
, "GetOpenFileNameA returned %#x\n", ret
);
269 ret
= CommDlgExtendedError();
270 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
273 /* test cases for resizing of the file dialog */
276 int resize_folderchange
;/* change in CDN_FOLDERCHANGE handler */
277 int resize_timer1
; /* change in first WM_TIMER handler */
278 int resize_check
; /* expected change (in second WM_TIMER handler) */
279 BOOL todo
; /* mark that test todo_wine */
280 BOOL testcontrols
; /* test resizing and moving of the controls */
281 } resize_testcases
[] = {
282 { 0 , 10, 10, 20,FALSE
,FALSE
}, /* 0 */
283 { 0 ,-10,-10,-20,FALSE
,FALSE
},
284 { OFN_ENABLESIZING
, 0, 0, 0,FALSE
,FALSE
},
285 { OFN_ENABLESIZING
, 0,-10, 0,FALSE
,FALSE
},
286 { OFN_ENABLESIZING
, 0, 10, 10,FALSE
, TRUE
},
287 { OFN_ENABLESIZING
,-10, 0, 10,FALSE
,FALSE
}, /* 5 */
288 { OFN_ENABLESIZING
, 10, 0, 10,FALSE
,FALSE
},
289 { OFN_ENABLESIZING
, 0, 10, 20,FALSE
,FALSE
},
294 static LONG_PTR WINAPI
resize_template_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
296 static RECT initrc
, rc
;
297 static int index
, count
;
298 static int gotSWP_bottom
, gotShowWindow
;
299 HWND parent
= GetParent( dlg
);
301 #define MAXNRCTRLS 30
302 static RECT ctrlrcs
[MAXNRCTRLS
];
303 static int ctrlids
[MAXNRCTRLS
];
304 static HWND ctrls
[MAXNRCTRLS
];
313 index
= ((OPENFILENAME
*)lParam
)->lCustData
;
315 gotSWP_bottom
= gotShowWindow
= 0;
317 style
= GetWindowLong( parent
, GWL_STYLE
);
318 if( resize_testcases
[index
].flags
& OFN_ENABLESIZING
)
319 if( !(style
& WS_SIZEBOX
)) {
320 win_skip( "OFN_ENABLESIZING flag not supported.\n");
321 PostMessage( parent
, WM_COMMAND
, IDCANCEL
, 0);
323 ok( style
& WS_SIZEBOX
,
324 "testid %d: dialog should have a WS_SIZEBOX style.\n", index
);
326 ok( !(style
& WS_SIZEBOX
),
327 "testid %d: dialog should not have a WS_SIZEBOX style.\n", index
);
332 if(( (LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
){
333 GetWindowRect( parent
, &initrc
);
334 if( (resize
= resize_testcases
[index
].resize_folderchange
)){
335 MoveWindow( parent
, initrc
.left
,initrc
.top
, initrc
.right
- initrc
.left
+ resize
,
336 initrc
.bottom
- initrc
.top
+ resize
, TRUE
);
338 SetTimer( dlg
, 0, 100, 0);
345 /* store the control rectangles */
346 if( resize_testcases
[index
].testcontrols
) {
349 for( i
= 0, ctrl
= GetWindow( parent
, GW_CHILD
);
350 i
< MAXNRCTRLS
&& ctrl
;
351 i
++, ctrl
= GetWindow( ctrl
, GW_HWNDNEXT
)) {
352 ctrlids
[i
] = GetDlgCtrlID( ctrl
);
353 GetWindowRect( ctrl
, &ctrlrcs
[i
]);
354 MapWindowPoints( NULL
, parent
, (LPPOINT
) &ctrlrcs
[i
], 2);
359 if( (resize
= resize_testcases
[index
].resize_timer1
)){
360 GetWindowRect( parent
, &rc
);
361 MoveWindow( parent
, rc
.left
,rc
.top
, rc
.right
- rc
.left
+ resize
,
362 rc
.bottom
- rc
.top
+ resize
, TRUE
);
364 } else if( count
== 1){
365 resize
= resize_testcases
[index
].resize_check
;
366 GetWindowRect( parent
, &rc
);
367 if( resize_testcases
[index
].todo
){
369 ok( resize
== rc
.right
- rc
.left
- initrc
.right
+ initrc
.left
,
370 "testid %d size-x change %d expected %d\n", index
,
371 rc
.right
- rc
.left
- initrc
.right
+ initrc
.left
, resize
);
372 ok( resize
== rc
.bottom
- rc
.top
- initrc
.bottom
+ initrc
.top
,
373 "testid %d size-y change %d expected %d\n", index
,
374 rc
.bottom
- rc
.top
- initrc
.bottom
+ initrc
.top
, resize
);
377 ok( resize
== rc
.right
- rc
.left
- initrc
.right
+ initrc
.left
,
378 "testid %d size-x change %d expected %d\n", index
,
379 rc
.right
- rc
.left
- initrc
.right
+ initrc
.left
, resize
);
380 ok( resize
== rc
.bottom
- rc
.top
- initrc
.bottom
+ initrc
.top
,
381 "testid %d size-y change %d expected %d\n", index
,
382 rc
.bottom
- rc
.top
- initrc
.bottom
+ initrc
.top
, resize
);
384 if( resize_testcases
[index
].testcontrols
) {
387 for( i
= 0; i
< nrctrls
; i
++) {
388 GetWindowRect( ctrls
[i
], &rc
);
389 MapWindowPoints( NULL
, parent
, (LPPOINT
) &rc
, 2);
392 /* test if RECT R1, moved and sized result in R2 */
393 #define TESTRECTS( R1, R2, Mx, My, Sx, Sy) \
394 ((R1).left + (Mx) ==(R2).left \
395 &&(R1).top + (My) ==(R2).top \
396 &&(R1).right + (Mx) + (Sx) == (R2).right \
397 &&(R1).bottom + (My) + (Sy) ==(R2).bottom)
399 /* sized horizontal and moved vertical */
402 ok( TESTRECTS( ctrlrcs
[i
], rc
, 0, 10, 10, 0) ||
403 broken(TESTRECTS( ctrlrcs
[i
], rc
, 0, 10, 0, 0)),/*win98*/
404 "control id %03x should have sized horizontally and moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n",
405 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
406 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
407 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
409 /* sized horizontal and vertical */
411 ok( TESTRECTS( ctrlrcs
[i
], rc
, 0, 0, 10, 10),
412 "control id %03x should have sized horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n",
413 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
414 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
415 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
417 /* moved horizontal and vertical */
420 ok( TESTRECTS( ctrlrcs
[i
], rc
, 10, 10, 0, 0) ||
421 broken(TESTRECTS( ctrlrcs
[i
], rc
, 0, 10, 0, 0)),/*win98*/
422 "control id %03x should have moved horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n",
423 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
424 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
425 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
427 /* moved vertically */
431 ok( TESTRECTS( ctrlrcs
[i
], rc
, 0, 10, 0, 0),
432 "control id %03x should have moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n",
433 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
434 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
435 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
437 /* resized horizontal */
438 case cmb2
: /* aka IDC_LOOKIN */
439 ok( TESTRECTS( ctrlrcs
[i
], rc
, 0, 0, 10, 0)||
440 TESTRECTS( ctrlrcs
[i
], rc
, 0, 0, 0, 0), /* Vista and higher */
441 "control id %03x should have resized horizontally, before %d,%d-%d,%d after %d,%d-%d,%d\n",
442 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
443 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
444 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
446 /* non moving non sizing controls */
448 ok( TESTRECTS( rc
, ctrlrcs
[i
], 0, 0, 0, 0),
449 "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n",
450 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
451 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
452 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
454 /* todo_wine: non moving non sizing controls */
457 ok( TESTRECTS( rc
, ctrlrcs
[i
], 0, 0, 0, 0),
458 "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n",
459 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
460 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
461 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
463 /* don't test: id is not unique */
470 trace("untested control id %03x before %d,%d-%d,%d after %d,%d-%d,%d\n",
471 ctrlids
[i
], ctrlrcs
[i
].left
, ctrlrcs
[i
].top
,
472 ctrlrcs
[i
].right
, ctrlrcs
[i
].bottom
,
473 rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
480 PostMessage( parent
, WM_COMMAND
, IDCANCEL
, 0);
485 case WM_WINDOWPOSCHANGING
:
487 WINDOWPOS
*pwp
= (WINDOWPOS
*)lParam
;
488 if( !index
&& pwp
->hwndInsertAfter
== HWND_BOTTOM
){
490 ok( gotShowWindow
== 0, "The WM_WINDOWPOSCHANGING message came after a WM_SHOWWINDOW message\n");
498 ok( gotSWP_bottom
== 1, "No WM_WINDOWPOSCHANGING message came before a WM_SHOWWINDOW message\n");
506 static void test_resize(void)
508 OPENFILENAME ofn
= { sizeof(OPENFILENAME
)};
509 char filename
[1024] = {0};
513 ofn
.lpstrFile
= filename
;
515 ofn
.lpfnHook
= (LPOFNHOOKPROC
) resize_template_hook
;
516 ofn
.hInstance
= GetModuleHandle(NULL
);
517 ofn
.lpTemplateName
= "template_sz";
518 for( i
= 0; resize_testcases
[i
].flags
!= 0xffffffff; i
++) {
520 ofn
.Flags
= resize_testcases
[i
].flags
|
521 OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_ENABLETEMPLATE
| OFN_SHOWHELP
;
522 ret
= GetOpenFileName(&ofn
);
523 ok(!ret
, "GetOpenFileName returned %#x\n", ret
);
524 ret
= CommDlgExtendedError();
525 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
529 /* test cases for control message IDOK */
530 /* Show case for bug #19079 */
532 int retval
; /* return code of the message handler */
533 BOOL setmsgresult
; /* set the result in the DWLP_MSGRESULT */
534 BOOL usemsgokstr
; /* use the FILEOKSTRING message instead of WM_NOTIFY:CDN_FILEOK */
535 BOOL do_subclass
; /* subclass the dialog hook procedure */
536 BOOL expclose
; /* is the dialog expected to close ? */
537 BOOL actclose
; /* has the dialog actually closed ? */
539 { 0, FALSE
, FALSE
, FALSE
, TRUE
},
540 { 0, TRUE
, FALSE
, FALSE
, TRUE
},
541 { 0, FALSE
, FALSE
, TRUE
, TRUE
},
542 { 0, TRUE
, FALSE
, TRUE
, TRUE
},
543 { 1, FALSE
, FALSE
, FALSE
, TRUE
},
544 { 1, TRUE
, FALSE
, FALSE
, FALSE
},
545 { 1, FALSE
, FALSE
, TRUE
, FALSE
},
546 { 1, TRUE
, FALSE
, TRUE
, FALSE
},
547 /* FILEOKSTRING tests */
548 { 1, TRUE
, TRUE
, FALSE
, FALSE
},
549 { 1, FALSE
, TRUE
, TRUE
, FALSE
},
554 /* test_ok_wndproc can be used as hook procedure or a subclass
555 * window proc for the file dialog */
556 static LONG_PTR WINAPI
test_ok_wndproc(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
558 HWND parent
= GetParent( dlg
);
560 static UINT msgFILEOKSTRING
;
561 if (msg
== WM_INITDIALOG
)
563 index
= ((OPENFILENAME
*)lParam
)->lCustData
;
564 ok_testcases
[index
].actclose
= TRUE
;
565 msgFILEOKSTRING
= RegisterWindowMessageA( FILEOKSTRING
);
567 if( msg
== WM_NOTIFY
) {
568 if(((LPNMHDR
)lParam
)->code
== CDN_FOLDERCHANGE
) {
569 SetTimer( dlg
, 0, 100, 0);
570 PostMessage( parent
, WM_COMMAND
, IDOK
, 0);
572 } else if(((LPNMHDR
)lParam
)->code
== CDN_FILEOK
) {
573 if( ok_testcases
[index
].usemsgokstr
)
575 if( ok_testcases
[index
].setmsgresult
)
576 SetWindowLongPtrA( dlg
, DWLP_MSGRESULT
, ok_testcases
[index
].retval
);
577 return ok_testcases
[index
].retval
;
580 if( msg
== msgFILEOKSTRING
) {
581 if( !ok_testcases
[index
].usemsgokstr
)
583 if( ok_testcases
[index
].setmsgresult
)
584 SetWindowLongPtrA( dlg
, DWLP_MSGRESULT
, ok_testcases
[index
].retval
);
585 return ok_testcases
[index
].retval
;
587 if( msg
== WM_TIMER
) {
588 /* the dialog did not close automatically */
589 ok_testcases
[index
].actclose
= FALSE
;
591 PostMessage( parent
, WM_COMMAND
, IDCANCEL
, 0);
594 if( ok_testcases
[index
].do_subclass
)
595 return DefWindowProc( dlg
, msg
, wParam
, lParam
);
599 static LONG_PTR WINAPI
ok_template_hook(HWND dlg
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
601 if (msg
== WM_SETFONT
)
602 SetWindowLongPtrA( dlg
, GWLP_WNDPROC
, (LONG_PTR
) test_ok_wndproc
);
606 static void test_ok(void)
608 OPENFILENAME ofn
= { sizeof(OPENFILENAME
)};
609 char filename
[1024] = {0};
610 char tmpfilename
[ MAX_PATH
];
614 if (!GetTempFileNameA(".", "txt", 0, tmpfilename
)) {
615 skip("Failed to create a temporary file name\n");
618 ofn
.lpstrFile
= filename
;
620 ofn
.hInstance
= GetModuleHandle(NULL
);
621 ofn
.lpTemplateName
= "template1";
622 ofn
.Flags
= OFN_ENABLEHOOK
| OFN_EXPLORER
| OFN_ENABLETEMPLATE
;
623 for( i
= 0; ok_testcases
[i
].retval
!= -1; i
++) {
624 strcpy( filename
, tmpfilename
);
626 ofn
.lpfnHook
= ok_testcases
[i
].do_subclass
627 ? (LPOFNHOOKPROC
) ok_template_hook
628 : (LPOFNHOOKPROC
) test_ok_wndproc
;
629 ret
= GetOpenFileNameA(&ofn
);
630 ok( ok_testcases
[i
].expclose
== ok_testcases
[i
].actclose
,
631 "testid %d: Open File dialog should %shave closed.\n", i
,
632 ok_testcases
[i
].expclose
? "" : "NOT ");
633 ok(ret
== ok_testcases
[i
].expclose
, "testid %d: GetOpenFileName returned %#x\n", i
, ret
);
634 ret
= CommDlgExtendedError();
635 ok(!ret
, "CommDlgExtendedError returned %#x\n", ret
);
637 ret
= DeleteFileA( tmpfilename
);
638 ok( ret
, "Failed to delete temporary file %s err %d\n", tmpfilename
, GetLastError());
644 test_create_view_window2();
645 test_create_view_template();