void SystemInfoView::Update() { switch (m_refresh) { case REFRESH_ALL: SystemChanged(Pi::sectorView->GetSelected()); m_refresh = REFRESH_NONE; assert(NeedsRefresh() == REFRESH_NONE); break; case REFRESH_SELECTED: UpdateIconSelections(); m_refresh = REFRESH_NONE; assert(NeedsRefresh() == REFRESH_NONE); break; case REFRESH_NONE: break; } UIView::Update(); }
void SystemInfoView::OnSwitchTo() { if (m_refresh != REFRESH_ALL) { RefreshType needsRefresh = NeedsRefresh(); if (needsRefresh != REFRESH_NONE) m_refresh = needsRefresh; } UIView::OnSwitchTo(); }
/*! * @internal This function calculates the new size and position of a * control in the layout and flags for @c SetWindowPos */ void CResizableLayout::CalcNewChildPosition(const LAYOUTINFO& layout, const CRect &rectParent, CRect &rectChild, UINT& uFlags) const { CWnd* pParent = GetResizableWnd(); ::GetWindowRect(layout.hWnd, &rectChild); ::MapWindowPoints(NULL, pParent->m_hWnd, (LPPOINT)&rectChild, 2); CRect rectNew; // calculate new top-left corner rectNew.left = layout.marginTopLeft.cx + rectParent.Width() * layout.anchorTopLeft.cx / 100; rectNew.top = layout.marginTopLeft.cy + rectParent.Height() * layout.anchorTopLeft.cy / 100; // calculate new bottom-right corner rectNew.right = layout.marginBottomRight.cx + rectParent.Width() * layout.anchorBottomRight.cx / 100; rectNew.bottom = layout.marginBottomRight.cy + rectParent.Height() * layout.anchorBottomRight.cy / 100; // adjust position, if client area has been scrolled rectNew.OffsetRect(rectParent.TopLeft()); // get the refresh property BOOL bRefresh = layout.properties.bAskRefresh ? NeedsRefresh(layout, rectChild, rectNew) : layout.properties.bCachedNeedsRefresh; // set flags uFlags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREPOSITION; if (bRefresh) uFlags |= SWP_NOCOPYBITS; if (rectNew.TopLeft() == rectChild.TopLeft()) uFlags |= SWP_NOMOVE; if (rectNew.Size() == rectChild.Size()) uFlags |= SWP_NOSIZE; // update rect rectChild = rectNew; }
void CResizableLayout::AddAnchor(HWND hWnd, CSize sizeTypeTL, CSize sizeTypeBR) { CWnd* pParent = GetResizableWnd(); // child window must be valid ASSERT(::IsWindow(hWnd)); // must be child of parent window ASSERT(::IsChild(pParent->GetSafeHwnd(), hWnd)); // top-left anchor must be valid ASSERT(sizeTypeTL != NOANCHOR); // get control's window class CString st; GetClassName(hWnd, st.GetBufferSetLength(MAX_PATH), MAX_PATH); st.ReleaseBuffer(); st.MakeUpper(); // add the style 'clipsiblings' to a GroupBox // to avoid unnecessary repainting of controls inside if (st == "BUTTON") { DWORD style = GetWindowLong(hWnd, GWL_STYLE); if ((style & 0x0FL) == BS_GROUPBOX) SetWindowLong(hWnd, GWL_STYLE, style | WS_CLIPSIBLINGS); } // window classes that don't redraw client area correctly // when the hor scroll pos changes due to a resizing BOOL hscroll = FALSE; if (st == "LISTBOX") hscroll = TRUE; // window classes that need refresh when resized BOOL refresh = NeedsRefresh(hWnd); // get parent window's rect CRect rectParent; GetTotalClientRect(&rectParent); // and child control's rect CRect rectChild; ::GetWindowRect(hWnd, &rectChild); pParent->ScreenToClient(&rectChild); // go calculate margins CSize sizeMarginTL, sizeMarginBR; if (sizeTypeBR == NOANCHOR) sizeTypeBR = sizeTypeTL; // calculate margin for the top-left corner sizeMarginTL.cx = rectChild.left - rectParent.Width() * sizeTypeTL.cx / 100; sizeMarginTL.cy = rectChild.top - rectParent.Height() * sizeTypeTL.cy / 100; // calculate margin for the bottom-right corner sizeMarginBR.cx = rectChild.right - rectParent.Width() * sizeTypeBR.cx / 100; sizeMarginBR.cy = rectChild.bottom - rectParent.Height() * sizeTypeBR.cy / 100; // add to the list LayoutInfo layout(hWnd, sizeTypeTL, sizeMarginTL, sizeTypeBR, sizeMarginBR, hscroll, refresh); // always add to head (before callbacks) m_arrLayout.InsertAt(0, layout); }