MFC MDI 多视图选项卡式风格

本文探讨了在MFC MDI应用中,当尝试最小化并恢复窗口时,TreeView组件频繁触发WM_PAINT消息导致闪烁现象的原因及解决方法。重点介绍了通过在视图的OnDraw函数中采用双缓冲技术来解决View区域闪烁问题,以及在子窗口中改变窗口风格的方法。此外,还对比了MDI隐藏和恢复操作与TreeView闪烁之间的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.启用多文档视图,添加TreeView数据

2.最小化主窗口,然后恢复窗口,发生CFileView窗口闪烁。

3.其中CApp**View.cpp视图显示区可以在OnDraw()中采用双缓冲解决了View区域的闪烁问题。

但是树状图还是发生闪烁,跟踪发现多次调用了WM_PAINT 消息。导致闪烁,一直没有找到什么原因引起多次调用WM_PAINT消息。

4.MFC 自动生成的选项卡式MDI隐藏然后恢复都没有出现闪烁。

这是公司之前写的代码,不太熟悉代码流程调用,所以搞了一天也没有解决树状图闪烁的问题。

现在开始记录工作进程。调查资料发现MDI采用数据和视图分离方法,在View 的OnDraw中进行绘制图形。

如下// CMuDocViewView 绘制

void CMuDocViewView::OnDraw(CDC* /*pDC*/)
{
    CMuDocViewDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
}

在子窗口中可以改变窗口风格

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
    cs.style &= ~FWS_ADDTOTITLE;
    if( !CMDIChildWndEx::PreCreateWindow(cs) )
        return FALSE;

    return TRUE;
}

在View中设置选项卡标题

void CMuDocViewView::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    CSize sizeTotal;
    // TODO: 计算此视图的合计大小
    sizeTotal.cx = sizeTotal.cy = 100;
    SetScrollSizes(MM_TEXT, sizeTotal);

    GetParent()->SetWindowText(_T("测试视图")); //设置选项卡标题
}


5.Docment 可以创建多个文档,显示的时候内部机制调用OnDraw 绘制图形。

6.猜测会不会是View 窗口绘制,同时也刷新了TreeView,但是MFC 的MDI 却没有这样的调用,即微软MDI调用View视图不影响TreeView OnPaint



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值