void MCStack::constrain(intptr_t lp) { uint32_t wstyle, exstyle; getstyle(wstyle, exstyle); RECT wrect = getwrect(rect, wstyle, exstyle); int4 dx = wrect.right - wrect.left - rect.width; int4 dy = wrect.bottom - wrect.top - rect.height; LPMINMAXINFO mmptr = (LPMINMAXINFO)lp; const MCDisplay *t_display; t_display = MCscreen -> getnearestdisplay(rect); if (mode < WM_MODAL) { MCRectangle t_workarea, t_viewport; if (MCU_point_in_rect(t_display -> workarea, MCwbr . x, MCwbr . y)) t_workarea = MCU_intersect_rect(MCwbr, t_display -> workarea); else t_workarea = t_display -> workarea; t_viewport = t_display -> viewport; if (memcmp(&t_workarea, &t_display -> workarea, sizeof(MCRectangle))) MCU_reduce_rect(t_workarea, -dx / 2); mmptr -> ptMaxSize . x = MCU_min(maxwidth + dx, t_workarea . width); mmptr -> ptMaxSize . y = MCU_min(maxheight + dy, t_workarea . height); mmptr -> ptMaxPosition . x = t_workarea . x - t_viewport . x; mmptr -> ptMaxPosition . y = t_workarea . y - t_viewport . y; } // MW-2007-07-27: In Windows 98 we need to clamp to 32767... mmptr -> ptMinTrackSize . x = minwidth + dx; mmptr -> ptMinTrackSize . y = minheight + dy; mmptr -> ptMaxTrackSize . x = MCU_min(32767, maxwidth + dx); mmptr -> ptMaxTrackSize . y = MCU_min(32767, maxheight + dy); }
// IM-2013-09-23: [[ FullscreenMode ]] Factor out device-specific window sizing MCRectangle MCStack::device_setgeom(const MCRectangle &p_rect) { uint32_t wstyle, exstyle; getstyle(wstyle, exstyle); RECT newrect = getwrect(p_rect, wstyle, exstyle); RECT wrect; GetWindowRect((HWND)window->handle.window, &wrect); MCRectangle t_old_rect; t_old_rect = MCWinRectToMCRect(wrect); LONG t_width = newrect.right - newrect.left; LONG t_height = newrect.bottom - newrect.top; if (t_old_rect.x != p_rect.x || t_old_rect.y != p_rect.y || t_old_rect.width != p_rect.width || t_old_rect.height != p_rect.height) { state |= CS_NO_CONFIG; MoveWindow((HWND)window->handle.window, newrect.left, newrect.top, t_width, t_height, True); state &= ~CS_NO_CONFIG; } return t_old_rect; }
void MCStack::setgeom() { if (MCnoui || !opened) return; // MW-2009-09-25: Ensure things are the right size when doing // remote dialog/menu windows. if (window == DNULL) { state &= ~CS_NEED_RESIZE; // MW-2011-08-18: [[ Redraw ]] Update to use redraw. MCRedrawLockScreen(); resize(rect . width, rect . height); MCRedrawUnlockScreen(); mode_setgeom(); return; } uint32_t wstyle, exstyle; getstyle(wstyle, exstyle); RECT newrect = getwrect(rect, wstyle, exstyle); RECT wrect; GetWindowRect((HWND)window->handle.window, &wrect); LONG cx = newrect.right - newrect.left; LONG cy = newrect.bottom - newrect.top; state &= ~CS_NEED_RESIZE; if (wrect.right - wrect.left != cx || wrect.bottom - wrect.top != cy || newrect.left != wrect.left || newrect.top != wrect.top) { state |= CS_NO_CONFIG; MoveWindow((HWND)window->handle.window, newrect.left, newrect.top, cx, cy, True); if (wrect.right - wrect.left != cx || wrect.bottom - wrect.top != cy) resize(uint2(wrect.right - wrect.left), uint2(wrect.bottom - wrect.top)); state &= ~CS_NO_CONFIG; } }
void MCStack::realize() { if (MCnoui) { start_externals(); return; } if (MCModeMakeLocalWindows()) { uint32_t wstyle, exstyle; loadwindowshape(); getstyle(wstyle, exstyle); RECT wrect ; // IM-2013-09-23: [[ FullscreenMode ]] Don't change stack rect if fullscreen /* CODE DELETED */ wrect = getwrect(rect, wstyle, exstyle); LONG x = wrect.left; LONG y = wrect.top; LONG width = wrect.right - wrect.left; LONG height = wrect.bottom - wrect.top; if (flags & F_WM_PLACE && !(state & CS_BEEN_MOVED)) x = CW_USEDEFAULT; window = new _Drawable; window->type = DC_WINDOW; window->handle.window = 0; // protect against creation callbacks // MW-2011-02-15: [[ Bug 9396 ]] Tooltips should have a shadow on Windows. Boolean isxpmenu = (mode == WM_PULLDOWN || mode == WM_POPUP || mode == WM_CASCADE || mode == WM_TOOLTIP) \ && (MCcurtheme && MCcurtheme->getthemeid() == LF_NATIVEWIN); // MW-2012-09-07: [[ Bug 10368 ]] If the 'no-shadow' bit is set, then we don't // want to use the menu class. if (getflag(F_DECORATIONS) && (decorations & WD_NOSHADOW) != 0) isxpmenu = False; HWND t_parenthwnd = NULL; // MW-2007-07-06: [[ Bug 3226 ]] If the platform is NT always create a Unicode window if ((MCruntimebehaviour & RTB_NO_UNICODE_WINDOWS) == 0 && !isxpmenu && mode < WM_PULLDOWN) window -> handle . window = (MCSysWindowHandle)CreateWindowExW(exstyle, MC_WIN_CLASS_NAME_W, WideCString(getname_cstring()),wstyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, x, y, width, height, t_parenthwnd, NULL, MChInst, NULL); else window->handle.window = (MCSysWindowHandle)CreateWindowExA(exstyle, isxpmenu? MC_MENU_WIN_CLASS_NAME: mode >= WM_PULLDOWN ? MC_POPUP_WIN_CLASS_NAME : MC_WIN_CLASS_NAME, getname_cstring(), wstyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, x, y, width, height, t_parenthwnd, NULL, MChInst, NULL); SetWindowLongA((HWND)window->handle.window, GWL_USERDATA, mode); if (flags & F_DECORATIONS && !(decorations & WD_SHAPE) && !(decorations & WD_CLOSE)) EnableMenuItem(GetSystemMenu((HWND)window->handle.window, False), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); if (m_window_shape != nil && m_window_shape -> is_sharp) { MCRegionRef t_region; t_region = (MCRegionRef)m_window_shape -> handle; MCRegionOffset(t_region, rect . x - wrect . left, rect . y - wrect . top); MCRegionSetAsWindowShape(t_region, window->handle.window); // The window now owns the region. m_window_shape -> handle = nil; } if ((m_window_shape == NULL || m_window_shape -> is_sharp) && blendlevel != 100) setopacity(blendlevel * 255 / 100); } start_externals(); }
// MW-2006-03-20: Bug 3316 - There seems absolutely no way of preventing flicker // when transitioning from no alpha to alpha. Therefore, we need to create a new // window opened *behind* the current window; show it; redraw it; then delete // the existing window. void MCStack::setopacity(uint1 p_level) { // If the stack is not ours to open, then we do nothing ('runtime' mode/remoteable // window). if (!MCModeMakeLocalWindows()) return; // Do nothing if not NT if (MCmajorosversion < 0x0500) return; if (m_window_shape != NULL && !m_window_shape -> is_sharp) composite(); else if (window != NULL) { HWND t_old_window; t_old_window = NULL; DWORD t_old_long, t_new_long; t_old_long = GetWindowLong((HWND)window -> handle . window, GWL_EXSTYLE); if (p_level == 255) t_new_long = t_old_long & ~WS_EX_LAYERED; else t_new_long = t_old_long | WS_EX_LAYERED; if (t_new_long != t_old_long) { if (IsWindowVisible((HWND)window -> handle . window) && (t_new_long & WS_EX_LAYERED) != 0) t_old_window = (HWND)window -> handle . window; else SetWindowLong((HWND)window -> handle . window, GWL_EXSTYLE, t_new_long); } if (t_old_window != NULL) { uint32_t t_style, t_ex_style; getstyle(t_style, t_ex_style); // MW-2006-07-27: [[ Bug 3690 ]] - Make sure layered attribute is set if we need it t_ex_style = (t_ex_style & ~WS_EX_LAYERED) | (t_new_long & WS_EX_LAYERED); RECT t_rect; t_rect = getwrect(rect, t_style, t_ex_style); Bool t_is_xp_menu; t_is_xp_menu = (mode == WM_PULLDOWN || mode == WM_POPUP || mode == WM_CASCADE) && (MCcurtheme && MCcurtheme->getthemeid() == LF_NATIVEWIN); if (!t_is_xp_menu && mode < WM_PULLDOWN) window -> handle . window = (MCSysWindowHandle)CreateWindowExW(t_ex_style, MC_WIN_CLASS_NAME_W, WideCString(getname_cstring()), t_style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, t_rect . left, t_rect . top, t_rect . right - t_rect . left, t_rect . bottom - t_rect . top, NULL, NULL, MChInst, NULL); else window -> handle . window = (MCSysWindowHandle)CreateWindowExA(t_ex_style, t_is_xp_menu ? MC_MENU_WIN_CLASS_NAME : mode >= WM_PULLDOWN ? MC_POPUP_WIN_CLASS_NAME : MC_WIN_CLASS_NAME, getname_cstring(), t_style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, t_rect . left, t_rect . top, t_rect . right - t_rect . left, t_rect . bottom - t_rect . top, NULL, NULL, MChInst, NULL); // MW-2010-10-22: [[ Bug 8151 ]] Make sure we update the title string. if (titlestring != nil) MCscreen -> setname(window, titlestring); SetWindowLongA((HWND)window->handle.window, GWL_USERDATA, mode); if (flags & F_DECORATIONS && !(decorations & WD_SHAPE) && !(decorations & WD_CLOSE)) EnableMenuItem(GetSystemMenu((HWND)window->handle.window, False), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); if (m_window_shape != nil && m_window_shape -> is_sharp) { MCRegionRef t_region; t_region = (MCRegionRef)m_window_shape -> handle; MCRegionOffset(t_region, rect . x - t_rect . left, rect . y - t_rect . top); MCRegionSetAsWindowShape(t_region, window->handle.window); // The window now owns the region. m_window_shape -> handle = nil; } RevokeDragDrop(t_old_window); CoLockObjectExternal(droptarget, FALSE, TRUE); droptarget -> setstack(NULL); droptarget -> setstack(this); CoLockObjectExternal(droptarget, TRUE, TRUE); RegisterDragDrop((HWND)window -> handle . window, droptarget); SetWindowPos((HWND)window -> handle . window, t_old_window, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_SHOWWINDOW); MCPlayer *t_player; for(t_player = MCplayers; t_player != NULL; t_player = t_player -> getnextplayer()) if (t_player -> getstack() == this) t_player -> changewindow((MCSysWindowHandle)t_old_window); } if (p_level < 255) SetLayeredWindowAttributes((HWND)window -> handle . window, 0, p_level, LWA_ALPHA); if (t_old_window != NULL) { RedrawWindow((HWND)window -> handle . window, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW); DestroyWindow(t_old_window); } } }