vs2017VC++_MFC_窗口控件隨窗口大小自適應-最大化與還原
vs2017VC++_MFC_窗口控件隨窗口大小自適應-最大化與還原
https://blog.csdn.net/txwtech/article/details/108312478
1、首先在OnInitDialog函數中獲取窗口位置坐標
BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將“關於...”菜單項添加到系統菜單中。 // IDM_ABOUTBOX 必須在系統命令范圍內。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動 // 執行此操作 SetIcon(m_hIcon, TRUE); // 設置大圖標 SetIcon(m_hIcon, FALSE); // 設置小圖標 // TODO: 在此添加額外的初始化代碼 CRect rect; GetClientRect(&rect); //取客戶區大小 old.x = rect.right - rect.left; //Point old,用於記錄窗口原始坐標 old.y = rect.bottom - rect.top; //ShowWindow(SW_MAXIMIZE); return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }
2、在窗口變化Onsize函數中進行位置重置(CTRL+SHIFT+X)
void CMFCApplication1Dlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); if (nType != SIZE_MINIMIZED) ReSize(); // TODO: 在此處添加消息處理程序代碼 }
3、ReSize函數對所有控件進行布局
void CMFCApplication1Dlg::ReSize() { // TODO: 在此處添加實現代碼. float FirstPos[2]; POINT Newp; //獲取現在對話框的大小 CRect recta; GetClientRect(&recta); //取客戶區大小 Newp.x = recta.right - recta.left; Newp.y = recta.bottom - recta.top; FirstPos[0] = (float)Newp.x / old.x; FirstPos[1] = (float)Newp.y / old.y; CRect Rect; int woc; CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while (hwndChild) { woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*FirstPos[0]); TLPoint.y = long(OldTLPoint.y*FirstPos[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *FirstPos[0]); BRPoint.y = long(OldBRPoint.y *FirstPos[1]); Rect.SetRect(TLPoint, BRPoint); GetDlgItem(woc)->MoveWindow(Rect, TRUE); hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT); } old = Newp; }
頭文件相關信息:
class CMFCApplication1Dlg : public CDialogEx { // 構造 public: CMFCApplication1Dlg(CWnd* pParent = nullptr); // 標准構造函數 // 對話框數據 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MFCAPPLICATION1_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 實現 protected: HICON m_hIcon; // 生成的消息映射函數 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedOk(); afx_msg void OnSize(UINT nType, int cx, int cy); void ReSize();//txwtech POINT old;//txwtech CRect m_DlgRect; //txwtech void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height); afx_msg void OnBnClickedButton2(); };