Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 1 | /* |
| 2 | * 16-bit dialog functions |
| 3 | * |
| 4 | * Copyright 1993, 1994, 1996, 2003 Alexandre Julliard |
| 5 | * |
| 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. |
| 10 | * |
| 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. |
| 15 | * |
| 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 |
| 19 | */ |
| 20 | |
| 21 | #include "config.h" |
| 22 | #include "wine/port.h" |
| 23 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 24 | #include <stdarg.h> |
| 25 | |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 26 | #include "windef.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 27 | #include "winbase.h" |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 28 | #include "wownt32.h" |
| 29 | #include "wine/winuser16.h" |
| 30 | #include "controls.h" |
| 31 | #include "win.h" |
| 32 | #include "user.h" |
| 33 | #include "wine/debug.h" |
| 34 | |
| 35 | WINE_DEFAULT_DEBUG_CHANNEL(dialog); |
| 36 | |
| 37 | /* Dialog control information */ |
| 38 | typedef struct |
| 39 | { |
| 40 | DWORD style; |
| 41 | INT16 x; |
| 42 | INT16 y; |
| 43 | INT16 cx; |
| 44 | INT16 cy; |
| 45 | UINT id; |
| 46 | LPCSTR className; |
| 47 | LPCSTR windowName; |
| 48 | LPCVOID data; |
| 49 | } DLG_CONTROL_INFO; |
| 50 | |
| 51 | /* Dialog template */ |
| 52 | typedef struct |
| 53 | { |
| 54 | DWORD style; |
| 55 | UINT16 nbItems; |
| 56 | INT16 x; |
| 57 | INT16 y; |
| 58 | INT16 cx; |
| 59 | INT16 cy; |
| 60 | LPCSTR menuName; |
| 61 | LPCSTR className; |
| 62 | LPCSTR caption; |
| 63 | WORD pointSize; |
| 64 | LPCSTR faceName; |
| 65 | } DLG_TEMPLATE; |
| 66 | |
| 67 | |
| 68 | /*********************************************************************** |
| 69 | * DIALOG_GetControl16 |
| 70 | * |
| 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. |
| 73 | */ |
| 74 | static LPCSTR DIALOG_GetControl16( LPCSTR p, DLG_CONTROL_INFO *info ) |
| 75 | { |
| 76 | static char buffer[10]; |
| 77 | int int_id; |
| 78 | |
| 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); |
| 85 | |
| 86 | if (*p & 0x80) |
| 87 | { |
| 88 | switch((BYTE)*p) |
| 89 | { |
| 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; |
| 97 | } |
| 98 | info->className = buffer; |
| 99 | p++; |
| 100 | } |
| 101 | else |
| 102 | { |
| 103 | info->className = p; |
| 104 | p += strlen(p) + 1; |
| 105 | } |
| 106 | |
| 107 | int_id = ((BYTE)*p == 0xff); |
| 108 | if (int_id) |
| 109 | { |
| 110 | /* Integer id, not documented (?). Only works for SS_ICON controls */ |
| 111 | info->windowName = (LPCSTR)(UINT)GET_WORD(p+1); |
| 112 | p += 3; |
| 113 | } |
| 114 | else |
| 115 | { |
| 116 | info->windowName = p; |
| 117 | p += strlen(p) + 1; |
| 118 | } |
| 119 | |
| 120 | if (*p) info->data = p + 1; |
| 121 | else info->data = NULL; |
| 122 | |
| 123 | p += *p + 1; |
| 124 | |
| 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 ); |
| 129 | |
| 130 | return p; |
| 131 | } |
| 132 | |
| 133 | |
| 134 | /*********************************************************************** |
| 135 | * DIALOG_CreateControls16 |
| 136 | * |
| 137 | * Create the control windows for a dialog. |
| 138 | */ |
| 139 | static BOOL DIALOG_CreateControls16( HWND hwnd, LPCSTR template, |
| 140 | const DLG_TEMPLATE *dlgTemplate, HINSTANCE16 hInst ) |
| 141 | { |
| 142 | DIALOGINFO *dlgInfo = DIALOG_get_info( hwnd ); |
| 143 | DLG_CONTROL_INFO info; |
| 144 | HWND hwndCtrl, hwndDefButton = 0; |
| 145 | INT items = dlgTemplate->nbItems; |
| 146 | |
| 147 | TRACE(" BEGIN\n" ); |
| 148 | while (items--) |
| 149 | { |
| 150 | HINSTANCE16 instance = hInst; |
| 151 | SEGPTR segptr; |
| 152 | |
| 153 | template = DIALOG_GetControl16( template, &info ); |
| 154 | if (HIWORD(info.className) && !strcmp( info.className, "EDIT") && |
| 155 | !(GetWindowLongW( hwnd, GWL_STYLE ) & DS_LOCALEDIT)) |
| 156 | { |
| 157 | if (!dlgInfo->hDialogHeap) |
| 158 | { |
| 159 | dlgInfo->hDialogHeap = GlobalAlloc16(GMEM_FIXED, 0x10000); |
| 160 | if (!dlgInfo->hDialogHeap) |
| 161 | { |
| 162 | ERR("Insufficient memory to create heap for edit control\n" ); |
| 163 | continue; |
| 164 | } |
| 165 | LocalInit16(dlgInfo->hDialogHeap, 0, 0xffff); |
| 166 | } |
| 167 | instance = dlgInfo->hDialogHeap; |
| 168 | } |
| 169 | |
| 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 )); |
| 180 | UnMapLS( segptr ); |
| 181 | |
Dmitry Timoshkov | 2548133 | 2003-05-11 02:42:28 +0000 | [diff] [blame] | 182 | if (!hwndCtrl) |
| 183 | { |
| 184 | if (dlgTemplate->style & DS_NOFAILCREATE) continue; |
| 185 | return FALSE; |
| 186 | } |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 187 | |
| 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) |
| 192 | { |
| 193 | /* If there's already a default push-button, set it back */ |
| 194 | /* to normal and use this one instead. */ |
| 195 | if (hwndDefButton) |
| 196 | SendMessageA( hwndDefButton, BM_SETSTYLE, |
| 197 | BS_PUSHBUTTON,FALSE ); |
| 198 | hwndDefButton = hwndCtrl; |
| 199 | dlgInfo->idResult = GetWindowLongA( hwndCtrl, GWL_ID ); |
| 200 | } |
| 201 | } |
| 202 | TRACE(" END\n" ); |
| 203 | return TRUE; |
| 204 | } |
| 205 | |
| 206 | |
| 207 | /*********************************************************************** |
| 208 | * DIALOG_ParseTemplate16 |
| 209 | * |
| 210 | * Fill a DLG_TEMPLATE structure from the dialog template, and return |
| 211 | * a pointer to the first control. |
| 212 | */ |
| 213 | static LPCSTR DIALOG_ParseTemplate16( LPCSTR p, DLG_TEMPLATE * result ) |
| 214 | { |
| 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); |
| 221 | |
| 222 | TRACE("DIALOG %d, %d, %d, %d\n", result->x, result->y, result->cx, result->cy ); |
| 223 | TRACE(" STYLE %08lx\n", result->style ); |
| 224 | |
| 225 | /* Get the menu name */ |
| 226 | |
| 227 | switch( (BYTE)*p ) |
| 228 | { |
| 229 | case 0: |
| 230 | result->menuName = 0; |
| 231 | p++; |
| 232 | break; |
| 233 | case 0xff: |
| 234 | result->menuName = (LPCSTR)(UINT)GET_WORD( p + 1 ); |
| 235 | p += 3; |
| 236 | TRACE(" MENU %04x\n", LOWORD(result->menuName) ); |
| 237 | break; |
| 238 | default: |
| 239 | result->menuName = p; |
| 240 | TRACE(" MENU '%s'\n", p ); |
| 241 | p += strlen(p) + 1; |
| 242 | break; |
| 243 | } |
| 244 | |
| 245 | /* Get the class name */ |
| 246 | |
| 247 | if (*p) |
| 248 | { |
| 249 | result->className = p; |
| 250 | TRACE(" CLASS '%s'\n", result->className ); |
| 251 | } |
| 252 | else result->className = DIALOG_CLASS_ATOMA; |
| 253 | p += strlen(p) + 1; |
| 254 | |
| 255 | /* Get the window caption */ |
| 256 | |
| 257 | result->caption = p; |
| 258 | p += strlen(p) + 1; |
| 259 | TRACE(" CAPTION '%s'\n", result->caption ); |
| 260 | |
| 261 | /* Get the font name */ |
| 262 | |
| 263 | if (result->style & DS_SETFONT) |
| 264 | { |
| 265 | result->pointSize = GET_WORD(p); |
| 266 | p += sizeof(WORD); |
| 267 | result->faceName = p; |
| 268 | p += strlen(p) + 1; |
| 269 | TRACE(" FONT %d,'%s'\n", result->pointSize, result->faceName ); |
| 270 | } |
| 271 | return p; |
| 272 | } |
| 273 | |
| 274 | |
| 275 | /*********************************************************************** |
| 276 | * DIALOG_CreateIndirect16 |
| 277 | * |
| 278 | * Creates a dialog box window |
| 279 | * |
| 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) |
| 283 | */ |
| 284 | static HWND DIALOG_CreateIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate, |
| 285 | HWND owner, DLGPROC16 dlgProc, LPARAM param, |
| 286 | BOOL modal ) |
| 287 | { |
| 288 | HWND hwnd; |
| 289 | RECT rect; |
| 290 | WND * wndPtr; |
| 291 | DLG_TEMPLATE template; |
| 292 | DIALOGINFO * dlgInfo; |
| 293 | BOOL ownerEnabled = TRUE; |
| 294 | DWORD exStyle = 0; |
| 295 | DWORD units = GetDialogBaseUnits(); |
| 296 | |
| 297 | /* Parse dialog template */ |
| 298 | |
| 299 | dlgTemplate = DIALOG_ParseTemplate16( dlgTemplate, &template ); |
| 300 | |
| 301 | /* Initialise dialog extra data */ |
| 302 | |
| 303 | if (!(dlgInfo = HeapAlloc( GetProcessHeap(), 0, sizeof(*dlgInfo) ))) return 0; |
| 304 | dlgInfo->hwndFocus = 0; |
| 305 | dlgInfo->hUserFont = 0; |
| 306 | dlgInfo->hMenu = 0; |
| 307 | dlgInfo->xBaseUnit = LOWORD(units); |
| 308 | dlgInfo->yBaseUnit = HIWORD(units); |
| 309 | dlgInfo->idResult = 0; |
| 310 | dlgInfo->flags = 0; |
| 311 | dlgInfo->hDialogHeap = 0; |
| 312 | |
| 313 | /* Load menu */ |
| 314 | |
| 315 | if (template.menuName) |
| 316 | { |
| 317 | dlgInfo->hMenu = HMENU_32(LoadMenu16( hInst, template.menuName )); |
| 318 | } |
| 319 | |
| 320 | /* Create custom font if needed */ |
| 321 | |
| 322 | if (template.style & DS_SETFONT) |
| 323 | { |
| 324 | /* We convert the size to pixels and then make it -ve. This works |
| 325 | * for both +ve and -ve template.pointSize */ |
| 326 | HDC dc; |
| 327 | int pixels; |
| 328 | dc = GetDC(0); |
| 329 | pixels = MulDiv(template.pointSize, GetDeviceCaps(dc , LOGPIXELSY), 72); |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 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) |
| 334 | { |
| 335 | SIZE charSize; |
Alexandre Julliard | 04c1f9f | 2003-07-09 19:53:17 +0000 | [diff] [blame] | 336 | if (DIALOG_GetCharSize( dc, dlgInfo->hUserFont, &charSize )) |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 337 | { |
| 338 | dlgInfo->xBaseUnit = charSize.cx; |
| 339 | dlgInfo->yBaseUnit = charSize.cy; |
| 340 | } |
| 341 | } |
Alexandre Julliard | 04c1f9f | 2003-07-09 19:53:17 +0000 | [diff] [blame] | 342 | ReleaseDC(0, dc); |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 343 | TRACE("units = %d,%d\n", dlgInfo->xBaseUnit, dlgInfo->yBaseUnit ); |
| 344 | } |
| 345 | |
| 346 | /* Create dialog main window */ |
| 347 | |
| 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; |
| 355 | |
| 356 | if (template.x == CW_USEDEFAULT16) |
| 357 | { |
| 358 | rect.left = rect.top = CW_USEDEFAULT16; |
| 359 | } |
| 360 | else |
| 361 | { |
| 362 | if (template.style & DS_CENTER) |
| 363 | { |
| 364 | rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2; |
| 365 | rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2; |
| 366 | } |
| 367 | else |
| 368 | { |
| 369 | rect.left += MulDiv(template.x, dlgInfo->xBaseUnit, 4); |
| 370 | rect.top += MulDiv(template.y, dlgInfo->yBaseUnit, 8); |
| 371 | } |
| 372 | if ( !(template.style & WS_CHILD) ) |
| 373 | { |
| 374 | INT16 dX, dY; |
| 375 | |
| 376 | if( !(template.style & DS_ABSALIGN) ) |
| 377 | ClientToScreen( owner, (POINT *)&rect ); |
| 378 | |
| 379 | /* try to fit it into the desktop */ |
| 380 | |
| 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; |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | if (modal) |
| 391 | { |
| 392 | ownerEnabled = DIALOG_DisableOwner( owner ); |
| 393 | if (ownerEnabled) dlgInfo->flags |= DF_OWNERENABLED; |
| 394 | } |
| 395 | |
| 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), |
| 400 | hInst, NULL )); |
| 401 | if (!hwnd) |
| 402 | { |
| 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 ); |
| 407 | return 0; |
| 408 | } |
| 409 | wndPtr = WIN_GetPtr( hwnd ); |
| 410 | wndPtr->flags |= WIN_ISDIALOG; |
| 411 | WIN_ReleasePtr( wndPtr ); |
| 412 | |
| 413 | SetWindowLongW( hwnd, DWL_WINE_DIALOGINFO, (LONG)dlgInfo ); |
| 414 | SetWindowLong16( HWND_16(hwnd), DWL_DLGPROC, (LONG)dlgProc ); |
| 415 | |
| 416 | if (dlgInfo->hUserFont) |
| 417 | SendMessageA( hwnd, WM_SETFONT, (WPARAM)dlgInfo->hUserFont, 0 ); |
| 418 | |
| 419 | /* Create controls */ |
| 420 | |
| 421 | if (DIALOG_CreateControls16( hwnd, dlgTemplate, &template, hInst )) |
| 422 | { |
| 423 | HWND hwndPreInitFocus; |
| 424 | |
| 425 | /* Send initialisation messages and set focus */ |
| 426 | |
| 427 | dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE ); |
| 428 | |
| 429 | hwndPreInitFocus = GetFocus(); |
| 430 | if (SendMessageA( hwnd, WM_INITDIALOG, (WPARAM)dlgInfo->hwndFocus, param )) |
| 431 | { |
| 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 ); |
| 437 | } |
| 438 | else |
| 439 | { |
| 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)) |
| 444 | { |
| 445 | dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE); |
| 446 | if( dlgInfo->hwndFocus ) |
| 447 | SetFocus( dlgInfo->hwndFocus ); |
| 448 | } |
| 449 | } |
| 450 | |
| 451 | if (template.style & WS_VISIBLE && !(GetWindowLongW( hwnd, GWL_STYLE ) & WS_VISIBLE)) |
| 452 | { |
| 453 | ShowWindow( hwnd, SW_SHOWNORMAL ); /* SW_SHOW doesn't always work */ |
| 454 | } |
| 455 | return hwnd; |
| 456 | } |
| 457 | if( IsWindow(hwnd) ) DestroyWindow( hwnd ); |
| 458 | if (modal && ownerEnabled) DIALOG_EnableOwner(owner); |
| 459 | return 0; |
| 460 | } |
| 461 | |
| 462 | |
| 463 | /*********************************************************************** |
| 464 | * DialogBox (USER.87) |
| 465 | */ |
| 466 | INT16 WINAPI DialogBox16( HINSTANCE16 hInst, LPCSTR dlgTemplate, |
| 467 | HWND16 owner, DLGPROC16 dlgProc ) |
| 468 | { |
| 469 | return DialogBoxParam16( hInst, dlgTemplate, owner, dlgProc, 0 ); |
| 470 | } |
| 471 | |
| 472 | |
| 473 | /************************************************************************** |
| 474 | * EndDialog (USER.88) |
| 475 | */ |
| 476 | BOOL16 WINAPI EndDialog16( HWND16 hwnd, INT16 retval ) |
| 477 | { |
| 478 | return EndDialog( WIN_Handle32(hwnd), retval ); |
| 479 | } |
| 480 | |
| 481 | |
| 482 | /*********************************************************************** |
| 483 | * CreateDialog (USER.89) |
| 484 | */ |
| 485 | HWND16 WINAPI CreateDialog16( HINSTANCE16 hInst, LPCSTR dlgTemplate, |
| 486 | HWND16 owner, DLGPROC16 dlgProc ) |
| 487 | { |
| 488 | return CreateDialogParam16( hInst, dlgTemplate, owner, dlgProc, 0 ); |
| 489 | } |
| 490 | |
| 491 | |
| 492 | /************************************************************************** |
| 493 | * GetDlgItem (USER.91) |
| 494 | */ |
| 495 | HWND16 WINAPI GetDlgItem16( HWND16 hwndDlg, INT16 id ) |
| 496 | { |
| 497 | return HWND_16( GetDlgItem( WIN_Handle32(hwndDlg), (UINT16) id )); |
| 498 | } |
| 499 | |
| 500 | |
| 501 | /************************************************************************** |
| 502 | * SetDlgItemText (USER.92) |
| 503 | */ |
| 504 | void WINAPI SetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR lpString ) |
| 505 | { |
| 506 | SendDlgItemMessage16( hwnd, id, WM_SETTEXT, 0, (LPARAM)lpString ); |
| 507 | } |
| 508 | |
| 509 | |
| 510 | /************************************************************************** |
| 511 | * GetDlgItemText (USER.93) |
| 512 | */ |
| 513 | INT16 WINAPI GetDlgItemText16( HWND16 hwnd, INT16 id, SEGPTR str, UINT16 len ) |
| 514 | { |
| 515 | return (INT16)SendDlgItemMessage16( hwnd, id, WM_GETTEXT, len, (LPARAM)str ); |
| 516 | } |
| 517 | |
| 518 | |
| 519 | /************************************************************************** |
| 520 | * SetDlgItemInt (USER.94) |
| 521 | */ |
| 522 | void WINAPI SetDlgItemInt16( HWND16 hwnd, INT16 id, UINT16 value, BOOL16 fSigned ) |
| 523 | { |
| 524 | SetDlgItemInt( WIN_Handle32(hwnd), (UINT)(UINT16)id, |
| 525 | (UINT)(fSigned ? (INT16) value : (UINT16) value), fSigned ); |
| 526 | } |
| 527 | |
| 528 | |
| 529 | /************************************************************************** |
| 530 | * GetDlgItemInt (USER.95) |
| 531 | */ |
| 532 | UINT16 WINAPI GetDlgItemInt16( HWND16 hwnd, INT16 id, BOOL16 *translated, BOOL16 fSigned ) |
| 533 | { |
| 534 | UINT result; |
| 535 | BOOL ok; |
| 536 | |
| 537 | if (translated) *translated = FALSE; |
| 538 | result = GetDlgItemInt( WIN_Handle32(hwnd), (UINT)(UINT16)id, &ok, fSigned ); |
| 539 | if (!ok) return 0; |
| 540 | if (fSigned) |
| 541 | { |
| 542 | if (((INT)result < -32767) || ((INT)result > 32767)) return 0; |
| 543 | } |
| 544 | else |
| 545 | { |
| 546 | if (result > 65535) return 0; |
| 547 | } |
| 548 | if (translated) *translated = TRUE; |
| 549 | return (UINT16)result; |
| 550 | } |
| 551 | |
| 552 | |
| 553 | /************************************************************************** |
| 554 | * CheckRadioButton (USER.96) |
| 555 | */ |
| 556 | BOOL16 WINAPI CheckRadioButton16( HWND16 hwndDlg, UINT16 firstID, |
| 557 | UINT16 lastID, UINT16 checkID ) |
| 558 | { |
| 559 | return CheckRadioButton( WIN_Handle32(hwndDlg), firstID, lastID, checkID ); |
| 560 | } |
| 561 | |
| 562 | |
| 563 | /************************************************************************** |
| 564 | * CheckDlgButton (USER.97) |
| 565 | */ |
| 566 | BOOL16 WINAPI CheckDlgButton16( HWND16 hwnd, INT16 id, UINT16 check ) |
| 567 | { |
| 568 | SendDlgItemMessage16( hwnd, id, BM_SETCHECK16, check, 0 ); |
| 569 | return TRUE; |
| 570 | } |
| 571 | |
| 572 | |
| 573 | /************************************************************************** |
| 574 | * IsDlgButtonChecked (USER.98) |
| 575 | */ |
| 576 | UINT16 WINAPI IsDlgButtonChecked16( HWND16 hwnd, UINT16 id ) |
| 577 | { |
| 578 | return (UINT16)SendDlgItemMessage16( hwnd, id, BM_GETCHECK16, 0, 0 ); |
| 579 | } |
| 580 | |
| 581 | |
| 582 | /************************************************************************** |
| 583 | * DlgDirSelect (USER.99) |
| 584 | */ |
| 585 | BOOL16 WINAPI DlgDirSelect16( HWND16 hwnd, LPSTR str, INT16 id ) |
| 586 | { |
| 587 | return DlgDirSelectEx16( hwnd, str, 128, id ); |
| 588 | } |
| 589 | |
| 590 | |
| 591 | /************************************************************************** |
| 592 | * DlgDirList (USER.100) |
| 593 | */ |
| 594 | INT16 WINAPI DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox, |
| 595 | INT16 idStatic, UINT16 attrib ) |
| 596 | { |
| 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, |
| 600 | * so do it here) */ |
| 601 | if (attrib & DDL_DRIVES) attrib |= DDL_EXCLUSIVE; |
| 602 | return DlgDirListA( WIN_Handle32(hDlg), spec, idLBox, idStatic, attrib ); |
| 603 | } |
| 604 | |
| 605 | |
| 606 | /************************************************************************** |
| 607 | * SendDlgItemMessage (USER.101) |
| 608 | */ |
| 609 | LRESULT WINAPI SendDlgItemMessage16( HWND16 hwnd, INT16 id, UINT16 msg, |
| 610 | WPARAM16 wParam, LPARAM lParam ) |
| 611 | { |
| 612 | HWND16 hwndCtrl = GetDlgItem16( hwnd, id ); |
| 613 | if (hwndCtrl) return SendMessage16( hwndCtrl, msg, wParam, lParam ); |
| 614 | else return 0; |
| 615 | } |
| 616 | |
| 617 | |
| 618 | /************************************************************************** |
| 619 | * MapDialogRect (USER.103) |
| 620 | */ |
| 621 | void WINAPI MapDialogRect16( HWND16 hwnd, LPRECT16 rect ) |
| 622 | { |
| 623 | RECT rect32; |
| 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; |
| 629 | } |
| 630 | |
| 631 | |
| 632 | /************************************************************************** |
| 633 | * DlgDirSelectComboBox (USER.194) |
| 634 | */ |
| 635 | BOOL16 WINAPI DlgDirSelectComboBox16( HWND16 hwnd, LPSTR str, INT16 id ) |
| 636 | { |
| 637 | return DlgDirSelectComboBoxEx16( hwnd, str, 128, id ); |
| 638 | } |
| 639 | |
| 640 | |
| 641 | /************************************************************************** |
| 642 | * DlgDirListComboBox (USER.195) |
| 643 | */ |
| 644 | INT16 WINAPI DlgDirListComboBox16( HWND16 hDlg, LPSTR spec, INT16 idCBox, |
| 645 | INT16 idStatic, UINT16 attrib ) |
| 646 | { |
| 647 | return DlgDirListComboBoxA( WIN_Handle32(hDlg), spec, idCBox, idStatic, attrib ); |
| 648 | } |
| 649 | |
| 650 | |
| 651 | /*********************************************************************** |
| 652 | * DialogBoxIndirect (USER.218) |
| 653 | */ |
| 654 | INT16 WINAPI DialogBoxIndirect16( HINSTANCE16 hInst, HANDLE16 dlgTemplate, |
| 655 | HWND16 owner, DLGPROC16 dlgProc ) |
| 656 | { |
| 657 | return DialogBoxIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0 ); |
| 658 | } |
| 659 | |
| 660 | |
| 661 | /*********************************************************************** |
| 662 | * CreateDialogIndirect (USER.219) |
| 663 | */ |
| 664 | HWND16 WINAPI CreateDialogIndirect16( HINSTANCE16 hInst, LPCVOID dlgTemplate, |
| 665 | HWND16 owner, DLGPROC16 dlgProc ) |
| 666 | { |
| 667 | return CreateDialogIndirectParam16( hInst, dlgTemplate, owner, dlgProc, 0); |
| 668 | } |
| 669 | |
| 670 | |
| 671 | /************************************************************************** |
| 672 | * GetNextDlgGroupItem (USER.227) |
| 673 | */ |
| 674 | HWND16 WINAPI GetNextDlgGroupItem16( HWND16 hwndDlg, HWND16 hwndCtrl, |
| 675 | BOOL16 fPrevious ) |
| 676 | { |
| 677 | return HWND_16( GetNextDlgGroupItem( WIN_Handle32(hwndDlg), WIN_Handle32(hwndCtrl), fPrevious )); |
| 678 | } |
| 679 | |
| 680 | |
| 681 | /************************************************************************** |
| 682 | * GetNextDlgTabItem (USER.228) |
| 683 | */ |
| 684 | HWND16 WINAPI GetNextDlgTabItem16( HWND16 hwndDlg, HWND16 hwndCtrl, |
| 685 | BOOL16 fPrevious ) |
| 686 | { |
| 687 | return HWND_16( GetNextDlgTabItem( WIN_Handle32(hwndDlg), WIN_Handle32(hwndCtrl), fPrevious )); |
| 688 | } |
| 689 | |
| 690 | |
| 691 | /*********************************************************************** |
| 692 | * DialogBoxParam (USER.239) |
| 693 | */ |
| 694 | INT16 WINAPI DialogBoxParam16( HINSTANCE16 hInst, LPCSTR template, |
| 695 | HWND16 owner16, DLGPROC16 dlgProc, LPARAM param ) |
| 696 | { |
| 697 | HWND hwnd = 0; |
| 698 | HRSRC16 hRsrc; |
| 699 | HGLOBAL16 hmem; |
| 700 | LPCVOID data; |
| 701 | int ret = -1; |
| 702 | |
Alexandre Julliard | cf52644 | 2003-09-10 03:56:47 +0000 | [diff] [blame] | 703 | if (!(hRsrc = FindResource16( hInst, template, (LPSTR)RT_DIALOG ))) return 0; |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 704 | if (!(hmem = LoadResource16( hInst, hRsrc ))) return 0; |
| 705 | if ((data = LockResource16( hmem ))) |
| 706 | { |
| 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 ); |
| 711 | } |
| 712 | FreeResource16( hmem ); |
| 713 | return ret; |
| 714 | } |
| 715 | |
| 716 | |
| 717 | /*********************************************************************** |
| 718 | * DialogBoxIndirectParam (USER.240) |
| 719 | */ |
| 720 | INT16 WINAPI DialogBoxIndirectParam16( HINSTANCE16 hInst, HANDLE16 dlgTemplate, |
| 721 | HWND16 owner16, DLGPROC16 dlgProc, LPARAM param ) |
| 722 | { |
| 723 | HWND hwnd, owner = WIN_Handle32( owner16 ); |
| 724 | LPCVOID ptr; |
| 725 | |
| 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 ); |
| 730 | return -1; |
| 731 | } |
| 732 | |
| 733 | |
| 734 | /*********************************************************************** |
| 735 | * CreateDialogParam (USER.241) |
| 736 | */ |
| 737 | HWND16 WINAPI CreateDialogParam16( HINSTANCE16 hInst, LPCSTR dlgTemplate, |
| 738 | HWND16 owner, DLGPROC16 dlgProc, LPARAM param ) |
| 739 | { |
| 740 | HWND16 hwnd = 0; |
| 741 | HRSRC16 hRsrc; |
| 742 | HGLOBAL16 hmem; |
| 743 | LPCVOID data; |
| 744 | |
| 745 | TRACE("%04x,%s,%04x,%08lx,%ld\n", |
| 746 | hInst, debugstr_a(dlgTemplate), owner, (DWORD)dlgProc, param ); |
| 747 | |
Alexandre Julliard | cf52644 | 2003-09-10 03:56:47 +0000 | [diff] [blame] | 748 | if (!(hRsrc = FindResource16( hInst, dlgTemplate, (LPSTR)RT_DIALOG ))) return 0; |
Alexandre Julliard | a65a8a6 | 2003-03-28 19:40:37 +0000 | [diff] [blame] | 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 ); |
| 753 | return hwnd; |
| 754 | } |
| 755 | |
| 756 | |
| 757 | /*********************************************************************** |
| 758 | * CreateDialogIndirectParam (USER.242) |
| 759 | */ |
| 760 | HWND16 WINAPI CreateDialogIndirectParam16( HINSTANCE16 hInst, LPCVOID dlgTemplate, |
| 761 | HWND16 owner, DLGPROC16 dlgProc, LPARAM param ) |
| 762 | { |
| 763 | if (!dlgTemplate) return 0; |
| 764 | return HWND_16( DIALOG_CreateIndirect16( hInst, dlgTemplate, WIN_Handle32(owner), |
| 765 | dlgProc, param, FALSE )); |
| 766 | } |
| 767 | |
| 768 | |
| 769 | /************************************************************************** |
| 770 | * DlgDirSelectEx (USER.422) |
| 771 | */ |
| 772 | BOOL16 WINAPI DlgDirSelectEx16( HWND16 hwnd, LPSTR str, INT16 len, INT16 id ) |
| 773 | { |
| 774 | return DlgDirSelectExA( WIN_Handle32(hwnd), str, len, id ); |
| 775 | } |
| 776 | |
| 777 | |
| 778 | /************************************************************************** |
| 779 | * DlgDirSelectComboBoxEx (USER.423) |
| 780 | */ |
| 781 | BOOL16 WINAPI DlgDirSelectComboBoxEx16( HWND16 hwnd, LPSTR str, INT16 len, |
| 782 | INT16 id ) |
| 783 | { |
| 784 | return DlgDirSelectComboBoxExA( WIN_Handle32(hwnd), str, len, id ); |
| 785 | } |