CSDN-Ada助手 2024-05-31 13:31 采纳率: 1.6%
浏览 11

如何在VC用多文档MDI创建的主界面CMainFrame显示一些信息,如背景图片,总是异常?

该问题来自社区帖: https://bbs.csdn.net/topics/618796225.

想在VC用多文档MDI创建的主界面CMainFrame显示一些信息,如背景图片,用CWnd派生一个CLogoWnd,并重载  OnEraseBkgnd,OnSize,进行绘图。在CMainFram::OnCreate函数中加入m_LogoWnd.SubclassWindow(m_hWndMDIClient);如果CMainFrame继承CMDIFrameWnd没有问题,主界面可以显示背景图片或绘图。但如果CMainFrame继承CMDIFrameWndEx则总是显示Debug Assertion Failed!异常。这是问什么?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-31 13:31
    关注

    引自免费微信小程序:皆我百晓生

    这个问题可能是由于你在使用CMDIFrameWndEx时,处理窗口子类化的方式不正确导致的。CMDIFrameWndEx类有一些额外的功能,比如DWM(桌面窗口管理器)支持和窗口边框风格等。在这种情况下,你需要确保正确地将你的CLogoWnd子窗口添加到MDI客户区,并且正确处理其消息。

    首先,确保你的CLogoWnd类已经正确实现了OnEraseBkgnd和OnSize方法,用于绘制背景图片。如果你还没有实现这些方法,请参考下面的示例代码:

    class CLogoWnd : public CWnd
    {
    public:
        CLogoWnd()
        {
            // 初始化你的图片资源或者其他需要的变量
        }
    
    protected:
        afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
        afx_msg void OnPaint();
        afx_msg void OnEraseBkgnd(CDC* pDC);
        afx_msg void OnSize(UINT nType, int cx, int cy);
    
    private:
        CBitmap m_Bitmap;  // 假设你有一个名为m_Bitmap的CBitmap对象存储你的背景图片
    };
    

    然后,在CMainFrame中,你应该使用DockControlBar()方法而不是SubclassWindow()来将CLogoWnd添加到MDI客户区。这是因为CMDIFrameWndEx可能期望MDI客户区窗口具有特定的行为,而SubclassWindow()可能会破坏这些行为。下面是修改后的CMainFrame::OnCreate函数中的代码:

    void CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return;
    
        // 创建并初始化CLogoWnd对象
        m_LogoWnd.Create(NULL, WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 1);
        m_LogoWnd.m_Bitmap.LoadBitmap(IDB_BITMAP1);  // 加载你的背景图片资源
    
        // 将CLogoWnd控件添加到MDI客户区
        DockControlBar(&m_LogoWnd, AFX_IDW_DOCKBAR_RIGHT);
    }
    

    在这个例子中,我们假设你有一个ID为IDB_BITMAP1的位图资源。你需要根据实际情况替换这个资源ID。

    现在,CLogoWnd应该被正确地添加到了MDI客户区,并且在运行时应该能正常显示背景图片了。如果仍然有问题,你可以检查一下资源是否正确加载,或者尝试输出调试信息,看看是否有任何未捕获的异常。如果你仍然遇到困难,可以提供更详细的错误信息,我会尽力帮你解决。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥15 已知平面坐标系(非直角坐标系)内三个点的坐标,反求两坐标轴的夹角
  • ¥15 webots有问题,无响应
  • ¥15 数据量少可以用MK趋势分析吗
  • ¥15 使用VH6501干扰RTR位,CANoe上显示的错误帧不足32个就进入bus off快慢恢复,为什么?
  • ¥15 大智慧怎么编写一个选股程序
  • ¥100 python 调用 cgps 命令获取 实时位置信息
  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上