2 * 16-bit dialog functions
4 * Copyright 1993, 1994, 1996, 2003 Alexandre Julliard
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "wine/port.h"
29 #include "wine/winuser16.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(dialog
);
37 /* Dialog control information */
68 /***********************************************************************
71 * Return the class and text of the control pointed to by ptr,
72 * fill the header structure and return a pointer to the next control.
74 static LPCSTR
DIALOG_GetControl16( LPCSTR p
, DLG_CONTROL_INFO
*info
)
76 static char buffer
[10];
79 info
->x
= GET_WORD(p
); p
+= sizeof(WORD
);
80 info
->y
= GET_WORD(p
); p
+= sizeof(WORD
);
81 info
->cx
= GET_WORD(p
); p
+= sizeof(WORD
);
82 info
->cy
= GET_WORD(p
); p
+= sizeof(WORD
);
83 info
->id
= GET_WORD(p
); p
+= sizeof(WORD
);
84 info
->style
= GET_DWORD(p
); p
+= sizeof(DWORD
);
90 case 0x80: strcpy( buffer
, "BUTTON" ); break;
91 case 0x81: strcpy( buffer
, "EDIT" ); break;
92 case 0x82: strcpy( buffer
, "STATIC" ); break;
93 case 0x83: strcpy( buffer
, "LISTBOX" ); break;
94 case 0x84: strcpy( buffer
, "SCROLLBAR" ); break;
95 case 0x85: strcpy( buffer
, "COMBOBOX" ); break;
96 default: buffer
[0] = '\0'; break;
98 info
->className
= buffer
;
107 int_id
= ((BYTE
)*p
== 0xff);
110 /* Integer id, not documented (?). Only works for SS_ICON controls */
111 info
->windowName
= (LPCSTR
)(UINT
)GET_WORD(p
+1);
116 info
->windowName
= p
;
120 if (*p
) info
->data
= p
+ 1;
121 else info
->data
= NULL
;
125 TRACE(" %s %s %d, %d, %d, %d, %d, %08lx, %p\n",
126 debugstr_a(info
->className
), debugstr_a(info
->windowName
),
127 info
->id
, info
->x
, info
->y
, info
->cx
, info
->cy
,
128 info
->style
, info
->data
);
134 /***********************************************************************
135 * DIALOG_CreateControls16
137 * Create the control windows for a dialog.
139 static BOOL
DIALOG_CreateControls16( HWND hwnd
, LPCSTR
template,
140 const DLG_TEMPLATE
*dlgTemplate
, HINSTANCE16 hInst
)
142 DIALOGINFO
*dlgInfo
= DIALOG_get_info( hwnd
);
143 DLG_CONTROL_INFO info
;
144 HWND hwndCtrl
, hwndDefButton
= 0;
145 INT items
= dlgTemplate
->nbItems
;
150 HINSTANCE16 instance
= hInst
;
153 template = DIALOG_GetControl16( template, &info
);
154 if (HIWORD(info
.className
) && !strcmp( info
.className
, "EDIT") &&
155 !(GetWindowLongW( hwnd
, GWL_STYLE
) & DS_LOCALEDIT
))
157 if (!dlgInfo
->hDialogHeap
)
159 dlgInfo
->hDialogHeap
= GlobalAlloc16(GMEM_FIXED
, 0x10000);
160 if (!dlgInfo
->hDialogHeap
)
162 ERR("Insufficient memory to create heap for edit control\n" );
165 LocalInit16(dlgInfo
->hDialogHeap
, 0, 0xffff);
167 instance
= dlgInfo
->hDialogHeap
;
170 segptr
= MapLS( info
.data
);
171 hwndCtrl
= WIN_Handle32( CreateWindowEx16( WS_EX_NOPARENTNOTIFY
,
172 info
.className
, info
.windowName
,
173 info
.style
| WS_CHILD
,
174 MulDiv(info
.x
, dlgInfo
->xBaseUnit
, 4),
175 MulDiv(info
.y
, dlgInfo
->yBaseUnit
, 8),
176 MulDiv(info
.cx
, dlgInfo
->xBaseUnit
, 4),
177 MulDiv(info
.cy
, dlgInfo
->yBaseUnit
, 8),
178 HWND_16(hwnd
), (HMENU16
)info
.id
,
179 instance
, (LPVOID
)segptr
));
184 if (dlgTemplate
->style
& DS_NOFAILCREATE
) continue;
188 /* Send initialisation messages to the control */
189 if (dlgInfo
->hUserFont
) SendMessageA( hwndCtrl
, WM_SETFONT
,
190 (WPARAM
)dlgInfo
->hUserFont
, 0 );
191 if (SendMessageA(hwndCtrl
, WM_GETDLGCODE
, 0, 0) & DLGC_DEFPUSHBUTTON
)
193 /* If there's already a default push-button, set it back */
194 /* to normal and use this one instead. */
196 SendMessageA( hwndDefButton
, BM_SETSTYLE
,
197 BS_PUSHBUTTON
,FALSE
);
198 hwndDefButton
= hwndCtrl
;
199 dlgInfo
->idResult
= GetWindowLongA( hwndCtrl
, GWL_ID
);
207 /***********************************************************************
208 * DIALOG_ParseTemplate16
210 * Fill a DLG_TEMPLATE structure from the dialog template, and return
211 * a pointer to the first control.
213 static LPCSTR
DIALOG_ParseTemplate16( LPCSTR p
, DLG_TEMPLATE
* result
)
215 result
->style
= GET_DWORD(p
); p
+= sizeof(DWORD
);
216 result
->nbItems
= (unsigned char) *p
++;
217 result
->x
= GET_WORD(p
); p
+= sizeof(WORD
);
218 result
->y
= GET_WORD(p
); p
+= sizeof(WORD
);
219 result
->cx
= GET_WORD(p
); p
+= sizeof(WORD
);
220 result
->cy
= GET_WORD(p
); p
+= sizeof(WORD
);
222 TRACE("DIALOG %d, %d, %d, %d\n", result
->x
, result
->y
, result
->cx
, result
->cy
);
223 TRACE(" STYLE %08lx\n", result
->style
);
225 /* Get the menu name */
230 result
->menuName
= 0;
234 result
->menuName
= (LPCSTR
)(UINT
)GET_WORD( p
+ 1 );
236 TRACE(" MENU %04x\n", LOWORD(result
->menuName
) );
239 result
->menuName
= p
;
240 TRACE(" MENU '%s'\n", p
);
245 /* Get the class name */
249 result
->className
= p
;
250 TRACE(" CLASS '%s'\n", result
->className
);
252 else result
->className
= DIALOG_CLASS_ATOMA
;
255 /* Get the window caption */
259 TRACE(" CAPTION '%s'\n", result
->caption
);
261 /* Get the font name */
263 if (result
->style
& DS_SETFONT
)
265 result
->pointSize
= GET_WORD(p
);
267 result
->faceName
= p
;
269 TRACE(" FONT %d,'%s'\n", result
->pointSize
, result
->faceName
);
275 /***********************************************************************
276 * DIALOG_CreateIndirect16
278 * Creates a dialog box window
280 * modal = TRUE if we are called from a modal dialog box.
281 * (it's more compatible to do it here, as under Windows the owner
282 * is never disabled if the dialog fails because of an invalid template)
284 static HWND
DIALOG_CreateIndirect16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
285 HWND owner
, DLGPROC16 dlgProc
, LPARAM param
,
291 DLG_TEMPLATE
template;
292 DIALOGINFO
* dlgInfo
;
293 BOOL ownerEnabled
= TRUE
;
295 DWORD units
= GetDialogBaseUnits();
297 /* Parse dialog template */
299 dlgTemplate
= DIALOG_ParseTemplate16( dlgTemplate
, &template );
301 /* Initialise dialog extra data */
303 if (!(dlgInfo
= HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo
) ))) return 0;
304 dlgInfo
->hwndFocus
= 0;
305 dlgInfo
->hUserFont
= 0;
307 dlgInfo
->xBaseUnit
= LOWORD(units
);
308 dlgInfo
->yBaseUnit
= HIWORD(units
);
309 dlgInfo
->idResult
= 0;
311 dlgInfo
->hDialogHeap
= 0;
315 if (template.menuName
)
317 dlgInfo
->hMenu
= HMENU_32(LoadMenu16( hInst
, template.menuName
));
320 /* Create custom font if needed */
322 if (template.style
& DS_SETFONT
)
324 /* We convert the size to pixels and then make it -ve. This works
325 * for both +ve and -ve template.pointSize */
329 pixels
= MulDiv(template.pointSize
, GetDeviceCaps(dc
, LOGPIXELSY
), 72);
330 dlgInfo
->hUserFont
= CreateFontA( -pixels
, 0, 0, 0, FW_DONTCARE
,
331 FALSE
, FALSE
, FALSE
, DEFAULT_CHARSET
, 0, 0,
332 PROOF_QUALITY
, FF_DONTCARE
, template.faceName
);
333 if (dlgInfo
->hUserFont
)
336 if (DIALOG_GetCharSize( dc
, dlgInfo
->hUserFont
, &charSize
))
338 dlgInfo
->xBaseUnit
= charSize
.cx
;
339 dlgInfo
->yBaseUnit
= charSize
.cy
;
343 TRACE("units = %d,%d\n", dlgInfo
->xBaseUnit
, dlgInfo
->yBaseUnit
);
346 /* Create dialog main window */
348 rect
.left
= rect
.top
= 0;
349 rect
.right
= MulDiv(template.cx
, dlgInfo
->xBaseUnit
, 4);
350 rect
.bottom
= MulDiv(template.cy
, dlgInfo
->yBaseUnit
, 8);
351 if (template.style
& DS_MODALFRAME
) exStyle
|= WS_EX_DLGMODALFRAME
;
352 AdjustWindowRectEx( &rect
, template.style
, (dlgInfo
->hMenu
!= 0), exStyle
);
353 rect
.right
-= rect
.left
;
354 rect
.bottom
-= rect
.top
;
356 if (template.x
== CW_USEDEFAULT16
)
358 rect
.left
= rect
.top
= CW_USEDEFAULT16
;
362 if (template.style
& DS_CENTER
)
364 rect
.left
= (GetSystemMetrics(SM_CXSCREEN
) - rect
.right
) / 2;
365 rect
.top
= (GetSystemMetrics(SM_CYSCREEN
) - rect
.bottom
) / 2;
369 rect
.left
+= MulDiv(template.x
, dlgInfo
->xBaseUnit
, 4);
370 rect
.top
+= MulDiv(template.y
, dlgInfo
->yBaseUnit
, 8);
372 if ( !(template.style
& WS_CHILD
) )
376 if( !(template.style
& DS_ABSALIGN
) )
377 ClientToScreen( owner
, (POINT
*)&rect
);
379 /* try to fit it into the desktop */
381 if( (dX
= rect
.left
+ rect
.right
+ GetSystemMetrics(SM_CXDLGFRAME
)
382 - GetSystemMetrics(SM_CXSCREEN
)) > 0 ) rect
.left
-= dX
;
383 if( (dY
= rect
.top
+ rect
.bottom
+ GetSystemMetrics(SM_CYDLGFRAME
)
384 - GetSystemMetrics(SM_CYSCREEN
)) > 0 ) rect
.top
-= dY
;
385 if( rect
.left
< 0 ) rect
.left
= 0;
386 if( rect
.top
< 0 ) rect
.top
= 0;
392 ownerEnabled
= DIALOG_DisableOwner( owner
);
393 if (ownerEnabled
) dlgInfo
->flags
|= DF_OWNERENABLED
;
396 hwnd
= WIN_Handle32( CreateWindowEx16(exStyle
, template.className
,
397 template.caption
, template.style
& ~WS_VISIBLE
,
398 rect
.left
, rect
.top
, rect
.right
, rect
.bottom
,
399 HWND_16(owner
), HMENU_16(dlgInfo
->hMenu
),
403 if (dlgInfo
->hUserFont
) DeleteObject( dlgInfo
->hUserFont
);
404 if (dlgInfo
->hMenu
) DestroyMenu( dlgInfo
->hMenu
);
405 if (modal
&& (dlgInfo
->flags
& DF_OWNERENABLED
)) DIALOG_EnableOwner(owner
);
406 HeapFree( GetProcessHeap(), 0, dlgInfo
);
409 wndPtr
= WIN_GetPtr( hwnd
);
410 wndPtr
->flags
|= WIN_ISDIALOG
;
411 WIN_ReleasePtr( wndPtr
);
413 SetWindowLongW( hwnd
, DWL_WINE_DIALOGINFO
, (LONG
)dlgInfo
);
414 SetWindowLong16( HWND_16(hwnd
), DWL_DLGPROC
, (LONG
)dlgProc
);
416 if (dlgInfo
->hUserFont
)
417 SendMessageA( hwnd
, WM_SETFONT
, (WPARAM
)dlgInfo
->hUserFont
, 0 );
419 /* Create controls */
421 if (DIALOG_CreateControls16( hwnd
, dlgTemplate
, &template, hInst
))
423 HWND hwndPreInitFocus
;
425 /* Send initialisation messages and set focus */
427 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
429 hwndPreInitFocus
= GetFocus();
430 if (SendMessageA( hwnd
, WM_INITDIALOG
, (WPARAM
)dlgInfo
->hwndFocus
, param
))
432 /* check where the focus is again,
433 * some controls status might have changed in WM_INITDIALOG */
434 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
435 if( dlgInfo
->hwndFocus
)
436 SetFocus( dlgInfo
->hwndFocus
);
440 /* If the dlgproc has returned FALSE (indicating handling of keyboard focus)
441 but the focus has not changed, set the focus where we expect it. */
442 if ((GetFocus() == hwndPreInitFocus
) &&
443 (GetWindowLongW( hwnd
, GWL_STYLE
) & WS_VISIBLE
))
445 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
446 if( dlgInfo
->hwndFocus
)
447 SetFocus( dlgInfo
->hwndFocus
);
451 if (template.style
& WS_VISIBLE
&& !(GetWindowLongW( hwnd
, GWL_STYLE
) & WS_VISIBLE
))
453 ShowWindow( hwnd
, SW_SHOWNORMAL
); /* SW_SHOW doesn't always work */
457 if( IsWindow(hwnd
) ) DestroyWindow( hwnd
);
458 if (modal
&& ownerEnabled
) DIALOG_EnableOwner(owner
);
463 /***********************************************************************
464 * DialogBox (USER.87)
466 INT16 WINAPI
DialogBox16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
467 HWND16 owner
, DLGPROC16 dlgProc
)
469 return DialogBoxParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
473 /**************************************************************************
474 * EndDialog (USER.88)
476 BOOL16 WINAPI
EndDialog16( HWND16 hwnd
, INT16 retval
)
478 return EndDialog( WIN_Handle32(hwnd
), retval
);
482 /***********************************************************************
483 * CreateDialog (USER.89)
485 HWND16 WINAPI
CreateDialog16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
486 HWND16 owner
, DLGPROC16 dlgProc
)
488 return CreateDialogParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
492 /**************************************************************************
493 * GetDlgItem (USER.91)
495 HWND16 WINAPI
GetDlgItem16( HWND16 hwndDlg
, INT16 id
)
497 return HWND_16( GetDlgItem( WIN_Handle32(hwndDlg
), (UINT16
) id
));
501 /**************************************************************************
502 * SetDlgItemText (USER.92)
504 void WINAPI
SetDlgItemText16( HWND16 hwnd
, INT16 id
, SEGPTR lpString
)
506 SendDlgItemMessage16( hwnd
, id
, WM_SETTEXT
, 0, (LPARAM
)lpString
);
510 /**************************************************************************
511 * GetDlgItemText (USER.93)
513 INT16 WINAPI
GetDlgItemText16( HWND16 hwnd
, INT16 id
, SEGPTR str
, UINT16 len
)
515 return (INT16
)SendDlgItemMessage16( hwnd
, id
, WM_GETTEXT
, len
, (LPARAM
)str
);
519 /**************************************************************************
520 * SetDlgItemInt (USER.94)
522 void WINAPI
SetDlgItemInt16( HWND16 hwnd
, INT16 id
, UINT16 value
, BOOL16 fSigned
)
524 SetDlgItemInt( WIN_Handle32(hwnd
), (UINT
)(UINT16
)id
,
525 (UINT
)(fSigned
? (INT16
) value
: (UINT16
) value
), fSigned
);
529 /**************************************************************************
530 * GetDlgItemInt (USER.95)
532 UINT16 WINAPI
GetDlgItemInt16( HWND16 hwnd
, INT16 id
, BOOL16
*translated
, BOOL16 fSigned
)
537 if (translated
) *translated
= FALSE
;
538 result
= GetDlgItemInt( WIN_Handle32(hwnd
), (UINT
)(UINT16
)id
, &ok
, fSigned
);
542 if (((INT
)result
< -32767) || ((INT
)result
> 32767)) return 0;
546 if (result
> 65535) return 0;
548 if (translated
) *translated
= TRUE
;
549 return (UINT16
)result
;
553 /**************************************************************************
554 * CheckRadioButton (USER.96)
556 BOOL16 WINAPI
CheckRadioButton16( HWND16 hwndDlg
, UINT16 firstID
,
557 UINT16 lastID
, UINT16 checkID
)
559 return CheckRadioButton( WIN_Handle32(hwndDlg
), firstID
, lastID
, checkID
);
563 /**************************************************************************
564 * CheckDlgButton (USER.97)
566 BOOL16 WINAPI
CheckDlgButton16( HWND16 hwnd
, INT16 id
, UINT16 check
)
568 SendDlgItemMessage16( hwnd
, id
, BM_SETCHECK16
, check
, 0 );
573 /**************************************************************************
574 * IsDlgButtonChecked (USER.98)
576 UINT16 WINAPI
IsDlgButtonChecked16( HWND16 hwnd
, UINT16 id
)
578 return (UINT16
)SendDlgItemMessage16( hwnd
, id
, BM_GETCHECK16
, 0, 0 );
582 /**************************************************************************
583 * DlgDirSelect (USER.99)
585 BOOL16 WINAPI
DlgDirSelect16( HWND16 hwnd
, LPSTR str
, INT16 id
)
587 return DlgDirSelectEx16( hwnd
, str
, 128, id
);
591 /**************************************************************************
592 * DlgDirList (USER.100)
594 INT16 WINAPI
DlgDirList16( HWND16 hDlg
, LPSTR spec
, INT16 idLBox
,
595 INT16 idStatic
, UINT16 attrib
)
597 /* according to Win16 docs, DDL_DRIVES should make DDL_EXCLUSIVE
598 * be set automatically (this is different in Win32, and
599 * DIALOG_DlgDirList sends Win32 messages to the control,
601 if (attrib
& DDL_DRIVES
) attrib
|= DDL_EXCLUSIVE
;
602 return DlgDirListA( WIN_Handle32(hDlg
), spec
, idLBox
, idStatic
, attrib
);
606 /**************************************************************************
607 * SendDlgItemMessage (USER.101)
609 LRESULT WINAPI
SendDlgItemMessage16( HWND16 hwnd
, INT16 id
, UINT16 msg
,
610 WPARAM16 wParam
, LPARAM lParam
)
612 HWND16 hwndCtrl
= GetDlgItem16( hwnd
, id
);
613 if (hwndCtrl
) return SendMessage16( hwndCtrl
, msg
, wParam
, lParam
);
618 /**************************************************************************
619 * MapDialogRect (USER.103)
621 void WINAPI
MapDialogRect16( HWND16 hwnd
, LPRECT16 rect
)
624 MapDialogRect( WIN_Handle32(hwnd
), &rect32
);
625 rect
->left
= rect32
.left
;
626 rect
->right
= rect32
.right
;
627 rect
->top
= rect32
.top
;
628 rect
->bottom
= rect32
.bottom
;
632 /**************************************************************************
633 * DlgDirSelectComboBox (USER.194)
635 BOOL16 WINAPI
DlgDirSelectComboBox16( HWND16 hwnd
, LPSTR str
, INT16 id
)
637 return DlgDirSelectComboBoxEx16( hwnd
, str
, 128, id
);
641 /**************************************************************************
642 * DlgDirListComboBox (USER.195)
644 INT16 WINAPI
DlgDirListComboBox16( HWND16 hDlg
, LPSTR spec
, INT16 idCBox
,
645 INT16 idStatic
, UINT16 attrib
)
647 return DlgDirListComboBoxA( WIN_Handle32(hDlg
), spec
, idCBox
, idStatic
, attrib
);
651 /***********************************************************************
652 * DialogBoxIndirect (USER.218)
654 INT16 WINAPI
DialogBoxIndirect16( HINSTANCE16 hInst
, HANDLE16 dlgTemplate
,
655 HWND16 owner
, DLGPROC16 dlgProc
)
657 return DialogBoxIndirectParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
661 /***********************************************************************
662 * CreateDialogIndirect (USER.219)
664 HWND16 WINAPI
CreateDialogIndirect16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
665 HWND16 owner
, DLGPROC16 dlgProc
)
667 return CreateDialogIndirectParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0);
671 /**************************************************************************
672 * GetNextDlgGroupItem (USER.227)
674 HWND16 WINAPI
GetNextDlgGroupItem16( HWND16 hwndDlg
, HWND16 hwndCtrl
,
677 return HWND_16( GetNextDlgGroupItem( WIN_Handle32(hwndDlg
), WIN_Handle32(hwndCtrl
), fPrevious
));
681 /**************************************************************************
682 * GetNextDlgTabItem (USER.228)
684 HWND16 WINAPI
GetNextDlgTabItem16( HWND16 hwndDlg
, HWND16 hwndCtrl
,
687 return HWND_16( GetNextDlgTabItem( WIN_Handle32(hwndDlg
), WIN_Handle32(hwndCtrl
), fPrevious
));
691 /***********************************************************************
692 * DialogBoxParam (USER.239)
694 INT16 WINAPI
DialogBoxParam16( HINSTANCE16 hInst
, LPCSTR
template,
695 HWND16 owner16
, DLGPROC16 dlgProc
, LPARAM param
)
703 if (!(hRsrc
= FindResource16( hInst
, template, (LPSTR
)RT_DIALOG
))) return 0;
704 if (!(hmem
= LoadResource16( hInst
, hRsrc
))) return 0;
705 if ((data
= LockResource16( hmem
)))
707 HWND owner
= WIN_Handle32(owner16
);
708 hwnd
= DIALOG_CreateIndirect16( hInst
, data
, owner
, dlgProc
, param
, TRUE
);
709 if (hwnd
) ret
= DIALOG_DoDialogBox( hwnd
, owner
);
710 GlobalUnlock16( hmem
);
712 FreeResource16( hmem
);
717 /***********************************************************************
718 * DialogBoxIndirectParam (USER.240)
720 INT16 WINAPI
DialogBoxIndirectParam16( HINSTANCE16 hInst
, HANDLE16 dlgTemplate
,
721 HWND16 owner16
, DLGPROC16 dlgProc
, LPARAM param
)
723 HWND hwnd
, owner
= WIN_Handle32( owner16
);
726 if (!(ptr
= GlobalLock16( dlgTemplate
))) return -1;
727 hwnd
= DIALOG_CreateIndirect16( hInst
, ptr
, owner
, dlgProc
, param
, TRUE
);
728 GlobalUnlock16( dlgTemplate
);
729 if (hwnd
) return DIALOG_DoDialogBox( hwnd
, owner
);
734 /***********************************************************************
735 * CreateDialogParam (USER.241)
737 HWND16 WINAPI
CreateDialogParam16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
738 HWND16 owner
, DLGPROC16 dlgProc
, LPARAM param
)
745 TRACE("%04x,%s,%04x,%08lx,%ld\n",
746 hInst
, debugstr_a(dlgTemplate
), owner
, (DWORD
)dlgProc
, param
);
748 if (!(hRsrc
= FindResource16( hInst
, dlgTemplate
, (LPSTR
)RT_DIALOG
))) return 0;
749 if (!(hmem
= LoadResource16( hInst
, hRsrc
))) return 0;
750 if (!(data
= LockResource16( hmem
))) hwnd
= 0;
751 else hwnd
= CreateDialogIndirectParam16( hInst
, data
, owner
, dlgProc
, param
);
752 FreeResource16( hmem
);
757 /***********************************************************************
758 * CreateDialogIndirectParam (USER.242)
760 HWND16 WINAPI
CreateDialogIndirectParam16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
761 HWND16 owner
, DLGPROC16 dlgProc
, LPARAM param
)
763 if (!dlgTemplate
) return 0;
764 return HWND_16( DIALOG_CreateIndirect16( hInst
, dlgTemplate
, WIN_Handle32(owner
),
765 dlgProc
, param
, FALSE
));
769 /**************************************************************************
770 * DlgDirSelectEx (USER.422)
772 BOOL16 WINAPI
DlgDirSelectEx16( HWND16 hwnd
, LPSTR str
, INT16 len
, INT16 id
)
774 return DlgDirSelectExA( WIN_Handle32(hwnd
), str
, len
, id
);
778 /**************************************************************************
779 * DlgDirSelectComboBoxEx (USER.423)
781 BOOL16 WINAPI
DlgDirSelectComboBoxEx16( HWND16 hwnd
, LPSTR str
, INT16 len
,
784 return DlgDirSelectComboBoxExA( WIN_Handle32(hwnd
), str
, len
, id
);