MFC控件随窗口大小变化原理及实现

2023-05-16

本文主要针对MFC的dialog,实现控件随窗口大小变化。

原理:首先获取dialog的初始大小,当窗口发送变动时,调用OnSize事件和方法,计算缩放比例,然后对界面中的所有控件进行缩放和布局。

实现:

创建一个CMFCDemoDlg的dialog对话框;

复制代码

// CMFCDemoDlg 对话框
class CMFCDemoDlg : public CDialogEx
{
// 构造
public:
    CMFCDemoDlg(CWnd* pParent = NULL);    // 标准构造函数

// 对话框数据
    enum { IDD = IDD_MFCDEMO_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

protected:
    CRect m_rect;
    void ChangeSize(UINT nID,int x,int y);
    void ReSize(void);  
    POINT old; 
protected:
    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    DECLARE_MESSAGE_MAP()
};

复制代码

OnInitDialog方法中获取dialog的初始大小,记录到old变量中;

注册OnSize事件处理方法(ON_WM_SIZE(), OnSize()函数),设置控件大小

复制代码

CMFCDemoDlg::CMFCDemoDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMFCDemoDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCDemoDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialogEx)
    ON_WM_SIZE()
END_MESSAGE_MAP()


// CMFCDemoDlg 消息处理程序

BOOL CMFCDemoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
        
    // 获取对话框初始大小    
    GetClientRect(&m_rect);  //获取对话框的大小
    old.x=m_rect.right-m_rect.left;  
    old.y=m_rect.bottom-m_rect.top;
    
    return TRUE;
}


void CMFCDemoDlg::ReSize(void)  
{  
    float fsp[2];  
    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;  
    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]);    
        TLPoint.y = long(OldTLPoint.y*fsp[1]);    
        OldBRPoint = Rect.BottomRight();    
        BRPoint.x = long(OldBRPoint.x *fsp[0]);    
        BRPoint.y = long(OldBRPoint.y *fsp[1]);    
        Rect.SetRect(TLPoint,BRPoint);    
        GetDlgItem(woc)->MoveWindow(Rect,TRUE);  
        hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);      
    }
    old=Newp;  
}  


void CMFCDemoDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType,cx,cy);
    if(nType!=SIZE_MINIMIZED )  //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
    {
        ReSize();
    }
}

复制代码

通过hwndChild=::GetWindow(m_hWnd,GW_CHILD);和::GetWindow(hwndChild, GW_HWNDNEXT); 列出所有控件 

也可针对特定控件设置其大小,如:

复制代码

//change control size
void CMFCDemoDlg::ChangeSize(UINT nID,int x,int y)
{
    CWnd *pWnd = GetDlgItem(nID);
    if(pWnd!=NULL)
    {
        CRect rec;
        pWnd->GetWindowRect(&rec);//获取控件变化前的大小
        ScreenToClient(rec);   //将控件大小装换位在对话框中的区域坐标
        // x / m_rect.Width(); 伸缩rate
        rec.left = rec.left * x / m_rect.Width();
        rec.top = rec.top * y / m_rect.Height();
        rec.bottom = rec.bottom  * y / m_rect.Height();
        rec.right = rec.right * x / m_rect.Width();
        pWnd->MoveWindow(rec);//伸缩控件
    }
}

复制代码

 

 

参考:http://blog.csdn.net/lujianfeiccie2009/article/details/5485602

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC控件随窗口大小变化原理及实现 的相关文章

  • 菜单被裁剪

    我有一个MFC项目 它支持 40 多种语言 我的电脑上有两个显示器 它们都是不同尺寸的显示器和不同的分辨率 如果我将应用程序移至较小的显示器上 则不会显示完整的语言菜单 我知道它会显示滚动条 为什么不是呢 我的菜单是标准菜单 没有什么花哨
  • DirectUI 的真相是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个 Windows 桌面应用程序 它需要一个很棒的 UI 我现在使用Visual Studio和MFC 后来听说DirectU
  • GetWindowRect 坐标不与屏幕相关

    我正在使用 Visual Studio 2008 C 工作 我有一个 MFC 对话框 里面有一个控件 我正在尝试在控件中放置另一个对话框 第二个对话框上的 SetWindowPos 显然使用屏幕坐标 因此我需要获取控件或父对话框的屏幕坐标
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 具有透明背景的CWnd

    我想创建一个基于 CWnd 的类 它将引入具有透明背景的控件 只要内容是静态的 创建一个控件并用透明背景绘制其内容对我来说没什么大不了的 问题是当我想创建一个内容不断变化的控件时 这是因为我不知道如何用父背景删除控件的内容 一般情况下可能不
  • CloseWindow和WM_CLOSE有什么关系

    我现在有点困惑 是吗 WM CLOSE http msdn microsoft com en us library windows desktop ms632617 28v vs 85 29 aspx and CloseWindow htt
  • MFC:如何减少OnInitialUpdate()滚动的时间成本?

    我需要打印多行数据 每行都可以进行文本换行 因此高度会有所不同 要进行滚动 我需要导出总高度 由于每条线可能有不同的高度 我只能遍历每条线来累加高度 如下所示 void CMyScrollView OnInitialUpdate for a
  • 创建非托管常规 MFC DLL 并从托管 C++ .NET 应用程序调用它时出现问题

    我有几个关于 DLL 的问题 我尝试了很多 但无法获得完整的图片 大多数示例都是用 C 等编写的 使用 VS2005 中的向导 我创建了一个非托管 MFC 常规 DLL 由于剩余代码 必须是 MFC 然后我尝试将其导入 VS2005 管理的
  • MFC中如何将BYTE数组转换为CString?

    如何在 MFC 中将 BYTE 数组转换为 CString 试试这个 例如 如果 x 是你的字节数组 那么 BYTE x 5 x 0 A x 1 0 x 2 B x 3 C x 4 0 CString str LPCSTR x sizeof
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

    我似乎遇到了命名管道 101 问题 我有一个非常简单的设置来连接从 C 非托管应用程序传输到 C 托管应用程序的单工命名管道 管道已连接 但我无法通过管道发送 消息 除非我关闭似乎刷新缓冲区并传递消息的句柄 就好像消息被屏蔽了一样 我尝试颠
  • 禁用/启用 MFC 功能包的功能区按钮

    我正在使用 MFC 功能包 并且功能区栏上有一些按钮 即 CMFCRibbonButton 的实例 问题是我想在某些条件下启用和禁用其中一些 但在运行时 我怎样才能做到这一点 因为没有具体的方法 我听说解决方案是在运行时附加 分离事件处理程
  • 错误 C2248: 'CObject::CObject' : 无法访问类 'CObject' afxwin.h 中声明的私有成员

    我试图让班级负责在灰色背景上放置一些文本 Score h pragma once class Score public Score Score void UpdateScore int points void UpdateLives int
  • 从模态 MFC 表单获取输入信息

    我已经创建了表格CPreparationDlg具有Edit Control 然后我创建了创建模态表单的应用程序 在按 确定 后 我需要将编辑控件中输入的文本读入主程序的变量中 最好的方法是什么 class CPreparationApp p
  • MFC编辑控件更新

    我尝试使用它添加的变量来更新编辑控件的文本 这是一个CString但我失败了 m sNrAuto some text UpdateData TRUE 我也尝试过使用UpdateWindow 但编辑控件仍为空白 我知道我可以使用SetWind
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时
  • C++ 中的转换错误

    有人可以帮我解决这个错误吗 我是 C 新手 看来错误就发生在一堆宏中 我能做什么来解决它 或者我怎样才能追踪到它的源头 我真的不明白这个错误 这是否意味着编译器尝试转换该方法void ReadCPUparameter to a LRESUL
  • 如何将CString转换为整数和浮点数? [复制]

    这个问题在这里已经有答案了 我正在尝试转换CStringint 和 float 但无法找到任何 C 库函数来完成此操作 请帮忙 正确的UNICODE 符合规定的方式MFC如下 CString sInt T 10 int n ttoi sIn
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列

随机推荐

  • MFC SendMessage()函数传递字符串

    CString cstr1 61 T 34 123 34 CString cstr2 61 T 34 hello 34 SendMessage hWnd WM XXX WPARAM LPCTSTR cstr1 LPARAM LPCTSTR
  • C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一 MFC概念和作用 1 全称Microsoft Foundation Class Library 我们称为微软基础类库 封闭了绝大部分的win32 Api函数 xff0c C 43 43 语法中的数据结构 xff0c 程序的执行流程 MF
  • MFC中的消息处理函数

    1 在Windows API编程中 xff0c 直接在消息处理函数中编写WM PAINT处理代码 2 在MFC中 xff0c CFrameWnd的消息处理过程在哪里呢 xff1f MFC时如何将消息处理函数和窗口关联起来的 在CFrameW
  • MFC添加自定义消息及处理函数

    添加消息 在头文件中添加 xff1a define WM MYMSG WM USER 43 1 WM USER以下的消息都是系统消息 xff0c 所以自定义消息时 xff0c ID要比WM USE大 xff1b 添加函数声明 xff08 用
  • MFC自定义消息的实现方法

    一 概述 xff1a 消息机制是windows程序的典型运行机制 xff0c 在MFC中有很多已经封装好了的消息 xff0c 如WM BTN 等 但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能 xff0c 这时候MFC
  • MFC窗体对象概念

    MFC框架中 xff0c 所有Cwnd的派生类都是窗口类型 xff0c 包括了Cview xff0c CframWnd xff0c Cdialog xff0c Cbutton Clist等控件等 xff0c 它们都经历了窗口类的注册 xff
  • Ubuntu搭建samba服务器教程

    什么是 Samba 安装 Samba 创建samba共享文件夹的两种方式Anonymous 和 Secured 创建一个 Anonymous share 创建一个 Secured share Ubuntu环境下测试 Samba配置文件说明
  • MFC的来龙去脉-----消息处理,找处理函数

    一 处理函数的源头 对于对话框程序 xff0c 无论是模式还是非模式 xff0c 在注册窗口的时候 xff0c 会指定其窗口过程处理函数WinProc xff1b 当消息找到了对应的窗口 xff0c DispatchMessage便开始让内
  • MFC一一添加WM_USER自定义消息

    有些时候 xff0c 我们希望自定义一些消息响应函数来控制何时进行消息触发 xff0c 或针对两个不同类或线程之间进行消息互动 xff0c 这个时候自定义消息响应函数就起到很大作用了 那么如何添加自定义消息呢 xff1f 具体分为以下几步
  • MFC 类库结构 总结

    MFC主要类库结构总结 MFC类主要分为应用程序结构类 窗口支持类 图书设备类 模版集合类 简单数据类型类以及全局AFX函数等6个类 1 应用程序结构类 应用程序结构类代表的是应用程序的基本元素 xff0c 主要包括了CcmdTarget类
  • MFC基本框架结构

    本文将剖析基于MFC的框架程序 xff0c 探讨MFC框架程序的内部组织结构 xff0c MFC是微软为了简化程序员的开发工作而设计的一套c 43 43 类集合 xff0c 利用这些类有 效地帮助程序员完成windows应用程序开发 代码结
  • mfc编程消息机制中消息汇总

    做VC开发必须熟悉消息机制 xff0c 笔试面试重点 xff0c 自己在这方面很欠缺 xff0c 搜集学习一下 WM CREATE CreateWindow 初始化工作 GetMessage 遇到WM QUIT 程序结束 DispatchM
  • c++中SetEvent和ResetEvent的使用

    关于事件 事件 Event 是WIN32提供的最灵活的线程间同步方式 xff0c 事件可以处于激发状态 signaled or true 或未激发状态 unsignal or false 根据状态变迁方式的不同 xff0c 事件可分为两类
  • MFC设置主界面背景图片、设置子窗体背景图片

    在Onpaint函数中加入如下代码 给窗口设置背景图片 CPaintDC dc this CRect myrect GetClientRect amp myrect CDC dcMem dcMem CreateCompatibleDC am
  • MFC——在视图窗口加载背景图片

    1 若是文档视图程序的话 xff0c 在视图类的OnDraw CDC pDC 函数中调用pDC gt TextOut 函数 xff0c 就像平常输出文字一样 若是嫌文字的背景颜色破坏了图像 xff0c 可以在输出文字之前调用pDC gt S
  • 如何修改MFC的图标

    更改IDR MainFrm指向的ico文件 xff0c 该图标有两种格式 xff0c 32 32和16 16 xff0c 这两种格式都要改 xff0c 还可以在主框架的OnCreate函数里指定使用哪个图标 xff1a HICON m hI
  • MFC改变控件位置和大小

    最近经常要用到改变控件在对话框上的位置和大小 xff0c 一直找不到有效的方法 xff0c 查看了很多资料 这篇博文还算靠谱 xff0c 转载到这里了 void CmyqeDlg OnSize UINT nType int cx int c
  • mfc控件位置调整和坐标确定 .

    在mfc工程中控件或者窗口位置的调整是经常遇到的 xff0c 特别是基于对话框的工程 位置的调整包括坐标 长度和宽度的变化 xff0c 一般在窗口类的OnSize函数中实现 控件位置的调整涉及的函数有 xff1a GetWindowRect
  • MFC笔记2(控件位置调整)

    1 根据计算 xff0c 使用GetClientRect amp 就可以调整好 2 遇到了OK和Cancel按钮通过GetDlgItem xff08 ID xff09 找不到id资源号的情况 xff0c 最后通过给控件绑定控件变量到类中就可
  • MFC控件随窗口大小变化原理及实现

    本文主要针对MFC的dialog xff0c 实现控件随窗口大小变化 原理 xff1a 首先获取dialog的初始大小 xff0c 当窗口发送变动时 xff0c 调用OnSize事件和方法 xff0c 计算缩放比例 xff0c 然后对界面中