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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/port.h"
29 #include "wine/winuser16.h"
32 #include "user_private.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
= MAKEINTRESOURCEA(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, %08x, %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
, TRUE
);
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
= GetWindowLongPtrA( hwndCtrl
, GWLP_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 %08x\n", result
->style
);
225 /* Get the menu name */
230 result
->menuName
= 0;
234 result
->menuName
= MAKEINTRESOURCEA(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
= (LPCSTR
)DIALOG_CLASS_ATOM
;
255 /* Get the window caption */
259 TRACE(" CAPTION '%s'\n", result
->caption
);
261 /* Get the font name */
263 result
->pointSize
= 0;
264 result
->faceName
= NULL
;
266 if (result
->style
& DS_SETFONT
)
268 result
->pointSize
= GET_WORD(p
);
270 result
->faceName
= p
;
272 TRACE(" FONT %d,'%s'\n", result
->pointSize
, result
->faceName
);
278 /***********************************************************************
279 * DIALOG_CreateIndirect16
281 * Creates a dialog box window
283 * modal = TRUE if we are called from a modal dialog box.
284 * (it's more compatible to do it here, as under Windows the owner
285 * is never disabled if the dialog fails because of an invalid template)
287 static HWND
DIALOG_CreateIndirect16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
288 HWND owner
, DLGPROC16 dlgProc
, LPARAM param
,
296 DLG_TEMPLATE
template;
297 DIALOGINFO
* dlgInfo
;
298 BOOL ownerEnabled
= TRUE
;
300 DWORD units
= GetDialogBaseUnits();
302 /* Parse dialog template */
304 dlgTemplate
= DIALOG_ParseTemplate16( dlgTemplate
, &template );
306 /* Initialise dialog extra data */
308 if (!(dlgInfo
= HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo
) ))) return 0;
309 dlgInfo
->hwndFocus
= 0;
310 dlgInfo
->hUserFont
= 0;
312 dlgInfo
->xBaseUnit
= LOWORD(units
);
313 dlgInfo
->yBaseUnit
= HIWORD(units
);
314 dlgInfo
->idResult
= 0;
316 dlgInfo
->hDialogHeap
= 0;
320 if (template.menuName
)
322 dlgInfo
->hMenu
= HMENU_32(LoadMenu16( hInst
, template.menuName
));
325 /* Create custom font if needed */
327 if (template.style
& DS_SETFONT
)
329 /* We convert the size to pixels and then make it -ve. This works
330 * for both +ve and -ve template.pointSize */
334 pixels
= MulDiv(template.pointSize
, GetDeviceCaps(dc
, LOGPIXELSY
), 72);
335 dlgInfo
->hUserFont
= CreateFontA( -pixels
, 0, 0, 0, FW_DONTCARE
,
336 FALSE
, FALSE
, FALSE
, DEFAULT_CHARSET
, 0, 0,
337 PROOF_QUALITY
, FF_DONTCARE
, template.faceName
);
338 if (dlgInfo
->hUserFont
)
341 HFONT hOldFont
= SelectObject( dc
, dlgInfo
->hUserFont
);
342 charSize
.cx
= GdiGetCharDimensions( dc
, NULL
, &charSize
.cy
);
345 dlgInfo
->xBaseUnit
= charSize
.cx
;
346 dlgInfo
->yBaseUnit
= charSize
.cy
;
348 SelectObject( dc
, hOldFont
);
351 TRACE("units = %d,%d\n", dlgInfo
->xBaseUnit
, dlgInfo
->yBaseUnit
);
354 /* Create dialog main window */
356 rect
.left
= rect
.top
= 0;
357 rect
.right
= MulDiv(template.cx
, dlgInfo
->xBaseUnit
, 4);
358 rect
.bottom
= MulDiv(template.cy
, dlgInfo
->yBaseUnit
, 8);
359 if (template.style
& DS_MODALFRAME
) exStyle
|= WS_EX_DLGMODALFRAME
;
360 AdjustWindowRectEx( &rect
, template.style
, (dlgInfo
->hMenu
!= 0), exStyle
);
363 size
.cx
= rect
.right
- rect
.left
;
364 size
.cy
= rect
.bottom
- rect
.top
;
366 if (template.x
== CW_USEDEFAULT16
)
368 pos
.x
= pos
.y
= CW_USEDEFAULT16
;
372 HMONITOR monitor
= 0;
373 MONITORINFO mon_info
;
375 mon_info
.cbSize
= sizeof(mon_info
);
376 if (template.style
& DS_CENTER
)
378 monitor
= MonitorFromWindow( owner
? owner
: GetActiveWindow(), MONITOR_DEFAULTTOPRIMARY
);
379 GetMonitorInfoW( monitor
, &mon_info
);
380 pos
.x
= (mon_info
.rcWork
.left
+ mon_info
.rcWork
.right
- size
.cx
) / 2;
381 pos
.y
= (mon_info
.rcWork
.top
+ mon_info
.rcWork
.bottom
- size
.cy
) / 2;
383 else if (template.style
& DS_CENTERMOUSE
)
385 GetCursorPos( &pos
);
386 monitor
= MonitorFromPoint( pos
, MONITOR_DEFAULTTOPRIMARY
);
387 GetMonitorInfoW( monitor
, &mon_info
);
391 pos
.x
+= MulDiv(template.x
, dlgInfo
->xBaseUnit
, 4);
392 pos
.y
+= MulDiv(template.y
, dlgInfo
->yBaseUnit
, 8);
393 if (!(template.style
& (WS_CHILD
|DS_ABSALIGN
))) ClientToScreen( owner
, &pos
);
395 if ( !(template.style
& WS_CHILD
) )
399 /* try to fit it into the desktop */
403 SetRect( &rect
, pos
.x
, pos
.y
, pos
.x
+ size
.cx
, pos
.y
+ size
.cy
);
404 monitor
= MonitorFromRect( &rect
, MONITOR_DEFAULTTOPRIMARY
);
405 GetMonitorInfoW( monitor
, &mon_info
);
407 if ((dX
= pos
.x
+ size
.cx
+ GetSystemMetrics(SM_CXDLGFRAME
) - mon_info
.rcWork
.right
) > 0)
409 if ((dY
= pos
.y
+ size
.cy
+ GetSystemMetrics(SM_CYDLGFRAME
) - mon_info
.rcWork
.bottom
) > 0)
411 if( pos
.x
< mon_info
.rcWork
.left
) pos
.x
= mon_info
.rcWork
.left
;
412 if( pos
.y
< mon_info
.rcWork
.top
) pos
.y
= mon_info
.rcWork
.top
;
418 ownerEnabled
= DIALOG_DisableOwner( owner
);
419 if (ownerEnabled
) dlgInfo
->flags
|= DF_OWNERENABLED
;
422 hwnd
= WIN_Handle32( CreateWindowEx16(exStyle
, template.className
,
423 template.caption
, template.style
& ~WS_VISIBLE
,
424 pos
.x
, pos
.y
, size
.cx
, size
.cy
,
425 HWND_16(owner
), HMENU_16(dlgInfo
->hMenu
),
429 if (dlgInfo
->hUserFont
) DeleteObject( dlgInfo
->hUserFont
);
430 if (dlgInfo
->hMenu
) DestroyMenu( dlgInfo
->hMenu
);
431 if (modal
&& (dlgInfo
->flags
& DF_OWNERENABLED
)) DIALOG_EnableOwner(owner
);
432 HeapFree( GetProcessHeap(), 0, dlgInfo
);
435 wndPtr
= WIN_GetPtr( hwnd
);
436 wndPtr
->flags
|= WIN_ISDIALOG
;
437 WIN_ReleasePtr( wndPtr
);
439 SetWindowLongPtrW( hwnd
, DWLP_WINE_DIALOGINFO
, (LONG_PTR
)dlgInfo
);
440 SetWindowLong16( HWND_16(hwnd
), DWLP_DLGPROC
, (LONG
)dlgProc
);
442 if (dlgInfo
->hUserFont
)
443 SendMessageA( hwnd
, WM_SETFONT
, (WPARAM
)dlgInfo
->hUserFont
, 0 );
445 /* Create controls */
447 if (DIALOG_CreateControls16( hwnd
, dlgTemplate
, &template, hInst
))
449 HWND hwndPreInitFocus
;
451 /* Send initialisation messages and set focus */
453 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
455 hwndPreInitFocus
= GetFocus();
456 if (SendMessageA( hwnd
, WM_INITDIALOG
, (WPARAM
)dlgInfo
->hwndFocus
, param
))
458 /* check where the focus is again,
459 * some controls status might have changed in WM_INITDIALOG */
460 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
461 if( dlgInfo
->hwndFocus
)
462 SetFocus( dlgInfo
->hwndFocus
);
466 /* If the dlgproc has returned FALSE (indicating handling of keyboard focus)
467 but the focus has not changed, set the focus where we expect it. */
468 if ((GetFocus() == hwndPreInitFocus
) &&
469 (GetWindowLongW( hwnd
, GWL_STYLE
) & WS_VISIBLE
))
471 dlgInfo
->hwndFocus
= GetNextDlgTabItem( hwnd
, 0, FALSE
);
472 if( dlgInfo
->hwndFocus
)
473 SetFocus( dlgInfo
->hwndFocus
);
477 if (template.style
& WS_VISIBLE
&& !(GetWindowLongW( hwnd
, GWL_STYLE
) & WS_VISIBLE
))
479 ShowWindow( hwnd
, SW_SHOWNORMAL
); /* SW_SHOW doesn't always work */
483 if( IsWindow(hwnd
) ) DestroyWindow( hwnd
);
484 if (modal
&& ownerEnabled
) DIALOG_EnableOwner(owner
);
489 /***********************************************************************
490 * DialogBox (USER.87)
492 INT16 WINAPI
DialogBox16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
493 HWND16 owner
, DLGPROC16 dlgProc
)
495 return DialogBoxParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
499 /**************************************************************************
500 * EndDialog (USER.88)
502 BOOL16 WINAPI
EndDialog16( HWND16 hwnd
, INT16 retval
)
504 return EndDialog( WIN_Handle32(hwnd
), retval
);
508 /***********************************************************************
509 * CreateDialog (USER.89)
511 HWND16 WINAPI
CreateDialog16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
512 HWND16 owner
, DLGPROC16 dlgProc
)
514 return CreateDialogParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
518 /**************************************************************************
519 * GetDlgItem (USER.91)
521 HWND16 WINAPI
GetDlgItem16( HWND16 hwndDlg
, INT16 id
)
523 return HWND_16( GetDlgItem( WIN_Handle32(hwndDlg
), (UINT16
) id
));
527 /**************************************************************************
528 * SetDlgItemText (USER.92)
530 void WINAPI
SetDlgItemText16( HWND16 hwnd
, INT16 id
, SEGPTR lpString
)
532 SendDlgItemMessage16( hwnd
, id
, WM_SETTEXT
, 0, (LPARAM
)lpString
);
536 /**************************************************************************
537 * GetDlgItemText (USER.93)
539 INT16 WINAPI
GetDlgItemText16( HWND16 hwnd
, INT16 id
, SEGPTR str
, UINT16 len
)
541 return (INT16
)SendDlgItemMessage16( hwnd
, id
, WM_GETTEXT
, len
, (LPARAM
)str
);
545 /**************************************************************************
546 * SetDlgItemInt (USER.94)
548 void WINAPI
SetDlgItemInt16( HWND16 hwnd
, INT16 id
, UINT16 value
, BOOL16 fSigned
)
550 SetDlgItemInt( WIN_Handle32(hwnd
), (UINT
)(UINT16
)id
,
551 (UINT
)(fSigned
? (INT16
) value
: value
), fSigned
);
555 /**************************************************************************
556 * GetDlgItemInt (USER.95)
558 UINT16 WINAPI
GetDlgItemInt16( HWND16 hwnd
, INT16 id
, BOOL16
*translated
, BOOL16 fSigned
)
563 if (translated
) *translated
= FALSE
;
564 result
= GetDlgItemInt( WIN_Handle32(hwnd
), (UINT
)(UINT16
)id
, &ok
, fSigned
);
568 if (((INT
)result
< -32767) || ((INT
)result
> 32767)) return 0;
572 if (result
> 65535) return 0;
574 if (translated
) *translated
= TRUE
;
575 return (UINT16
)result
;
579 /**************************************************************************
580 * CheckRadioButton (USER.96)
582 BOOL16 WINAPI
CheckRadioButton16( HWND16 hwndDlg
, UINT16 firstID
,
583 UINT16 lastID
, UINT16 checkID
)
585 return CheckRadioButton( WIN_Handle32(hwndDlg
), firstID
, lastID
, checkID
);
589 /**************************************************************************
590 * CheckDlgButton (USER.97)
592 BOOL16 WINAPI
CheckDlgButton16( HWND16 hwnd
, INT16 id
, UINT16 check
)
594 SendDlgItemMessage16( hwnd
, id
, BM_SETCHECK16
, check
, 0 );
599 /**************************************************************************
600 * IsDlgButtonChecked (USER.98)
602 UINT16 WINAPI
IsDlgButtonChecked16( HWND16 hwnd
, UINT16 id
)
604 return (UINT16
)SendDlgItemMessage16( hwnd
, id
, BM_GETCHECK16
, 0, 0 );
608 /**************************************************************************
609 * DlgDirSelect (USER.99)
611 BOOL16 WINAPI
DlgDirSelect16( HWND16 hwnd
, LPSTR str
, INT16 id
)
613 return DlgDirSelectEx16( hwnd
, str
, 128, id
);
617 /**************************************************************************
618 * DlgDirList (USER.100)
620 INT16 WINAPI
DlgDirList16( HWND16 hDlg
, LPSTR spec
, INT16 idLBox
,
621 INT16 idStatic
, UINT16 attrib
)
623 /* according to Win16 docs, DDL_DRIVES should make DDL_EXCLUSIVE
624 * be set automatically (this is different in Win32, and
625 * DIALOG_DlgDirList sends Win32 messages to the control,
627 if (attrib
& DDL_DRIVES
) attrib
|= DDL_EXCLUSIVE
;
628 return DlgDirListA( WIN_Handle32(hDlg
), spec
, idLBox
, idStatic
, attrib
);
632 /**************************************************************************
633 * SendDlgItemMessage (USER.101)
635 LRESULT WINAPI
SendDlgItemMessage16( HWND16 hwnd
, INT16 id
, UINT16 msg
,
636 WPARAM16 wParam
, LPARAM lParam
)
638 HWND16 hwndCtrl
= GetDlgItem16( hwnd
, id
);
639 if (hwndCtrl
) return SendMessage16( hwndCtrl
, msg
, wParam
, lParam
);
644 /**************************************************************************
645 * MapDialogRect (USER.103)
647 void WINAPI
MapDialogRect16( HWND16 hwnd
, LPRECT16 rect
)
650 MapDialogRect( WIN_Handle32(hwnd
), &rect32
);
651 rect
->left
= rect32
.left
;
652 rect
->right
= rect32
.right
;
653 rect
->top
= rect32
.top
;
654 rect
->bottom
= rect32
.bottom
;
658 /**************************************************************************
659 * DlgDirSelectComboBox (USER.194)
661 BOOL16 WINAPI
DlgDirSelectComboBox16( HWND16 hwnd
, LPSTR str
, INT16 id
)
663 return DlgDirSelectComboBoxEx16( hwnd
, str
, 128, id
);
667 /**************************************************************************
668 * DlgDirListComboBox (USER.195)
670 INT16 WINAPI
DlgDirListComboBox16( HWND16 hDlg
, LPSTR spec
, INT16 idCBox
,
671 INT16 idStatic
, UINT16 attrib
)
673 return DlgDirListComboBoxA( WIN_Handle32(hDlg
), spec
, idCBox
, idStatic
, attrib
);
677 /***********************************************************************
678 * DialogBoxIndirect (USER.218)
680 INT16 WINAPI
DialogBoxIndirect16( HINSTANCE16 hInst
, HANDLE16 dlgTemplate
,
681 HWND16 owner
, DLGPROC16 dlgProc
)
683 return DialogBoxIndirectParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0 );
687 /***********************************************************************
688 * CreateDialogIndirect (USER.219)
690 HWND16 WINAPI
CreateDialogIndirect16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
691 HWND16 owner
, DLGPROC16 dlgProc
)
693 return CreateDialogIndirectParam16( hInst
, dlgTemplate
, owner
, dlgProc
, 0);
697 /**************************************************************************
698 * GetNextDlgGroupItem (USER.227)
700 HWND16 WINAPI
GetNextDlgGroupItem16( HWND16 hwndDlg
, HWND16 hwndCtrl
,
703 return HWND_16( GetNextDlgGroupItem( WIN_Handle32(hwndDlg
), WIN_Handle32(hwndCtrl
), fPrevious
));
707 /**************************************************************************
708 * GetNextDlgTabItem (USER.228)
710 HWND16 WINAPI
GetNextDlgTabItem16( HWND16 hwndDlg
, HWND16 hwndCtrl
,
713 return HWND_16( GetNextDlgTabItem( WIN_Handle32(hwndDlg
), WIN_Handle32(hwndCtrl
), fPrevious
));
717 /***********************************************************************
718 * DialogBoxParam (USER.239)
720 INT16 WINAPI
DialogBoxParam16( HINSTANCE16 hInst
, LPCSTR
template,
721 HWND16 owner16
, DLGPROC16 dlgProc
, LPARAM param
)
729 if (!(hRsrc
= FindResource16( hInst
, template, (LPSTR
)RT_DIALOG
))) return 0;
730 if (!(hmem
= LoadResource16( hInst
, hRsrc
))) return 0;
731 if ((data
= LockResource16( hmem
)))
733 HWND owner
= WIN_Handle32(owner16
);
734 hwnd
= DIALOG_CreateIndirect16( hInst
, data
, owner
, dlgProc
, param
, TRUE
);
735 if (hwnd
) ret
= DIALOG_DoDialogBox( hwnd
, owner
);
736 GlobalUnlock16( hmem
);
738 FreeResource16( hmem
);
743 /***********************************************************************
744 * DialogBoxIndirectParam (USER.240)
746 INT16 WINAPI
DialogBoxIndirectParam16( HINSTANCE16 hInst
, HANDLE16 dlgTemplate
,
747 HWND16 owner16
, DLGPROC16 dlgProc
, LPARAM param
)
749 HWND hwnd
, owner
= WIN_Handle32( owner16
);
752 if (!(ptr
= GlobalLock16( dlgTemplate
))) return -1;
753 hwnd
= DIALOG_CreateIndirect16( hInst
, ptr
, owner
, dlgProc
, param
, TRUE
);
754 GlobalUnlock16( dlgTemplate
);
755 if (hwnd
) return DIALOG_DoDialogBox( hwnd
, owner
);
760 /***********************************************************************
761 * CreateDialogParam (USER.241)
763 HWND16 WINAPI
CreateDialogParam16( HINSTANCE16 hInst
, LPCSTR dlgTemplate
,
764 HWND16 owner
, DLGPROC16 dlgProc
, LPARAM param
)
771 TRACE("%04x,%s,%04x,%08x,%ld\n",
772 hInst
, debugstr_a(dlgTemplate
), owner
, (DWORD
)dlgProc
, param
);
774 if (!(hRsrc
= FindResource16( hInst
, dlgTemplate
, (LPSTR
)RT_DIALOG
))) return 0;
775 if (!(hmem
= LoadResource16( hInst
, hRsrc
))) return 0;
776 if (!(data
= LockResource16( hmem
))) hwnd
= 0;
777 else hwnd
= CreateDialogIndirectParam16( hInst
, data
, owner
, dlgProc
, param
);
778 FreeResource16( hmem
);
783 /***********************************************************************
784 * CreateDialogIndirectParam (USER.242)
786 HWND16 WINAPI
CreateDialogIndirectParam16( HINSTANCE16 hInst
, LPCVOID dlgTemplate
,
787 HWND16 owner
, DLGPROC16 dlgProc
, LPARAM param
)
789 if (!dlgTemplate
) return 0;
790 return HWND_16( DIALOG_CreateIndirect16( hInst
, dlgTemplate
, WIN_Handle32(owner
),
791 dlgProc
, param
, FALSE
));
795 /**************************************************************************
796 * DlgDirSelectEx (USER.422)
798 BOOL16 WINAPI
DlgDirSelectEx16( HWND16 hwnd
, LPSTR str
, INT16 len
, INT16 id
)
800 return DlgDirSelectExA( WIN_Handle32(hwnd
), str
, len
, id
);
804 /**************************************************************************
805 * DlgDirSelectComboBoxEx (USER.423)
807 BOOL16 WINAPI
DlgDirSelectComboBoxEx16( HWND16 hwnd
, LPSTR str
, INT16 len
,
810 return DlgDirSelectComboBoxExA( WIN_Handle32(hwnd
), str
, len
, id
);