【二】MFC对话框的等比例缩放

2024-08-29 00:18
文章标签 mfc 缩放 对话框 比例

本文主要是介绍【二】MFC对话框的等比例缩放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题:

①对话框扩大后,里面的控件却没有扩大

②对话框扩大了,里面的控件也扩大了,万万没有想到连按钮也扩大了

③以上两个问题都解决了之后,当你把对话框手动拉到最小时(即:掩盖操作区域),再拉开时却得到空白,怎样解决限制对话框的最小尺度

测试环境:VS2013

1.在CMFCApplication1Dlg类中声明全局变量

class CMFCApplication1Dlg : public CDialogEx
{
........
public:POINT old;
........
};

2.在初始化函数里记录原始对话框大小

BOOL CMFCApplication1Dlg::OnInitDialog()
{.....CRect rect;GetClientRect(&rect);     //取客户区大小    old.x = rect.right - rect.left;old.y = rect.bottom - rect.top;return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
3.添加响应消息函数OnSize

void CMFCApplication1Dlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);// TODO:  在此处添加消息处理程序代码if (nType == SIZE_RESTORED || nType == SIZE_MAXIMIZED){ReSize();//  自己写的函数}
}

4.对话框等比例缩放的函数ReSize()h函数

//  有限制部分控件不等比例缩放
void CMFCApplication1Dlg::ReSize()
{float fsp[4];POINT Newp; //获取现在对话框的大小  CRect recta;GetClientRect(&recta);     //取客户区大小    Newp.x = recta.right - recta.left;Newp.y = recta.bottom - recta.top;fsp[0] = (float)Newp.x / old.x;fsp[1] = (float)Newp.y / old.y;fsp[2] = (float)Newp.y - old.y;fsp[3] = (float)Newp.x - old.x;CRect Rect;int woc;CString s;CPoint OldTLPoint, TLPoint; //左上角  CPoint OldBRPoint, BRPoint; //右下角  HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  取得第一个控件的句柄,用于遍历所有控件   while (hwndChild){woc = ::GetDlgCtrlID(hwndChild);//取得ID if ((woc == 1002)||(woc==1003))//  1002和1003为控件的ID即:woc  此数字可用CString s; s.Format(_T("%d"), woc); MessageBox(s);测得{/*说明:此大括号里面的语句是为了屏蔽按钮的扩大,即保持原来的大小*/GetDlgItem(woc)->GetWindowRect(Rect);//获得相对于屏幕左上角的坐标    ScreenToClient(Rect);//将屏幕坐标转换成相对客户窗口左上角的坐标OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x + fsp[3]);//用和得出左上角的x坐标TLPoint.y = long(OldTLPoint.y + fsp[2]); //用和得出左上角的y坐标OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x + fsp[3]); //用和得出右下角的x坐标BRPoint.y = long(OldBRPoint.y + fsp[2]);//用和得出右下角的y坐标Rect.SetRect(TLPoint, BRPoint);//设置最新的RectGetDlgItem(woc)->MoveWindow(Rect, TRUE);hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);//获得下一个控件的句柄}else{/*所有控件全都等比例扩大,除了上面的按钮*/GetDlgItem(woc)->GetWindowRect(Rect);//获得相对于屏幕左上角的坐标    ScreenToClient(Rect);//将屏幕坐标转换成相对客户窗口左上角的坐标OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x * fsp[0]);//用比例得出左上角的x坐标TLPoint.y = long(OldTLPoint.y * fsp[1]); //用比例得出左上角的y坐标OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x * fsp[0]); //用比例得出右下角的x坐标BRPoint.y = long(OldBRPoint.y * fsp[1]);//用比例得出右下角的y坐标Rect.SetRect(TLPoint, BRPoint);//设置最新的RectGetDlgItem(woc)->MoveWindow(Rect, TRUE);hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);//获得下一个控件的句柄}}old = Newp;
}
//  对话框中的所有控件都进行等比例缩放
void CMFCApplication1Dlg::ReSize()
{float fsp[4];POINT Newp; //获取现在对话框的大小  CRect recta;GetClientRect(&recta);     //取客户区大小    Newp.x = recta.right - recta.left;Newp.y = recta.bottom - recta.top;fsp[0] = (float)Newp.x / old.x;fsp[1] = (float)Newp.y / old.y;fsp[2] = (float)Newp.y - old.y;fsp[3] = (float)Newp.x - old.x;CRect Rect;int woc;	CPoint OldTLPoint, TLPoint; //左上角  CPoint OldBRPoint, BRPoint; //右下角  HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);  取得第一个控件的句柄,用于遍历所有控件   while (hwndChild){woc = ::GetDlgCtrlID(hwndChild);//取得ID /*所有控件全都等比例扩大,除了上面的按钮*/GetDlgItem(woc)->GetWindowRect(Rect);//获得相对于屏幕左上角的坐标    ScreenToClient(Rect);//将屏幕坐标转换成相对客户窗口左上角的坐标OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x * fsp[0]);//用比例得出左上角的x坐标TLPoint.y = long(OldTLPoint.y * fsp[1]); //用比例得出左上角的y坐标OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x * fsp[0]); //用比例得出右下角的x坐标BRPoint.y = long(OldBRPoint.y * fsp[1]);//用比例得出右下角的y坐标Rect.SetRect(TLPoint, BRPoint);//设置最新的RectGetDlgItem(woc)->MoveWindow(Rect, TRUE);hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);//获得下一个控件的句柄}old = Newp;
}

5.解决限制对话框的最小尺度,即响应消息:WM_GETMINMAXINFO

void CMFCApplication1Dlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{// TODO:  在此添加消息处理程序代码和/或调用默认值CPoint   pt(100, 100); //定义宽和高  lpMMI->ptMinTrackSize = pt; //限制最小宽和高  CDialogEx::OnGetMinMaxInfo(lpMMI);
}

截图:

扩大之前的


扩大之后的:


这篇关于【二】MFC对话框的等比例缩放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116302

相关文章

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

控制台和MFC中内存泄露工具vld的使用

最近想检测下项目中内存泄露的情况,选中了vld这款。在查找使用方法的时候,大都是控制台下的示例,添加到main函数所在的源文件上。换成MFC就纠结了,不知道添加到哪里去。本文记录控制台和MFC中的使用vld过程。    vld资源:    1)、大家可以移步下边的网址下载:     http://vld.codeplex.com/releases/view/82311    2

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

vue2实践:第一个非正规的自定义组件-动态表单对话框

前言 vue一个很重要的概念就是组件,作为一个没有经历过前几代前端开发的我来说,不太能理解它所带来的“进步”,但是,将它与后端c++、java类比,我感觉,组件就像是这些语言中的类和对象的概念,通过封装好的组件(类),可以通过挂载的方式,非常方便的调用其提供的功能,而不必重新写一遍实现逻辑。 我们常用的element UI就是由饿了么所提供的组件库,但是在项目开发中,我们可能还需要额外地定义一

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

几种MFC对话框的隐藏方法

修改CXXAPP中的InitInstance函数,将原来的模态对话框改为非模态对话框,及修改 [cpp]  view plain copy INT_PTR nResponse = dlg.DoModal();     为 [cpp]  view plain copy dlg.Create(CModalHideDlg::IDD);

【HarmonyOS】头像圆形裁剪功能之手势放大缩小,平移,双击缩放控制(三)

【HarmonyOS】头像裁剪之手势放大缩小,平移,双击缩放控制(三) 一、DEMO效果图: 二、开发思路: 使用矩阵变换控制图片的放大缩小和平移形态。 通过监听点击手势TapGesture,缩放手势PinchGesture,拖动手势PanGesture进行手势操作的功能实现。 通过对矩阵变换参数mMatrix的赋值,将矩阵变换参数赋值给image控件。实现手势操作和图片操作的同步。

030集——自动弹出对话框、选择文件并播放wav音频文件(winform窗体)——C#学习笔记

如图所示,效果如下: 步骤如下: 新建一个winform窗体,双击界面,进入代码区: 复制(下面代码中命名空间内的代码)到(你的命名空间下),运行。 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Draw

CSS学习6--背景图片、颜色、位置、附着、简写、透明、缩放、多背景、凹凸文字、导航栏例子

CSS背景 一、背景颜色和图片二、背景位置三、背景附着四、背景简写五、背景透明六、背景缩放七、多背景八、凹凸文字九、导航栏例子 一、背景颜色和图片 background-color: pink; 背景颜色backgroundoimage: url(##.jpg); 背景图片background-repeat: 平铺 repeat-x横向平铺,repeat-y纵向平铺; 平铺不到