MFC怎么让主窗口随View类改变大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC怎么让主窗口随View类改变大小相关的知识,希望对你有一定的参考价值。

我有一个SDI程序,View类用来显示图片。希望View的大小和图片大小(例如800*600)重合,而主窗口被动地随着View改变。
如果直接用GetParentFrame()->MoveWindow(0,0,800,600),结果是主窗口大小为800*600,但是view的大小被压缩导致图片变模糊

参考技术A   刚接触MFC不久,对MFC的许多函数和功能还不是很了解。所以,在仿照书本开发一个仿QQ的通讯程序的时候,就碰到了一个怎么样使控件随着窗体变化的问题。好了,废话不多说,直接上主窗体图:

  现在,要实现的功能如下:
  使控件CLISTBOX类对象窗口(IDC_QQLISTBOX)以及两个CBUTTON类对象(IDC_MAIL)、(IDC_WEB)随着主窗体的变化而自动变化。
  具体操作步骤:
  1、在主对话框类class CQQDlg : public CDialog中添加对象CRect m_rect,用来记录当前对话框的大小。并在初始化函数OnInitialDialog()中获取该大小GetClientRect (&m_rect);值得注意的是,初始化函数中的这一步并不是必须的,而且如果是在主窗体生成前使用此函数,还可能会报错,故建议不要这个操作。
  2、使用Ctrl+W快捷键弹出MFC ClassWizard窗体,选择主窗体ID,并在Message Map选项中选择WM_SIZE,点击确定,成功添加了OnSize()函数。它的作用在于系统会自动检测窗体的变化情况,一旦发生变化,立即自动调用该函数。如下图所示:

  3、定义OnSize()函数,代码如下:
  void CQQDlg::OnSize(UINT nType, int cx, int cy)

CDialog::OnSize(nType, cx, cy);
  / / nType==1不可以省略,否则由最小化恢复为正常状态下的时候会出错
  //nType是一个枚举类型,主要是指定所请求的不同的调整大小。这个参数可以是下列值之一:SIZE_MAXIMIZED、SIZE_MINIMIZED 。SIZE_RESTORED , SIZE_MAXHIDE ,SIZE_MAXSHOW 其原型可以在msdn上查看

if(nType==1) return; //最小化则什么都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_QQLIST); //获取控件句柄
ChangeSize(pWnd,cx,cy); //调用changesize()函数
pWnd = GetDlgItem(IDC_WEB); //获取控件句柄
ChangeSize(pWnd,cx,cy);//调用changesize()函数
  //ChangeSize(pWnd,cx,cy)是一个自定义的函数,需要在类的protect属性中进行添加声明afx_msg void ChangeSize(CWnd * pWnd, int cx, int cy);
pWnd = GetDlgItem(IDC_MAIL);
ChangeSize(pWnd,cx,cy);
GetClientRect(&m_rect); //将变化后的对话框设置为旧大小

void CQQDlg::ChangeSize(CWnd * pWnd, int cx, int cy)

if (pWnd)

CRect rect;
pWnd->GetWindowRect(&rect); //获取控件变化前的大小
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
rect.left=rect.left*cx/m_rect.Width();//调整控件大小 ,cx/m_rect.Width()为对话框在横向的变化比例
rect.right=rect.right*cx/m_rect.Width(); //cx存储的是变化后的宽度,cy存储的是变化后的高度
rect.top=rect.top*cy/m_rect.Height(); //m_rect.height()表示的是变化前主窗体的高度
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//设置控件大小


  注意:GetWindowRect()与GetClientRect(),ScreenToClient()与ClientToScreen()之间的区别
  1、GetWindowRect() 是获得窗口在屏幕坐标系下的RECT坐标,包括非客户区(标题栏和下面的其它边框)和客户区(矩形区域),从而得到窗口的大小和相对屏幕左上角(0,0)的坐标。
  2、GetClientRect() 取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的
  3、ScreenToClient():把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。
  4、 ClientToScreen():把客户区下Rect坐标系转化为屏幕坐标系下的坐标
  对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,left,top是窗口的左上角的坐标,相对窗口客户区左上角。

对GetClientRect取得的矩阵ClientToScreen后,矩阵的大小也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。追问

我想问的是让主窗口随view改变,不是让它们随主窗口改变。

MFC编程 -- 编辑框随窗口改变大小

一、源代码

1、需要WM_SIZE消息

case WM_SIZE:
     return 控件随窗口改变大小(hwndDlg,wParam,lParam);

2、实现代码

int 控件随窗口改变大小(HWND hDlg, WPARAM wParam, LPARAM lParam)

    HWND 编辑框句柄 = GetDlgItem(hDlg, IDC_EDIT1);//返回编辑框的句柄
    int x = LOWORD(lParam);//获取窗口右下角x坐标
    int y = HIWORD(lParam);//获取窗口右下角y坐标
    MoveWindow(编辑框句柄, 0, 0, x, y, true);//编辑框移动
    return 0;

二、运行效果

欢迎关注编程有你公众号,每天学点编程知识

 

以上是关于MFC怎么让主窗口随View类改变大小的主要内容,如果未能解决你的问题,请参考以下文章

mfc 窗口大小变化时,如何让窗口内部控件也一起随比例改变位置?

MFC改变 随着控件大小变化 改变控件字体的大小

MFC中怎么让子窗体大小随着父窗口的大小变化而改变?

MFC编程 -- 编辑框随窗口改变大小

MFC中TabCtrl控件怎么随着窗体的大小变化而变化?

MFC中TabCtrl控件怎么随着窗体的大小变化而变化?