void debugview_info::set_bounds(RECT const &newbounds) { // account for the edges and set the bounds if (m_wnd) smart_set_window_bounds(m_wnd, GetParent(m_wnd), newbounds); // update update(); }
void memorywin_info::recompute_children() { // compute a client rect RECT bounds; bounds.top = bounds.left = 0; bounds.right = m_views[0]->prefwidth() + (2 * EDGE_WIDTH); bounds.bottom = 200; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); // clamp the min/max size set_maxwidth(bounds.right - bounds.left); // get the parent's dimensions RECT parent; GetClientRect(window(), &parent); // edit box gets half of the width RECT editrect; editrect.top = parent.top + EDGE_WIDTH; editrect.bottom = editrect.top + metrics().debug_font_height() + 4; editrect.left = parent.left + EDGE_WIDTH; editrect.right = parent.left + ((parent.right - parent.left) / 2) - EDGE_WIDTH; // combo box gets the other half of the width RECT comborect; comborect.top = editrect.top; comborect.bottom = editrect.bottom; comborect.left = editrect.right + (2 * EDGE_WIDTH); comborect.right = parent.right - EDGE_WIDTH; // memory view gets the rest RECT memrect; memrect.top = editrect.bottom + (2 * EDGE_WIDTH); memrect.bottom = parent.bottom - EDGE_WIDTH; memrect.left = parent.left + EDGE_WIDTH; memrect.right = parent.right - EDGE_WIDTH; // set the bounds of things m_views[0]->set_bounds(memrect); set_editwnd_bounds(editrect); smart_set_window_bounds(m_combownd, window(), comborect); }
void debugview_info::update() { RECT bounds, vscroll_bounds, hscroll_bounds; debug_view_xy totalsize, visiblesize, topleft; bool show_vscroll, show_hscroll; SCROLLINFO scrollinfo; // get the view window bounds GetClientRect(m_wnd, &bounds); visiblesize.x = (bounds.right - bounds.left) / metrics().debug_font_width(); visiblesize.y = (bounds.bottom - bounds.top) / metrics().debug_font_height(); // get the updated total rows/cols and left row/col totalsize = m_view->total_size(); topleft = m_view->visible_position(); // determine if we need to show the scrollbars show_vscroll = show_hscroll = false; if (totalsize.x > visiblesize.x && bounds.bottom >= metrics().hscroll_height()) { bounds.bottom -= metrics().hscroll_height(); visiblesize.y = (bounds.bottom - bounds.top) / metrics().debug_font_height(); show_hscroll = true; } if (totalsize.y > visiblesize.y && bounds.right >= metrics().vscroll_width()) { bounds.right -= metrics().vscroll_width(); visiblesize.x = (bounds.right - bounds.left) / metrics().debug_font_width(); show_vscroll = true; } if (!show_vscroll && totalsize.y > visiblesize.y && bounds.right >= metrics().vscroll_width()) { bounds.right -= metrics().vscroll_width(); visiblesize.x = (bounds.right - bounds.left) / metrics().debug_font_width(); show_vscroll = true; } // compute the bounds of the scrollbars GetClientRect(m_wnd, &vscroll_bounds); vscroll_bounds.left = vscroll_bounds.right - metrics().vscroll_width(); if (show_hscroll) vscroll_bounds.bottom -= metrics().hscroll_height(); GetClientRect(m_wnd, &hscroll_bounds); hscroll_bounds.top = hscroll_bounds.bottom - metrics().hscroll_height(); if (show_vscroll) hscroll_bounds.right -= metrics().vscroll_width(); // if we hid the scrollbars, make sure we reset the top/left corners if (topleft.y + visiblesize.y > totalsize.y) topleft.y = std::max(totalsize.y - visiblesize.y, 0); if (topleft.x + visiblesize.x > totalsize.x) topleft.x = std::max(totalsize.x - visiblesize.x, 0); // fill out the scroll info struct for the vertical scrollbar scrollinfo.cbSize = sizeof(scrollinfo); scrollinfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; scrollinfo.nMin = 0; scrollinfo.nMax = totalsize.y - 1; scrollinfo.nPage = visiblesize.y; scrollinfo.nPos = topleft.y; SetScrollInfo(m_vscroll, SB_CTL, &scrollinfo, TRUE); // fill out the scroll info struct for the horizontal scrollbar scrollinfo.cbSize = sizeof(scrollinfo); scrollinfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; scrollinfo.nMin = 0; scrollinfo.nMax = totalsize.x - 1; scrollinfo.nPage = visiblesize.x; scrollinfo.nPos = topleft.x; SetScrollInfo(m_hscroll, SB_CTL, &scrollinfo, TRUE); // update window info visiblesize.y++; visiblesize.x++; m_view->set_visible_size(visiblesize); m_view->set_visible_position(topleft); // invalidate the bounds InvalidateRect(m_wnd, nullptr, FALSE); // adjust the bounds of the scrollbars and show/hide them if (m_vscroll) { if (show_vscroll) smart_set_window_bounds(m_vscroll, m_wnd, vscroll_bounds); smart_show_window(m_vscroll, show_vscroll); } if (m_hscroll) { if (show_hscroll) smart_set_window_bounds(m_hscroll, m_wnd, hscroll_bounds); smart_show_window(m_hscroll, show_hscroll); } }
void editwin_info::set_editwnd_bounds(RECT const &bounds) { smart_set_window_bounds(m_editwnd, window(), bounds); }