使用scrollview 时,自动滚动条和视图大于子view时居中显示
<group text="模板预览" size="-2,0" weight="1" layout="vbox"><scrollview name="sv_preview" size="-2,0" weight="1" viewSize="-1,-1" layout="vbox" gravity="center"><img name="wnd_preview" size="-1,-1"/></scrollview>
</group>
使用scrollview 似乎没有好方法使它同时在小尺寸时显示滚动条,大尺寸时又自动使用scrollview 尺寸来实现布局。我先说一下我的需求,预览窗口的子视图大小不确定,当scrollview 无法显示全子视图时需要显示滚动条。大scrollview 尺寸大于子视图时又能正确使用布局(我这里是居中显示)
研究了一下源码,似乎它本身并不支持这个操作,如果需要还需要修改源码,本着能外不内的原则 在外面处理,勉强达到了效果,如果有更好办法欢迎讨论。
void OnPreviewSizeChanged(EventArgs *e);
EVENT_ID_HANDLER(R.id.wnd_preview, EventSwndSize::EventID, OnPreviewSizeChanged)
EVENT_ID_HANDLER(R.id.sv_preview, EventSwndSize::EventID, OnPreviewSizeChanged)
void CMainDlg::OnPreviewSizeChanged(EventArgs *e)
{SScrollView *pScrollView = FindChildByID2<SScrollView>(R.id.sv_preview);CRect szPreviewImgSize = pScrollView->FindChildByID2<SImageWnd>(R.id.wnd_preview)->GetWindowRect();CRect szPreviewSize = pScrollView->GetClientRect();pScrollView->GetEventSet()->setMutedState(TRUE);if (szPreviewImgSize.Width() > szPreviewSize.Width()){pScrollView->SetAttribute(L"viewSize", L"-1,-1");}else{pScrollView->SetAttribute(L"viewSize", L"-2,-1");}pScrollView->RequestRelayout();pScrollView->UpdateLayout();pScrollView->GetEventSet()->setMutedState(FALSE);
}
同时处理SScrollView和子视图大小变化事件,动态设置viewSize
QQ录屏20251003092222