// 移動・リサイズとなるアンカー値をメンバ変数とする。(画面上の一番右下のコントロールを基準とする。) int m_nBottomMargin; int m_nRightMargin; // 初期化処理(OnInitDialog()等)時、アンカー値を設定する。 if (GetSafeHwnd()) { CRect rcDlg, rcCtrl; GetWindowRect(&rcDlg); GetClientRect(&rcDlg); ctrlBase.GetWindowRect(&rcCtrl); ScreenToClient(&rcCtrl); m_nBottomMargin = rcDlg.bottom - rcCtrl.bottom; m_nRightMargin = rcDlg.right - rcCtrl.right; } // ウィンドウリサイズ(OnSize())時において、各コントロールに対して移動・リサイズ処理を実装する。 void CTimerDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_ctrlBase.GetSafeHwnd() && m_ctrlX.GetSafeHwnd() && m_ctrlY.GetSafeHwnd() && m_ctrlXY.GetSafeHwnd() && m_ctrlH.GetSafeHwnd() && m_ctrlV.GetSafeHwnd() && m_ctrlHV.GetSafeHwnd()) { CRect rc; ctrlBase.GetWindowRect(&rc); ScreenToClient(&rc); // X軸移動量取得 int nXOffSet = cx - m_nRightMargin - rc.right; // Y軸移動量取得 int nYOffSet = cy - m_nBottomMargin - rc.bottom; // X移動 m_ctrlX.GetWindowRect(&rc); ScreenToClient(&rc); rc.OffsetRect(nXOffSet, 0); m_ctrlX.MoveWindow(&rc); m_ctrlX.Invalidate(FALSE); // Y移動 m_ctrlY.GetWindowRect(&rc); ScreenToClient(&rc); rc.OffsetRect(0, nYOffSet); m_ctrlY.MoveWindow(&rc); m_ctrlY.Invalidate(FALSE); // XY移動 m_ctrlXY.GetWindowRect(&rc); ScreenToClient(&rc); rc.OffsetRect(nXOffSet, nYOffSet); m_ctrlXY.MoveWindow(&rc); m_ctrlXY.Invalidate(FALSE); // 横可変 m_ctrlH.GetWindowRect(&rc); ScreenToClient(&rc); rc.right = rc.right + nXOffSet; m_ctrlH.MoveWindow(&rc); m_ctrlH.Invalidate(FALSE); // 縦可変 m_ctrlV.GetWindowRect(&rc); ScreenToClient(&rc); rc.bottom = rc.bottom + nYOffSet; m_ctrlV.MoveWindow(&rc); m_ctrlV.Invalidate(FALSE); // 横可変、縦可変 m_ctrlHV.GetWindowRect(&rc); ScreenToClient(&rc); rc.right = rc.right + nXOffSet; rc.bottom = rc.bottom + nYOffSet; m_ctrlHV.MoveWindow(&rc); m_ctrlHV.Invalidate(FALSE); } }