/*! * This function is used to determine if a control can be safely clipped * out of the parent window client area when it is repainted, usually * after a resize operation. * * @param layout Reference to a @c LAYOUTINFO structure for the control * * @return The return value is @c TRUE if clipping is supported by the * control, @c FALSE otherwise. * * @remarks The default implementation tries to identify @a clippable * windows by their class name and window style. * @n Override this function if you need a different behavior or if * you have custom controls that fail to be identified. * * @sa NeedsRefresh InitResizeProperties */ BOOL CResizableLayout::LikesClipping(const LAYOUTINFO& layout) const { if (layout.bMsgSupport) { CLIPPINGPROPERTY clipping; if (Send_LikesClipping(layout.hWnd, &clipping)) return clipping.bLikesClipping; } DWORD style = ::GetWindowLong(layout.hWnd, GWL_STYLE); // skip windows that wants background repainted if (0 == lstrcmp(layout.sWndClass, WC_BUTTON)) { CRect rect; switch (style & _BS_TYPEMASK) { case BS_GROUPBOX: return FALSE; case BS_OWNERDRAW: // ownerdraw buttons must return correct hittest code // to notify their transparency to the system and this library // or they could use the registered message (more reliable) ::GetWindowRect(layout.hWnd, &rect); ::SendMessage(layout.hWnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rect); if ( HTTRANSPARENT == ::SendMessage(layout.hWnd, WM_NCHITTEST, 0, MAKELPARAM(rect.left, rect.top)) ) return FALSE; break; } return TRUE; } else if (0 == lstrcmp(layout.sWndClass, WC_STATIC)) { switch (style & SS_TYPEMASK) { case SS_LEFT: case SS_CENTER: case SS_RIGHT: case SS_LEFTNOWORDWRAP: // text case SS_BLACKRECT: case SS_GRAYRECT: case SS_WHITERECT: // filled rects case SS_ETCHEDHORZ: case SS_ETCHEDVERT: // etched lines case SS_BITMAP: // bitmaps return TRUE; break; case SS_ICON: case SS_ENHMETAFILE: if (style & SS_CENTERIMAGE) return FALSE; return TRUE; break; default: return FALSE; } } // assume the others like clipping return TRUE; }
BOOL CResizableLayout::LikesClipping(const CResizableLayout::LayoutInfo& layout) { if (layout.bMsgSupport) { CLIPPINGPROPERTY clipping; if (Send_LikesClipping(layout.hWnd, &clipping)) return clipping.bLikesClipping; } //MPC-BE custom code start DWORD style = ::GetWindowLongPtr(layout.hWnd, GWL_STYLE); //MPC-BE custom code end // skip windows that wants background repainted if (layout.sWndClass == TOOLBARCLASSNAME && (style & TBSTYLE_TRANSPARENT)) return FALSE; else if (layout.sWndClass == WC_BUTTON) { CRect rect; switch (style & _BS_TYPEMASK) { case BS_GROUPBOX: return FALSE; case BS_OWNERDRAW: // ownerdraw buttons must return correct hittest code // to notify their transparency to the system and this library ::GetWindowRect(layout.hWnd, &rect); if ( HTTRANSPARENT == ::SendMessage(layout.hWnd, WM_NCHITTEST, 0, MAKELPARAM(rect.left, rect.top)) ) return FALSE; break; } return TRUE; } else if (layout.sWndClass == WC_STATIC) { switch (style & SS_TYPEMASK) { case SS_LEFT: case SS_CENTER: case SS_RIGHT: case SS_SIMPLE: case SS_LEFTNOWORDWRAP: // text case SS_BLACKRECT: case SS_GRAYRECT: case SS_WHITERECT: // filled rects case SS_ETCHEDHORZ: case SS_ETCHEDVERT: // etched lines case SS_BITMAP: // bitmaps return TRUE; break; case SS_ICON: case SS_ENHMETAFILE: if (style & SS_CENTERIMAGE) return FALSE; return TRUE; break; default: return FALSE; } } // assume the others like clipping return TRUE; }