/*********************************************************************** * CallMsgFilter32 (USER.823) */ BOOL16 WINAPI CallMsgFilter32_16( MSG32_16 *lpmsg16_32, INT16 code, BOOL16 wHaveParamHigh ) { MSG msg32; BOOL16 ret; if (GetSysModalWindow16()) return FALSE; msg32.hwnd = WIN_Handle32( lpmsg16_32->msg.hwnd ); msg32.message = lpmsg16_32->msg.message; msg32.lParam = lpmsg16_32->msg.lParam; msg32.time = lpmsg16_32->msg.time; msg32.pt.x = lpmsg16_32->msg.pt.x; msg32.pt.y = lpmsg16_32->msg.pt.y; if (wHaveParamHigh) msg32.wParam = MAKELONG(lpmsg16_32->msg.wParam, lpmsg16_32->wParamHigh); else msg32.wParam = lpmsg16_32->msg.wParam; ret = (BOOL16)CallMsgFilterA(&msg32, code); lpmsg16_32->msg.hwnd = HWND_16( msg32.hwnd ); lpmsg16_32->msg.message = msg32.message; lpmsg16_32->msg.wParam = LOWORD(msg32.wParam); lpmsg16_32->msg.lParam = msg32.lParam; lpmsg16_32->msg.time = msg32.time; lpmsg16_32->msg.pt.x = msg32.pt.x; lpmsg16_32->msg.pt.y = msg32.pt.y; if (wHaveParamHigh) lpmsg16_32->wParamHigh = HIWORD(msg32.wParam); return ret; }
/*********************************************************************** * MCIWndCreate(MSVIDEO.250) */ HWND16 CDECL MCIWndCreate16(HWND16 parent, HINSTANCE16 hinst16, DWORD style, LPSTR file) { HWND hwnd = MCIWndCreateA(HWND_32(parent), 0, style, file); if (hwnd) pMCIWndProc = (void *)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (ULONG_PTR)MCIWndProc16); return HWND_16(hwnd); }
/*********************************************************************** * map_msg_32_to_16 */ static inline void map_msg_32_to_16( const MSG *msg32, MSG16 *msg16 ) { msg16->hwnd = HWND_16(msg32->hwnd); msg16->message = msg32->message; msg16->wParam = msg32->wParam; msg16->lParam = msg32->lParam; msg16->time = msg32->time; msg16->pt.x = msg32->pt.x; msg16->pt.y = msg32->pt.y; }
/*********************************************************************** * call_WH_MOUSE */ static LRESULT CALLBACK call_WH_MOUSE( INT code, WPARAM wp, LPARAM lp ) { MOUSEHOOKSTRUCT *ms32 = (MOUSEHOOKSTRUCT *)lp; MOUSEHOOKSTRUCT16 ms16; LRESULT ret; ms16.pt.x = ms32->pt.x; ms16.pt.y = ms32->pt.y; ms16.hwnd = HWND_16( ms32->hwnd ); ms16.wHitTestCode = ms32->wHitTestCode; ms16.dwExtraInfo = ms32->dwExtraInfo; lp = MapLS( &ms16 ); ret = call_hook_16( WH_MOUSE, code, wp, lp ); UnMapLS( lp ); return ret; }
/************************************************************************* * RunDLL_CallEntry16 * * Only exported from shell32 on Windows, probably imported * from shell through the 16/32 thunks. */ void WINAPI RunDLL_CallEntry16( DWORD proc, HWND hwnd, HINSTANCE inst, LPCSTR cmdline, INT cmdshow ) { WORD args[5]; SEGPTR cmdline_seg; TRACE( "proc %x hwnd %p inst %p cmdline %s cmdshow %d\n", proc, hwnd, inst, debugstr_a(cmdline), cmdshow ); cmdline_seg = MapLS( cmdline ); args[4] = HWND_16(hwnd); args[3] = MapHModuleLS(inst); args[2] = SELECTOROF(cmdline_seg); args[1] = OFFSETOF(cmdline_seg); args[0] = cmdshow; WOWCallback16Ex( proc, WCB16_PASCAL, sizeof(args), args, NULL ); UnMapLS( cmdline_seg ); }
/************************************************************************* * RunDLL_CallEntry16 [SHELL32.122] * the name is probably wrong */ EXTERN_C void WINAPI RunDLL_CallEntry16( DWORD proc, HWND hwnd, HINSTANCE inst, LPCSTR cmdline, INT cmdshow ) { #if !defined(__CYGWIN__) && !defined (__MINGW32__) && !defined(_MSC_VER) WORD args[5]; SEGPTR cmdline_seg; TRACE( "proc %x hwnd %p inst %p cmdline %s cmdshow %d\n", proc, hwnd, inst, debugstr_a(cmdline), cmdshow ); cmdline_seg = MapLS( cmdline ); args[4] = HWND_16(hwnd); args[3] = MapHModuleLS(inst); args[2] = SELECTOROF(cmdline_seg); args[1] = OFFSETOF(cmdline_seg); args[0] = cmdshow; WOWCallback16Ex( proc, WCB16_PASCAL, sizeof(args), args, NULL ); UnMapLS( cmdline_seg ); #else FIXME( "proc %lx hwnd %p inst %p cmdline %s cmdshow %d\n", proc, hwnd, inst, debugstr_a(cmdline), cmdshow ); #endif }
/*********************************************************************** * MCIWndCreate(MSVIDEO.250) */ HWND16 CDECL MCIWndCreate16(HWND16 hwnd, HINSTANCE16 hinst16, DWORD style, LPSTR file) { return HWND_16(MCIWndCreateA(HWND_32(hwnd), 0, style, file)); }
/*********************************************************************** * CallNextHookEx (USER.293) */ LRESULT WINAPI CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wparam, LPARAM lparam ) { struct hook16_queue_info *info; LRESULT ret = 0; if (!(info = get_user_thread_info()->hook16_info)) return 0; switch (info->id) { case WH_MSGFILTER: { MSG16 *msg16 = MapSL(lparam); MSG msg32; map_msg_16_to_32( msg16, &msg32 ); ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&msg32 ); break; } case WH_GETMESSAGE: { MSG16 *msg16 = MapSL(lparam); MSG msg32; map_msg_16_to_32( msg16, &msg32 ); ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&msg32 ); map_msg_32_to_16( &msg32, msg16 ); break; } case WH_CALLWNDPROC: { CWPSTRUCT16 *cwp16 = MapSL(lparam); LRESULT result; struct wndproc_hook_params params; params.hhook = hhook; params.code = code; params.wparam = wparam; ret = WINPROC_CallProc16To32A( wndproc_hook_callback, cwp16->hwnd, cwp16->message, cwp16->wParam, cwp16->lParam, &result, ¶ms ); break; } case WH_CBT: switch (code) { case HCBT_CREATEWND: { CBT_CREATEWNDA cbtcw32; CREATESTRUCTA cs32; CBT_CREATEWND16 *cbtcw16 = MapSL(lparam); CREATESTRUCT16 *cs16 = MapSL( (SEGPTR)cbtcw16->lpcs ); cbtcw32.lpcs = &cs32; cbtcw32.hwndInsertAfter = WIN_Handle32( cbtcw16->hwndInsertAfter ); cs32.lpCreateParams = (LPVOID)cs16->lpCreateParams; cs32.hInstance = HINSTANCE_32(cs16->hInstance); cs32.hMenu = HMENU_32(cs16->hMenu); cs32.hwndParent = WIN_Handle32(cs16->hwndParent); cs32.cy = cs16->cy; cs32.cx = cs16->cx; cs32.y = cs16->y; cs32.x = cs16->x; cs32.style = cs16->style; cs32.lpszName = MapSL( cs16->lpszName ); cs32.lpszClass = MapSL( cs16->lpszClass ); cs32.dwExStyle = cs16->dwExStyle; ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&cbtcw32 ); cbtcw16->hwndInsertAfter = HWND_16( cbtcw32.hwndInsertAfter ); break; } case HCBT_ACTIVATE: { CBTACTIVATESTRUCT16 *cas16 = MapSL(lparam); CBTACTIVATESTRUCT cas32; cas32.fMouse = cas16->fMouse; cas32.hWndActive = WIN_Handle32(cas16->hWndActive); ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&cas32 ); break; } case HCBT_CLICKSKIPPED: { MOUSEHOOKSTRUCT16 *ms16 = MapSL(lparam); MOUSEHOOKSTRUCT ms32; ms32.pt.x = ms16->pt.x; ms32.pt.y = ms16->pt.y; /* wHitTestCode may be negative, so convince compiler to do correct sign extension. Yay. :| */ ms32.wHitTestCode = (INT)(INT16)ms16->wHitTestCode; ms32.dwExtraInfo = ms16->dwExtraInfo; ms32.hwnd = WIN_Handle32( ms16->hwnd ); ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&ms32 ); break; } case HCBT_MOVESIZE: { RECT16 *rect16 = MapSL(lparam); RECT rect32; rect32.left = rect16->left; rect32.top = rect16->top; rect32.right = rect16->right; rect32.bottom = rect16->bottom; ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&rect32 ); break; } } break; case WH_MOUSE: { MOUSEHOOKSTRUCT16 *ms16 = MapSL(lparam); MOUSEHOOKSTRUCT ms32; ms32.pt.x = ms16->pt.x; ms32.pt.y = ms16->pt.y; /* wHitTestCode may be negative, so convince compiler to do correct sign extension. Yay. :| */ ms32.wHitTestCode = (INT)((INT16)ms16->wHitTestCode); ms32.dwExtraInfo = ms16->dwExtraInfo; ms32.hwnd = WIN_Handle32(ms16->hwnd); ret = CallNextHookEx( hhook, code, wparam, (LPARAM)&ms32 ); break; } case WH_SHELL: case WH_KEYBOARD: ret = CallNextHookEx( hhook, code, wparam, lparam ); break; case WH_HARDWARE: case WH_FOREGROUNDIDLE: case WH_CALLWNDPROCRET: case WH_SYSMSGFILTER: case WH_JOURNALRECORD: case WH_JOURNALPLAYBACK: default: FIXME("\t[%i] 16to32 translation unimplemented\n", info->id); ret = CallNextHookEx( hhook, code, wparam, lparam ); break; } return ret; }
/*********************************************************************** * call_WH_CBT */ static LRESULT CALLBACK call_WH_CBT( INT code, WPARAM wp, LPARAM lp ) { LRESULT ret = 0; switch (code) { case HCBT_CREATEWND: { CBT_CREATEWNDA *cbtcw32 = (CBT_CREATEWNDA *)lp; CBT_CREATEWND16 cbtcw16; CREATESTRUCT16 cs16; cs16.lpCreateParams = (SEGPTR)cbtcw32->lpcs->lpCreateParams; cs16.hInstance = HINSTANCE_16(cbtcw32->lpcs->hInstance); cs16.hMenu = HMENU_16(cbtcw32->lpcs->hMenu); cs16.hwndParent = HWND_16(cbtcw32->lpcs->hwndParent); cs16.cy = cbtcw32->lpcs->cy; cs16.cx = cbtcw32->lpcs->cx; cs16.y = cbtcw32->lpcs->y; cs16.x = cbtcw32->lpcs->x; cs16.style = cbtcw32->lpcs->style; cs16.lpszName = MapLS( cbtcw32->lpcs->lpszName ); cs16.lpszClass = MapLS( cbtcw32->lpcs->lpszClass ); cs16.dwExStyle = cbtcw32->lpcs->dwExStyle; cbtcw16.lpcs = (CREATESTRUCT16 *)MapLS( &cs16 ); cbtcw16.hwndInsertAfter = HWND_16( cbtcw32->hwndInsertAfter ); lp = MapLS( &cbtcw16 ); ret = call_hook_16( WH_CBT, code, wp, lp ); UnMapLS( cs16.lpszName ); UnMapLS( cs16.lpszClass ); cbtcw32->hwndInsertAfter = WIN_Handle32( cbtcw16.hwndInsertAfter ); UnMapLS( (SEGPTR)cbtcw16.lpcs ); UnMapLS( lp ); break; } case HCBT_ACTIVATE: { CBTACTIVATESTRUCT *cas32 = (CBTACTIVATESTRUCT *)lp; CBTACTIVATESTRUCT16 cas16; cas16.fMouse = cas32->fMouse; cas16.hWndActive = HWND_16( cas32->hWndActive ); lp = MapLS( &cas16 ); ret = call_hook_16( WH_CBT, code, wp, lp ); UnMapLS( lp ); break; } case HCBT_CLICKSKIPPED: { MOUSEHOOKSTRUCT *ms32 = (MOUSEHOOKSTRUCT *)lp; MOUSEHOOKSTRUCT16 ms16; ms16.pt.x = ms32->pt.x; ms16.pt.y = ms32->pt.y; ms16.hwnd = HWND_16( ms32->hwnd ); ms16.wHitTestCode = ms32->wHitTestCode; ms16.dwExtraInfo = ms32->dwExtraInfo; lp = MapLS( &ms16 ); ret = call_hook_16( WH_CBT, code, wp, lp ); UnMapLS( lp ); break; } case HCBT_MOVESIZE: { RECT *rect32 = (RECT *)lp; RECT16 rect16; rect16.left = rect32->left; rect16.top = rect32->top; rect16.right = rect32->right; rect16.bottom = rect32->bottom; lp = MapLS( &rect16 ); ret = call_hook_16( WH_CBT, code, wp, lp ); UnMapLS( lp ); break; } } return ret; }
/*********************************************************************** * CC_WMInitDialog16 [internal] */ static LONG CC_WMInitDialog16( HWND hDlg, WPARAM wParam, LPARAM lParam ) { int i, res; int r, g, b; HWND hwnd; RECT rect; POINT point; LCCPRIV lpp; CHOOSECOLORW *ch32; CHOOSECOLOR16 *ch16 = (CHOOSECOLOR16 *) lParam; TRACE("WM_INITDIALOG lParam=%08lX\n", lParam); lpp = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct CCPRIVATE) ); if (ch16->lStructSize != sizeof(CHOOSECOLOR16) ) { HeapFree(GetProcessHeap(), 0, lpp); EndDialog (hDlg, 0) ; return FALSE; } ch32 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CHOOSECOLORW) ); lpp->lpcc = ch32; lpp->lpcc16 = ch16; ch32->lStructSize = sizeof(CHOOSECOLORW); ch32->hwndOwner = HWND_32(ch16->hwndOwner); /* Should be an HINSTANCE but MS made a typo */ ch32->hInstance = HWND_32(ch16->hInstance); ch32->lpCustColors = MapSL(ch16->lpCustColors); ch32->lpfnHook = (LPCCHOOKPROC) ch16->lpfnHook; /* only used as flag */ ch32->Flags = ch16->Flags; SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR)lpp); if (!(lpp->lpcc->Flags & CC_SHOWHELP)) ShowWindow( GetDlgItem(hDlg,0x40e), SW_HIDE); lpp->msetrgb = RegisterWindowMessageA(SETRGBSTRINGA); #if 0 cpos = MAKELONG(5,7); /* init */ if (lpp->lpcc->Flags & CC_RGBINIT) { for (i = 0; i < 6; i++) for (j = 0; j < 8; j++) if (predefcolors[i][j] == lpp->lpcc->rgbResult) { cpos = MAKELONG(i,j); goto found; } } found: /* FIXME: Draw_a_focus_rect & set_init_values */ #endif GetWindowRect(hDlg, &lpp->fullsize); if (lpp->lpcc->Flags & CC_FULLOPEN || lpp->lpcc->Flags & CC_PREVENTFULLOPEN) { hwnd = GetDlgItem(hDlg, 0x2cf); EnableWindow(hwnd, FALSE); } if (!(lpp->lpcc->Flags & CC_FULLOPEN ) || lpp->lpcc->Flags & CC_PREVENTFULLOPEN) { rect = lpp->fullsize; res = rect.bottom - rect.top; hwnd = GetDlgItem(hDlg, 0x2c6); /* cut at left border */ point.x = point.y = 0; ClientToScreen(hwnd, &point); ScreenToClient(hDlg,&point); GetClientRect(hDlg, &rect); point.x += GetSystemMetrics(SM_CXDLGFRAME); SetWindowPos(hDlg, 0, 0, 0, point.x, res, SWP_NOMOVE|SWP_NOZORDER); for (i = 0x2bf; i < 0x2c5; i++) ShowWindow( GetDlgItem(hDlg, i), SW_HIDE); for (i = 0x2d3; i < 0x2d9; i++) ShowWindow( GetDlgItem(hDlg, i), SW_HIDE); ShowWindow( GetDlgItem(hDlg, 0x2c9), SW_HIDE); ShowWindow( GetDlgItem(hDlg, 0x2c8), SW_HIDE); ShowWindow( GetDlgItem(hDlg, 0x2c6), SW_HIDE); ShowWindow( GetDlgItem(hDlg, 0x2c5), SW_HIDE); ShowWindow( GetDlgItem(hDlg, 1090 ), SW_HIDE); } else CC_SwitchToFullSize(hDlg, lpp->lpcc->rgbResult, NULL); res = TRUE; for (i = 0x2bf; i < 0x2c5; i++) SendMessageA( GetDlgItem(hDlg, i), EM_LIMITTEXT, 3, 0); /* max 3 digits: xyz */ if (CC_HookCallChk(lpp->lpcc)) { res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, HWND_16(hDlg), WM_INITDIALOG, wParam, lParam); } /* Set the initial values of the color chooser dialog */ r = GetRValue(lpp->lpcc->rgbResult); g = GetGValue(lpp->lpcc->rgbResult); b = GetBValue(lpp->lpcc->rgbResult); CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); lpp->h = CC_RGBtoHSL('H', r, g, b); lpp->s = CC_RGBtoHSL('S', r, g, b); lpp->l = CC_RGBtoHSL('L', r, g, b); /* Doing it the long way because CC_EditSetRGB/HSL doesn't seem to work */ SetDlgItemInt(hDlg, 703, lpp->h, TRUE); SetDlgItemInt(hDlg, 704, lpp->s, TRUE); SetDlgItemInt(hDlg, 705, lpp->l, TRUE); SetDlgItemInt(hDlg, 706, r, TRUE); SetDlgItemInt(hDlg, 707, g, TRUE); SetDlgItemInt(hDlg, 708, b, TRUE); CC_PaintCross(hDlg, lpp->h, lpp->s); CC_PaintTriangle(hDlg, lpp->l); return res; }
/*********************************************************************** * CC_WMCommand16 [internal] */ static LRESULT CC_WMCommand16( HWND hDlg, WPARAM wParam, LPARAM lParam, WORD notifyCode, HWND hwndCtl ) { int r, g, b, i, xx; UINT cokmsg; HDC hdc; COLORREF *cr; LCCPRIV lpp = (LCCPRIV)GetWindowLongPtrW(hDlg, DWLP_USER); TRACE("CC_WMCommand wParam=%lx lParam=%lx\n", wParam, lParam); switch (wParam) { case 0x2c2: /* edit notify RGB */ case 0x2c3: case 0x2c4: if (notifyCode == EN_UPDATE && !lpp->updating) { i = CC_CheckDigitsInEdit(hwndCtl, 255); r = GetRValue(lpp->lpcc->rgbResult); g = GetGValue(lpp->lpcc->rgbResult); b= GetBValue(lpp->lpcc->rgbResult); xx = 0; switch (wParam) { case 0x2c2: if ((xx = (i != r))) r = i; break; case 0x2c3: if ((xx = (i != g))) g = i; break; case 0x2c4: if ((xx = (i != b))) b = i; break; } if (xx) /* something has changed */ { lpp->lpcc->rgbResult = RGB(r, g, b); CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); lpp->h = CC_RGBtoHSL('H', r, g, b); lpp->s = CC_RGBtoHSL('S', r, g, b); lpp->l = CC_RGBtoHSL('L', r, g, b); CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l); CC_PaintCross(hDlg, lpp->h, lpp->s); CC_PaintTriangle(hDlg, lpp->l); } } break; case 0x2bf: /* edit notify HSL */ case 0x2c0: case 0x2c1: if (notifyCode == EN_UPDATE && !lpp->updating) { i = CC_CheckDigitsInEdit(hwndCtl , wParam == 0x2bf ? 239:240); xx = 0; switch (wParam) { case 0x2bf: if ((xx = ( i != lpp->h))) lpp->h = i; break; case 0x2c0: if ((xx = ( i != lpp->s))) lpp->s = i; break; case 0x2c1: if ((xx = ( i != lpp->l))) lpp->l = i; break; } if (xx) /* something has changed */ { r = CC_HSLtoRGB('R', lpp->h, lpp->s, lpp->l); g = CC_HSLtoRGB('G', lpp->h, lpp->s, lpp->l); b = CC_HSLtoRGB('B', lpp->h, lpp->s, lpp->l); lpp->lpcc->rgbResult = RGB(r, g, b); CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult); CC_PaintCross(hDlg, lpp->h, lpp->s); CC_PaintTriangle(hDlg, lpp->l); } } break; case 0x2cf: CC_SwitchToFullSize(hDlg, lpp->lpcc->rgbResult, &lpp->fullsize); SetFocus( GetDlgItem(hDlg, 0x2bf)); break; case 0x2c8: /* add colors ... column by column */ cr = lpp->lpcc->lpCustColors; cr[(lpp->nextuserdef % 2) * 8 + lpp->nextuserdef / 2] = lpp->lpcc->rgbResult; if (++lpp->nextuserdef == 16) lpp->nextuserdef = 0; CC_PaintUserColorArray(hDlg, 2, 8, lpp->lpcc->lpCustColors); break; case 0x2c9: /* resulting color */ hdc = GetDC(hDlg); lpp->lpcc->rgbResult = GetNearestColor(hdc, lpp->lpcc->rgbResult); ReleaseDC(hDlg, hdc); CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult); CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); r = GetRValue(lpp->lpcc->rgbResult); g = GetGValue(lpp->lpcc->rgbResult); b = GetBValue(lpp->lpcc->rgbResult); lpp->h = CC_RGBtoHSL('H', r, g, b); lpp->s = CC_RGBtoHSL('S', r, g, b); lpp->l = CC_RGBtoHSL('L', r, g, b); CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l); CC_PaintCross(hDlg, lpp->h, lpp->s); CC_PaintTriangle(hDlg, lpp->l); break; case 0x40e: /* Help! */ /* The Beatles, 1965 ;-) */ i = RegisterWindowMessageA(HELPMSGSTRINGA); if (lpp->lpcc16) { if (lpp->lpcc->hwndOwner) SendMessageA(lpp->lpcc->hwndOwner, i, 0, (LPARAM)lpp->lpcc16); if ( CC_HookCallChk(lpp->lpcc)) CallWindowProc16( (WNDPROC16) lpp->lpcc16->lpfnHook, HWND_16(hDlg), WM_COMMAND, psh15, (LPARAM)lpp->lpcc16); } break; case IDOK : cokmsg = RegisterWindowMessageA(COLOROKSTRINGA); if (lpp->lpcc16) { if (lpp->lpcc->hwndOwner) if (SendMessageA(lpp->lpcc->hwndOwner, cokmsg, 0, (LPARAM)lpp->lpcc16)) break; /* do NOT close */ } if (lpp->lpcc16) { BYTE *ptr = MapSL(lpp->lpcc16->lpCustColors); memcpy(ptr, lpp->lpcc->lpCustColors, sizeof(COLORREF)*16); lpp->lpcc16->rgbResult = lpp->lpcc->rgbResult; } EndDialog(hDlg, 1) ; return TRUE ; case IDCANCEL : EndDialog(hDlg, 0) ; return TRUE ; } return FALSE; }