CFormView动态调整对话框的尺寸并成比例调整部署控件

基于单文档的CFormView动态调整对话框的尺寸并成比例调整部署控件

如果你正在开发基于单文档程序,使用了CFormView基类实现多个窗口的显示,那么这个文档可能会给你提供些许帮助。

一、实现对话框填充客户区

当我们添加了资源对话框时,它的尺寸在客户区显示时是不会随着窗口的大小调整的,当框架尺寸小于它的尺寸时,还出现了滚动条,操作麻烦同时视觉效果也不良好。

思路

根据客户区的大小调整资源对话框的大小,而客户区大小由父级的框架进行设定。

步骤

1、 根据屏幕分辨率设定框架的尺寸

请注意,我们不能将在InitInstance中ShowWindow参数SW_SHOW 直接改为SW_SHOWMAXIMIZED。虽然窗口是最大化了但是我们的在CFormView中使用GetClientRect可以看到客户区的尺寸仍然是原来的大小。

如果在PreCreateWindow或者OnCreate函数中设定框架的尺寸时,发现并没有起到作用。

正确的方法是在MainFrame中重载OnGetMinMaxInfo,并根据屏幕分辨率设定窗口的尺寸。

//依据屏幕分辨率设置框架大小

voidCMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)

{

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    int cx = GetSystemMetrics(SM_CXSCREEN);

    int cy = GetSystemMetrics(SM_CYSCREEN);

    lpMMI->ptMinTrackSize.x= cx;

    lpMMI->ptMaxTrackSize.x = cx;

    lpMMI->ptMaxTrackSize.y = cy;

    lpMMI->ptMinTrackSize.y = cy;

    CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

并在PreCreateWindow中设定窗口的初始坐标。

cs.x= 0;cs.y = 0;

2、 根据客户区尺寸设定对话框的尺寸

在View中的OnInitialUpdate函数进行操作,这是View第一个执行的函数。

CRect rect;

GetClientRect(&rect);

MoveWindow(&rect);

3、根据对话框大小动态调整控件的大小和位置

使用了网上获得一个方法,并进行了修改具体如下,视类中添加成员变量和成员函数:

voidSetControlInfo(WORD CtrlID);

protected:

intm_old_cx,m_old_cy;

CDWordArraym_control_info;

在OnInitialUpdate初始化:

CSizesz = GetTotalSize();

m_old_cx= sz.cx;

m_old_cy=sz.cy;

加控件信息的函数定义:

voidCTestFormView::SetControlInfo(WORD CtrlID){

m_control_info.Add(CtrlID);

}

添加OnMySize函数

voidCTestFormView:: OnMySize (UINT nType,int cx,int cy){

if(cx==0 || cy ==0){

cx =800;

cy = 600;

}

floatdx_percent = (m_old_cx==0)?1:(float)((float)cx/(float)m_old_cx);

floatdy_percent = (m_old_cy==0)?1:(float)((float)cy/(float)m_old_cy);

if(m_old_cx){

CRect WndRect;

CWnd * pWnd;

for(inti=0;i<m_control_info.GetSize();i++){

pWnd = GetDlgItem(m_control_info[i]);

if(!pWnd){

TRACE(_T("Control ID-%dNot"),m_control_info[i]);

continue;

}

pWnd->GetWindowRect(&WndRect);

ScreenToClient(&WndRect);

WndRect.left= (int)(WndRect.left*dx_percent );

WndRect.right= (int)(WndRect.right*dx_percent );

WndRect.top= (int)(WndRect.top*dy_percent );

WndRect.bottom= (int)(WndRect.bottom*dy_percent );

pWnd->MoveWindow(&WndRect);

}

}

m_old_cx= cx;

m_old_cy= cy;

}

在OnInitialUpdate函数中加入控件ID

SetControlInfo(IDC_BUTTON1);  

……

请大家注意了,这里需要获得对话框的初始尺寸就是我们在资源对话框中拉出的对话框的大小,才能知道缩放的比例。

获得初始尺寸使用的CScrollView中的函数GetTotalSize获得的。

CFormView动态调整对话框的尺寸并成比例调整部署控件

时间: 2024-09-30 14:51:26

CFormView动态调整对话框的尺寸并成比例调整部署控件的相关文章

android 动态背景的实现以及SurfaceView中添加EditText控件

      首先还是一贯作风,我们先看案例: 静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并 不复杂,这个如果让做游戏程序员做简直太小儿科了,这里我说明一点,其实我们做应用的也应该多少了解下游戏编程思维,起码对我们做应用有很好的帮助. 下面我简单介绍下实现方式. 实现原理:自定义一个SurfaceView控件.对之不停的onDraw,使得其背景动起来. 对于SurfaceView如果不了解的同学们麻烦

动态调整对话框属性(去掉标题栏,去掉边框,修改类似成Border:NONE样式)(调用ModifyStyle和ModifyStyleEx,然后调用SetWindowPos重新显示)

[cpp] view plain copy // 动态修改对话框属性,去掉对话框标题栏,设置Border为NONE属性. [cpp] view plain copy if(dlg.GetSafeHwnd()) { dlg.ModifyStyle(WS_CAPTION, 0); // 去掉标题栏 dlg.ModifyStyleEx(WS_EX_DLGMODALFRAME, 0); // 去掉边框 dlg.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP

在aspx页动态加载ascx页面内容,给GridView控件绑定数据

在aspx页动态加载ascx页面内容 //加载ascx页面内容Control c1 = this.Page.LoadControl("WebUserControl1.ascx");//绑定到aspx页的PlaceHolder控件上PlaceHolder1.Controls.Add(c1); DataSet ds = SqlServerHelpr.GetDataSet("select * from dbo.Table_1");//给GridView控件绑定数据Grid

android学习之LayoutInflater的用法,在myAdapter getView()里将多个TextView组件压缩成一个View控件,并在listView里显示

1.在LayoutInflater通常有下面2种初始化的方法,在Active里调用时很容易. 1. LayoutInflater inflater=LayoutInflater.from(context); 2. LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 2.创建myAdapter类时候在getView()方法里使用LayoutInfl

iOS下子控件中的子控件的位置转换成在父控件的位置

CGRect focusFrame = [_scrollView convertRect:_joinView.frametoView:self.view]; 这里_scrollView是self.view的子控件 _joinView是_scrollView的子控件,这里是计算出_joinView在self.view的位置, 当然还有其他类似的方法 [view convertPoint:<#(CGPoint)#> fromView:<#(UIView *)#>] [view conv

MFC 根据需要调整对话框大小

通常在写图片或影像显示相关程序的时候需要先根据图像的分辨率来动态调整对话框和里面控件的大小和比例之后再进行显示.下面来介绍下做法,单单是调整对话框的大小和位置是很简单的,只需要下面的代码 int screenwidth = GetSystemMetrics(SM_CXFULLSCREEN);//获取屏幕分辨率宽度,不包括任务栏等区域 int screenheight = GetSystemMetrics(SM_CYFULLSCREEN);//获取屏幕分辨率高度,不包括任务栏等区域 CRect r

对话框上动态控件的创建、在Picture Control控件上显示图片

1  MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控件时,就需要手动来代替类向导为动态控件添加消息.响应函数及变量. 动态创建控件时,可按照以下步骤进行: (1) 明确控件所属于的类 每一个控件都对应着一个类(例如按钮Button所属于的类为CButton). 如,在程序中我们需要用CButton类创建一个具体的按钮对象,并用函数指示它在对话框之上的

MFC动态创建控件(按钮)及添加消息响应

动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示. 静态控件不需要调用Create()函数来创建. 而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程: 1.建立控件I

MFC动态创建控件及添加消息响应

MFC动态创建控件及添加消息响应 分类: 控件技术2013-01-24 14:12 7020人阅读 评论(0) 收藏 举报 转载地址:http://blog.csdn.net/luy3728000/article/details/8193918 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放