当前位置:首页 > 芯闻号 > 充电吧
[导读]MFC控件随着窗口大小变化VC++刚接触MFC不久,对MFC的许多函数和功能还不是很了解。所以,在仿照书本开发一个仿QQ的通讯程序的时候,就碰到了一个怎么样使控件随着窗体变化的问题。好了,废话不多说,

MFC控件随着窗口大小变化VC++

刚接触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。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

最近一直在研究mod音乐,很好玩,和midi差不多,mod音乐也细分为很多格式,如it,xm,mod等,如果你使用过keygen,那你一定听过那 里面的动听音乐吧~呵呵~撒卡也是因此而着迷,上高中的时

关键字: vc++ mod音乐

作者:天涯霜雪 一、概念和区别在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表。系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口。这个数据结构中有四个数据用来

关键字: mfc

AFX_MANAGE_STATE(AfxGetStaticModuleState())  先看一个例子:1、创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源。指定该对话框ID如下

关键字: mfc

Windows系统是一个消息驱动的操作系统,消息是应用程序与操作系统交互的手段。消息的产生来源于系统事件和用户事件,Windows用消息来调入和关闭应用程序。例如在关机操作中,Windows给所有正在

关键字: mfc

一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。下 面这节内容主要是一般的框架,然后再讲多线程中的指针使用

关键字: mfc

MFC是一个类库, 是别人写好的一套源码,实现了对系统API调用的封装,与其辛苦学习使用别人设计的类库,不如好好学习一下其实现原理,一个EXE窗口程序运行后,由系统载入调用的函数过程如下:一、调用VC

关键字: mfc

  动态链接库:DLL(Dynamic Linkable Library)     kernel32.dll处理内存管理和进程调度 user32.dll控制用户界面 gdi32.dll图形处理   w

关键字: dll mfc

今天在调试一个程序时,发现调用 SendMessage() 发送的消息,PreTranslateMessage() 接收不到;试了其它两个方法:(1) 换成 PostMessage() 来广播消息,则

关键字: mfc

1、命令消息(WM_COMMAND所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。 2、Window消息(WM_xxx) 所有派生自 CWnd 的类都有资格接受 WM_xxx。

关键字: mfc 命令消息 window消息

vc++ 中开发汇编语言 汇编程序结构 一个显示字符串的汇编程序程序格式 一、模式定义二、includelib语句三、函数声明语句四、数据和代码部分Visual C/C++环境 建立工程汇编程序的调试

关键字: vc++ 汇编语言
关闭
关闭