• MFC 控件随窗口尺寸变化自动调整位置及大小


    在MFC对话框编程过程中经常会出现这样一个问题,在给窗口做尺度变换后,原来的控件位置和大小并没有跟着变,导致界面看起来极不协调,如下:

      

    要解决这个问题,可在类结构体中声明一个CRect变量以存储之前窗体大小的信息,如下:

    CRect m_DlgRect;//存储对话框改变前大小,以供计算控件相应位置及大小时使用
    在对话框的构造函数中初始化该变量

    m_DlgRect.SetRect(0, 0, 0, 0);//初始化对话框大小存储变量

    在类结构体中声明重绘函数,用于更新控件大小和位置

    void repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height);

    在cpp中实例化该函数

    void CMFC_SIZE_TESTDlg::repaint(UINT id, int last_Width, int now_Width, int last_Height, int now_Height)//更新控件位置和大小函数,可以根据需要自行修改
    {
    	CRect rect;
    	CWnd *wnd = NULL;
    	wnd = GetDlgItem(id);
    	if (NULL == wnd)
    	{
    		MessageBox(_T("相应控件不存在"));
    	}
    	wnd->GetWindowRect(&rect);
    	ScreenToClient(&rect);
    	rect.left = (long)((double)rect.left / (double)last_Width*(double)now_Width);
    	rect.right = (long)((double)rect.right / (double)last_Width*(double)now_Width);
    	rect.top = (long)((double)rect.top / (double)last_Height*(double)now_Height);
    	rect.bottom = (long)((double)rect.bottom / (double)last_Height*(double)now_Height);
    	wnd->MoveWindow(&rect);
    }
    添加对话框消息WM_SIZE的响应函数,如下

    void CMFC_SIZE_TESTDlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialogEx::OnSize(nType, cx, cy);
    
    	if (0 == m_DlgRect.left && 0 == m_DlgRect.right
    		&& 0 == m_DlgRect.top && 0 == m_DlgRect.bottom)//第一次启动对话框时的大小变化不做处理
    	{
    	}
    	else
    	{
    		if (0 == cx && 0 == cy)//如果是按下了最小化,则触发条件,这时不保存对话框数据
    		{
    			return;
    		}
    		CRect rectDlgChangeSize;
    		GetClientRect(&rectDlgChangeSize);//存储对话框大小改变后对话框大小数据
    
    		repaint(IDC_STATIC, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());//重绘函数,用以更新对话框上控件的位置和大小
    		repaint(IDOK, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
    		repaint(IDCANCEL, m_DlgRect.Width(), rectDlgChangeSize.Width(), m_DlgRect.Height(), rectDlgChangeSize.Height());
    	}
    	GetClientRect(&m_DlgRect); //save size of dialog
    	Invalidate();//更新窗口
    }

    OK,到此完成了所有相关工作,效果如下:





  • 相关阅读:
    vue 中input的输入限制
    PC端百度地理围栏、绘制工具以及判断当前坐标是否再围栏中
    js判断鼠标点击的是哪个键
    vue过滤器的使用
    3.Mybatis的配置解析
    2.MyBatis的CRUD操作
    4.JVM类加载器深入解析及重要特性剖析
    3.JVM的接口初始化规则与类加载器准备阶段和初始化阶段的重要意义分析
    2.JVM的类加载器
    1.JVM如何学习
  • 原文地址:https://www.cnblogs.com/weixinhum/p/3916699.html
Copyright © 2020-2023  润新知