父类 void CDlgXXXX::InitUIRes(CString strCatCode) { if (NULL == m_pDlgSub_) { m_pDlgSub_ = new CDlgFilterSub(this); m_pDlgSub_->Create(CDlgFilterSub::IDD, this); } m_pDlgSub_->InitUI(strCatCode); CRect rtClient; GetWindowRect(&rtClient); CRect rtDlg; m_pDlgSub_->GetClientRect(&rtDlg); rtDlg.MoveToY(40); rtDlg.left = 0; rtDlg.right = rtClient.Width(); m_pDlgSub_->MoveWindow(rtDlg); m_pDlgSub_->GetWindowRect(&rtDlg); rtClient.bottom = rtDlg.bottom + 10; MoveWindow(rtClient); if (!m_pDlgSub_->IsWindowVisible()) { m_pDlgSub_->ShowWindow(SW_SHOW); } }
子窗口
void CDlgFilterSub::InitUI(CString strCatCode) { 。。。。动态添加按钮
CRect rtClient;
GetClientRect(rtClient);
rtCtrl最后一排控件的位置
SCROLLINFO si;
si.cbSize = sizeof(si);
GetScrollInfo(SB_VERT, &si);
si.nMax = max(rtCtrl.bottom + SPACE, rtClient.bottom);
si.nPos = 0;
SetScrollInfo(SB_VERT, &si);
static int iHeight = rtClient.bottom;
if (rtClient.bottom < rtCtrl.bottom + SPACE)
{
rtClient.bottom = iHeight;
}
else
{
rtClient.bottom = rtCtrl.bottom + SPACE;
}
MoveWindow(rtClient);
}
子窗口的初始化
BOOL CDlgFilterSub::OnInitDialog() { CBCGPDialog::OnInitDialog(); COLORREF bgColor = RGB(248, 248, 248); SetBackgroundColor(bgColor); CRect rtClient; GetClientRect(rtClient); SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_ALL; si.nPos = 0; si.nMin = 0; si.nMax = rtClient.bottom; SetScrollInfo(SB_VERT, &si); return TRUE; }
void CDlgFilterSub::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { SCROLLINFO si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(SB_VERT, &si); INT nVscroll = si.nPos; switch(nSBCode) { case SB_LINEDOWN: { nVscroll += 20; if (nVscroll > (si.nMax - si.nMin - si.nPage )) { nVscroll = si.nMax - si.nMin - si.nPage; } } break; case SB_LINEUP: { nVscroll -= 20; if (nVscroll < si.nMin) { nVscroll = 0; } } break; case SB_PAGEDOWN: { nVscroll += si.nPage; if (nVscroll > (si.nMax - si.nMin - si.nPage)) { nVscroll = si.nMax - si.nMin - si.nPage; } } break; case SB_PAGEUP: { nVscroll -= si.nPage; if (nVscroll < si.nMin) { nVscroll = 0; } } break; case SB_THUMBTRACK: { nVscroll = nPos; } break; } if (si.nPos != nVscroll) { int yAmount = -(nVscroll - si.nPos); ScrollWindow(0, yAmount, NULL,NULL); } si.nPos = nVscroll; SetScrollInfo(SB_VERT, &si); CBCGPDialog::OnVScroll(nSBCode, nPos, pScrollBar); }
ON_WM_VSCROLL()
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);