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

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

第1个回答  2016-08-24
  刚接触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怎么让主窗口随View类改变大小
1、在主对话框类class CQQDlg : public CDialog中添加对象CRect m_rect,用来记录当前对话框的大小。并在初始化函数OnInitialDialog()中获取该大小GetClientRect (&m_rect);值得注意的是,初始化函数中的这一步并不是必须的,而且如果是在主窗体生成前使用此函数,还可能会报错,故建议不要这个操作。

MFC 如何改变视图大小
如果是单文档,要修改主框架cmainframe的属性 如果是多文档,要修改自框架cmdichildframe的属性 如果是分割视图,还有修改csplit分隔条的属性 视图的大小是有框架控制的,不能去修改view的属性来控制。修改方法很多,可以在创建的时候直接写上去,也可以在初始化函数中调用窗口属性设置函数,如:setwindowlong\/...

单文档view窗口如何最大化,充满整个屏幕(MFC)
先获取视图当前相对于屏幕的位置,然后再获取整个框架相对于屏幕的位置,计算出两者left和top,right, bottom的偏移量,然后按照这个偏移量用SetWindowPos函数对整个框架放大并移动即可.假如框架当前坐标为2, 2, 100,100 视图坐标为 3, 3, 99, 99, 那么各偏移量为 -1 -1 1 1.因此你需要将框架的...

MFC 如何设置CView最大化
一般是在主框架类做最大化(当然最好的是在程序入口处设置)估计你的需求,应该是多文档的,这里就需要注意,每个View对应一个子框架,View的最大化,实际是子框架窗口的最大化。在childframe类中用向导添加函数activateframe,然后添加如上代码即可。

vc++编程:在MFC单文档编程中如何获取view类窗口的大小
在MFC中,View视图类窗口的大小有两个,一个是可视窗口大小,一个是逻辑窗口大小。在没有滚动条的情况下,两个大小相同,使用GetClientRect就可以获取大小:CRect rt;GetClientRect(&rt);需要注意的是,CScrollView这个视图类,在有滚动条的情况下,通过上述代码获取的是可视窗口大小,而不是完整窗口尺寸...

VC++如何改变运行窗口的大小
这里不应当是“可改变窗口大小”,而是“使窗口内容可滚动显示”。在VC++里边,你可以使用MFC,将你自己的View类的基类由CView改为CScrollView,并相应设置即可。

MFC单文档怎么设置窗口大小的下限,例如就是窗口的尺寸必须大于等于800...
可以用滚动视图CSrcollView,设置滚动范围800*600,这样即使窗口缩小了,实际客户区仍有这么大;可以禁止系统菜单的放缩和最大化,通过MoveWindow或者初始化窗口属性cs变量固定窗口大小,不可缩小也不可放大;截获框架CMainFrame的OnSize,在里面强行设置(不推荐,效果不好)void CMainFrame::OnSize(UINT n...

mfc中加载图片自动调整view客户区大小为图片的大小,我是想让view去适 ...
根据图片大小调整显示图片的窗口大小然后再显示图片。

MFC中CView和CWnd作为客户区是怎样自动填充MainFrame的空闲区的_百度知...
你将你的自定义menu\/toolbar添加至主框架的时候,MFC就已经知道了此控件的指针地址,根据此指针即可知道你menu\/toolbar,甚至toolbar上的edit,list,的小色,状态等等,那么自然的主框架的大小也知道了。。gdi32,user32是程序执行必须依赖的,自然系统就可知道屏幕的总大小。有了这些量,窗口起点坐标(...

如何最大化窗口
1. 窗口的最大化 修改MFC的窗口界面的外观,修改MFC窗口的外观要用到类风格(CS_XXXX)和窗口风格(WS_XXXX),MFC在WinMain函数的最开始都定义了WNDCLASS窗口类,该类可以改变窗口的图标,背景,光标等;若要改变窗口的大小,一般在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中修改构造类cs的值,...

相似回答