qq_41945416 2025-11-01 12:27 采纳率: 90.6%
浏览 6
已结题

还是关于mfc 多文档编程 禁止用户调整大小

还是关于mfc 多文档编程 如何禁止用户调整文档子窗口的大小?也就是我要固定大小应该怎么做

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-01 12:39
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:每一个不曾放弃的瞬间,都在为未来积蓄力量。
    .

    在MFC多文档程序中禁止调整子窗口大小

    在MFC多文档界面(MDI)程序中,要禁止用户调整文档子窗口的大小,可以通过以下几种方法实现:

    方法一:修改子窗口样式(推荐)

    在子框架窗口类中重写 PreCreateWindow 函数,移除窗口大小调整相关的样式:

    BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
        if( !CMDIChildWnd::PreCreateWindow(cs) )
            return FALSE;
        
        // 移除可调整大小的边框样式
        cs.style &= ~WS_THICKFRAME;
        cs.style &= ~WS_MAXIMIZEBOX;
        cs.style &= ~WS_MINIMIZEBOX;
        
        return TRUE;
    }
    

    方法二:处理WM_GETMINMAXINFO消息

    在子框架窗口类中添加消息处理,限制窗口的最小和最大尺寸:

    // 在头文件中声明消息处理函数
    afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
    
    
    // 在消息映射中添加
    BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
        ON_WM_GETMINMAXINFO()
    END_MESSAGE_MAP()
    
    
    // 实现消息处理函数
    void CChildFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
    {
        // 设置最小和最大跟踪大小为当前窗口大小
        CRect rect;
        GetWindowRect(&rect);
        
        lpMMI->ptMinTrackSize.x = rect.Width();
        lpMMI->ptMinTrackSize.y = rect.Height();
        lpMMI->ptMaxTrackSize.x = rect.Width();
        lpMMI->ptMaxTrackSize.y = rect.Height();
        
        CMDIChildWnd::OnGetMinMaxInfo(lpMMI);
    }
    

    方法三:在创建窗口时指定样式

    如果你在创建子窗口时有控制权,可以在创建时指定窗口样式:

    // 创建固定大小的子窗口
    pChildFrame->Create(NULL, 
                       _T("文档标题"),
                       WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
                       rectDefault,
                       pParentFrame);
    

    完整示例

    以下是完整的实现步骤:

    1. 在子框架类头文件中添加声明:
    class CChildFrame : public CMDIChildWnd
    {
        DECLARE_DYNCREATE(CChildFrame)
    public:
        CChildFrame();
        
    protected:
        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
        afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
        
        DECLARE_MESSAGE_MAP()
    };
    
    1. 在实现文件中:
    BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
        ON_WM_GETMINMAXINFO()
    END_MESSAGE_MAP()
    
    
    BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
        if(!CMDIChildWnd::PreCreateWindow(cs))
            return FALSE;
            
        // 移除调整大小相关的样式
        cs.style &= ~WS_THICKFRAME;    // 移除可调整边框
        cs.style &= ~WS_MAXIMIZEBOX;   // 移除最大化按钮
        cs.style &= ~WS_MINIMIZEBOX;   // 移除最小化按钮
        
        return TRUE;
    }
    
    
    void CChildFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
    {
        CRect rect;
        GetWindowRect(&rect);
        
        // 固定窗口大小
        lpMMI->ptMinTrackSize.x = rect.Width();
        lpMMI->ptMinTrackSize.y = rect.Height();
        lpMMI->ptMaxTrackSize.x = rect.Width();
        lpMMI->ptMaxTrackSize.y = rect.Height();
        
        CMDIChildWnd::OnGetMinMaxInfo(lpMMI);
    }
    

    注意事项

    • 建议同时使用方法一和方法二,以确保在各种情况下都能有效限制窗口大小
    • 这些修改只会影响子窗口,不会影响主框架窗口
    • 如果希望所有子窗口都固定大小,需要在每个子框架类中都进行相应修改

    通过以上方法,你可以有效地禁止用户调整MFC多文档程序中子窗口的大小。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 创建了问题 11月1日