如何通过单击 MainFrame 内的按钮来更改 MFC 视图

2024-04-23

我想通过单击窗口内的按钮来更改呈现的视图像这样 https://i.stack.imgur.com/3IA2o.png。 我的项目设置:

  1. 我制作了一个没有文档/视图支持的 MFC 项目 (SDI)。
  2. 我在设计器中又创建了两个视图并向它们添加了类。新的视图类源自CFormView。我将新视图类的构造函数和析构函数更改为公共。

  3. 将它们添加为 MainFrm.h 的指针:

CMainView*        m_pMainView;
CSecondView*      m_pSecondView; 
  1. 我改变了OnCreate(),OnSetFocus() and OnCmdMsg()MainFrm.cpp的方法如下: (这允许呈现我用设计器制作的 FormView)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    // First, build the view context structure
    CCreateContext ccx;

    // Designate the class from which to build the view
    ccx.m_pNewViewClass = RUNTIME_CLASS(CMainView);

    // Using the structure, create a view
    m_pMainView = DYNAMIC_DOWNCAST(CMainView, this->CreateView(&ccx));


    if (!m_pMainView)
    {
        TRACE0("creation of view failed");
    }

    // Do layout recalc
    RecalcLayout();

    // Show the view and do an initial update

    m_pMainView->ShowWindow(SW_SHOW);
    m_pMainView->OnInitialUpdate();

    // Set this view active
    SetActiveView(m_pMainView);

    // Order it to resize the parent window to fit
    m_pMainView->ResizeParentToFit(FALSE);


    return 0;
}

...

void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)
{

    m_pMainView->SetFocus();
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{

    if (m_pMainView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;

    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

现在我的问题来了!我在第一个呈现的视图上有一个按钮,如果单击它,视图应该会改变。我在设计器中使用事件处理程序创建了以下函数:

void CMainView::OnBnClickedButton1()
{
// What to do here? I want to change the current view to another View by clicking the button
}

如果我在 MainFrm.cpp 类中处理它,例如使用菜单按钮,那就没有问题......工作正常:

void CMainFrame::OnViewNextview()
{
    CCreateContext ccx2;
    ccx2.m_pNewViewClass = RUNTIME_CLASS(CSecondView);
    m_pSecondView = DYNAMIC_DOWNCAST(CSecondView, this->CreateView(&ccx2));

    RecalcLayout();

    m_pMainView->ShowWindow(SW_SHOW);
    m_pMainView->OnInitialUpdate();

    SetActiveView(m_pMainView);

    m_pMainView->ResizeParentToFit(FALSE);

}

我尝试编写一个函数CMainFrame并在中调用这个函数CMainView::OnBnClickedButton1()但我不知道如何获取当前的 MainFrm 对象。 MainFrm 上的指针或其成员CMainView不工作。

我搜索并红色教程好几天来解决我的问题。我还尝试使用文档/视图支持,如下所示:https://learn.microsoft.com/en-us/cpp/mfc/adding-multiple-views-to-a-single-document?view=vs-2019 https://learn.microsoft.com/en-us/cpp/mfc/adding-multiple-views-to-a-single-document?view=vs-2019但我不知道在哪里正确调用 switchView() 。

也许任何人都可以帮忙...


首先,你不应该真的压倒一切OnCmdMsg- 相反,使用DECLARE_MESSAGE_MAP在你的头文件中和BEGIN_MESSAGE_MAP/END_MESSAGE_MAP在您的实现文件中,并在这两个宏之间插入处理程序消息。

我发现你已经有一个处理程序了CMainView按钮点击类!从这里,您应该调用CMainFrame功能更改到下一个视图 - 就像给出菜单命令时所做的那样(您说它有效)。将该函数公开,并为 MainView 类提供对指向主框架的指针的访问权限(或使用AfxGetMainWnd()并将其转换为你的类的指针)。像这样的事情:

void CMainView::OnBnClickedButton1()
{
    AfxGetMainWnd()->PostMessage(WM_COMMAND, menuID); // ID of menu command that works!
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过单击 MainFrame 内的按钮来更改 MFC 视图 的相关文章

  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM

随机推荐

  • React Native 中无法读取 null 错误的属性“绑定”

    从反应本机运行应用程序时 我在模拟器 设备上收到以下错误消息 ERROR The development server returned response error code 500 URL http 10 0 2 2 8081 inde
  • 语义版本控制中 -rc 的含义是什么?

    我了解了 MAJOR MINOR PATCH 的逻辑 并且直观地了解了 semver 编号末尾的 alpha 和 beta 的含义 但 rc 并没有给我敲响任何警钟 在那里找不到满意的答案 gt https semver org https
  • 基于带有图标的列的数据表搜索[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一个带有状态列的数据表 我正在考虑提供搜索图标的可能性 因此 如果有人在搜索框中键入 打开 它应该显示带有 打开 图标的所有
  • 在 Windows 上安装 Pinax

    我可以安装吗Pinax http pinaxproject com 在 Windows 环境下 有简单的方法吗 您推荐哪种环境 我安装了 pinax 0 7rc1 并在 Windows 7 上运行 没有任何问题 请观看此视频 了解如何执行此
  • 更改文本字体大小以适应浏览器语言翻译时的 div 容器,而不是在视口更改上[重复]

    这个问题在这里已经有答案了 NOTE 这与响应视口更改的字体更改不同 IE 字体大小 3 2vw 纯 CSS 使字体大小根据动态字符数量进行响应 https stackoverflow com questions 14431411 pure
  • Pandas:删除重复索引的所有记录

    我有一个数据集 其中可能包含重复的标识符记录appkey 理想情况下 重复的记录不应该存在 因此我认为它们是数据收集错误 我需要删除一个的所有实例appkey这种情况发生不止一次 The drop duplicates方法在这种情况下没有用
  • 在 Jetty 中运行的 Grails 在没有布局模板的情况下呈现 404 错误页面

    我有一个 Grails 2 0 1 应用程序 我设置了以下 UrlMapping controller home 500 view error serverError 404 view error notFound 这是我的 notFoun
  • 如何在AWS中获取EC2实例的arn

    如何获取AWS中ec2实例的arn 我正在尝试使用资源标签 api 将标签添加到 EC2 实例 资源标签 api 需要所有资源的 arn 我如何获取它 您可以自己 构建 它 arn aws ec2
  • 如何将 UIImage 旋转 90 度?

    我有一个UIImage那是UIImageOrientationUp 纵向 我想逆时针旋转 90 度 横向 我不想使用CGAffineTransform 我想要的像素UIImage实际转移位置 我正在使用一段代码 如下所示 最初旨在调整UII
  • 如何停止优化器丢弃未使用的变量?

    我想调试我的代码 但无法访问进程中的内部层 因为这会干扰与硬件的通信 在监视列表会干扰基本读取访问的情况下执行易失性操作 因此 我正在测试接口的返回值 但 IAR 编译器甚至会优化未使用的易失性变量 和这样的声明 i object foo
  • Openlayers 3 中的拖放功能

    OpenLayers 2 OpenLayers Control DragFeature 功能的等效项是什么 我需要向地图添加一个可以用鼠标移动的图标 当掉落时我需要捕捉事件 在 OpenLayers 2 中 描述的功能是 new OpenL
  • Tableau - 计算日期小于另一个数据源的值的平均值

    我正在尝试计算 Tableau 中列的平均值 但问题是我正在尝试使用来自另一个数据源的单个日期值 基于筛选器 来仅计算考试日期 注意 参数在这里对我不起作用 因为新的日期值不断添加到集合中 我尝试了许多不同的方法 但最简单的方法是尝试使用计
  • 如何为多处理池中的单个进程分配Python请求会话?

    考虑以下代码示例 import multiprocessing import requests session requests Session data to be processed def process arg do stuff w
  • Android:计算两个位置之间距离的最佳方法

    我在这个主题上做了一些研究 但有很多观点并没有给出一个清晰的图像 我的问题是这样的 我正在为 Android 开发一个基于 GPS 的应用程序 在其中我想实时了解 Android LocationManager 指定的当前位置与其他位置之间
  • 使用pylab同时显示两个png图像

    我想打开两个 png 图像文件并将它们并排显示以进行视觉比较 我有以下代码用于打开一个 png 文件 我从 stackoverflow com 上的 unutbu 获得 import numpy as np import pylab imp
  • 当焦点位于输入字段时,为什么 React 中的日期选择器会闪烁?

    有人可以告诉我为什么当焦点位于输入字段时 React 中的 datepicker 会闪烁吗 我在我的演示中使用这个日期选择器 https www npmjs com package semantic ui calendar react bu
  • RESTful服务中的资源级授权

    Let users id 是 RESTful 服务中的资源 url 启用基本身份验证 仅允许经过身份验证的用户访问该 url 示例场景 User 1 User 2是通过 userId 1 和 2 进行身份验证的用户 由于两者都经过身份验证
  • 如何控制图库图像的重叠?

    我正在从 URL 下载图像并将它们放入图库中 下载图像后 它们会正确加载 一旦从缓存加载图像 图像就会相互重叠 我该如何解决这个问题 Use the android spacing图库视图的属性
  • 如何捕获预期(和预期)的 302 Ajax 响应?

    所以 如果你回头看看我的上一个问题 https stackoverflow com questions 2764444 getting autodiscover url from exchange email address关于 Excha
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图