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(); };