none
给MDI子窗口添加控件,MDI子窗口边缘有控件残留影像 RRS feed

  • 问题

  • 我给MDI添加子窗口的方法如下:

    int CGongyongFrm::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	WCHAR captions[4][2]={L"<",L">",L"+",L"-"};
    	int i=0;
    	
    	if (CBCGPMDIChildWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	for(i=0;i<4;i++)
    	{
    		m_Buttons[i].Create(captions[i],BS_LEFT|WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,IDC_BUTTON_MOVE_LEFT+i);	
    		m_Buttons[i].m_bVisualManagerStyle=TRUE;
    		m_Buttons[i].MoveWindow(i*20+i,0,20,20,TRUE);
    	}
    	return 0;
    }

    运行代码后发现结果变成这样的:

    我尝试处理了WM_PAINT消息和WM_NCPAINT消息,均对残留图像不起作用。我发现即使WM_NCPAINT消息也不能绘制到那里。请问这个问题如何解决?


    妆台秋思

    2015年1月29日 19:30

答案

  • 我创建一个MDI工程,引用BCGControlBar组件,使用Tab管理MDI子窗口,启用Tab的代码如下:

    	CBCGPMDITabParams mditp;
    	mditp.m_style=CBCGPTabWnd::STYLE_3D_ONENOTE;
    	mditp.m_bActiveTabCloseButton=TRUE;
    	mditp.m_bTabIcons=FALSE;
    	mditp.m_bAutoColor=TRUE;
    	mditp.m_bDocumentMenu=TRUE;
    	EnableMDITabbedGroups(TRUE,mditp);

    为看出是哪一部分窗口没有刷新,我在MDI子窗口WM_PAINT消息中添加如下代码:

    void CGongyongFrm::OnPaint()
    {
    	CPaintDC dc(this);
    	RECT rc={0};
    	CBrush br;
    
    	GetClientRect(&rc);
    	br.CreateSolidBrush(RGB(255,255,0));
    	dc.FillRect(&rc,&br);
    	dc.DrawText(CString("黄色区域已经刷新"),CRect(100,100,300,200),DT_LEFT);
    }

    我手动拖动MDI子窗口,原来MDI子窗口覆盖的TAB控件区域没有刷新。问题界面如下:

    我用Spy++查看,没有刷新的窗口正是CBCGPTabWnd,于是我在MDI子窗口移动事件中添加如下代码:

    void CGongyongFrm::OnMoving(UINT fwSide, LPRECT pRect)
    {
    	CBCGPMDIChildWnd::OnMoving(fwSide, pRect);
    
    	CBCGPMainClientAreaWnd *p=(CBCGPMainClientAreaWnd*)GetParent();
    	CBCGPTabWnd & o= p->GetMDITabs();
    	o.Invalidate();
    	p->Invalidate();//只做测试
    	p->GetParent()->Invalidate();//只做测试
    	AfxGetMainWnd()->Invalidate();//只做测试
    }

    结果上述代码不起作用,MDI子窗口所属的TAB控件仍然不刷新。请问我该如何刷新Tab?


    妆台秋思



    2015年2月1日 16:38

全部回复

  • 怎么产生的残留图像?通过拖动四个按钮什么的吗?残留的原先的图像是什么,你给出的创建按钮的代码什么都看不出来,你的button是用的CButton类吗还是自己派生的自定义的类?请再多提供一些有用的细节和代码。

    建议使用看看Invalidate函数。不过不要再Oncreate或OnPaint函数里用。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年1月30日 6:40
  • 1、残留的图像是四个按钮的图像,怎么产生的,我也不知道。

    2、MDI子窗口一开始显示就有那个问题。拖动MDI子窗口反倒没这个问题,因为我实现了WM_PAINT消息。左上角的那个地方怎么重绘也不能刷新那里。

    3、所有控件用的都是BCGControlBar控件。我没有自定义。上面代码用到的按钮的类型是:CBCGPButton。

    4、除了实现WM_CREATE消息,WM_PAINT消息、WM_NCPAINT消息,其它代码都是向生成的,只是用到的类换成了BCGControlBar的类。


    妆台秋思



    2015年1月30日 22:31
  • 我创建一个MDI工程,引用BCGControlBar组件,使用Tab管理MDI子窗口,启用Tab的代码如下:

    	CBCGPMDITabParams mditp;
    	mditp.m_style=CBCGPTabWnd::STYLE_3D_ONENOTE;
    	mditp.m_bActiveTabCloseButton=TRUE;
    	mditp.m_bTabIcons=FALSE;
    	mditp.m_bAutoColor=TRUE;
    	mditp.m_bDocumentMenu=TRUE;
    	EnableMDITabbedGroups(TRUE,mditp);

    为看出是哪一部分窗口没有刷新,我在MDI子窗口WM_PAINT消息中添加如下代码:

    void CGongyongFrm::OnPaint()
    {
    	CPaintDC dc(this);
    	RECT rc={0};
    	CBrush br;
    
    	GetClientRect(&rc);
    	br.CreateSolidBrush(RGB(255,255,0));
    	dc.FillRect(&rc,&br);
    	dc.DrawText(CString("黄色区域已经刷新"),CRect(100,100,300,200),DT_LEFT);
    }

    我手动拖动MDI子窗口,原来MDI子窗口覆盖的TAB控件区域没有刷新。问题界面如下:

    我用Spy++查看,没有刷新的窗口正是CBCGPTabWnd,于是我在MDI子窗口移动事件中添加如下代码:

    void CGongyongFrm::OnMoving(UINT fwSide, LPRECT pRect)
    {
    	CBCGPMDIChildWnd::OnMoving(fwSide, pRect);
    
    	CBCGPMainClientAreaWnd *p=(CBCGPMainClientAreaWnd*)GetParent();
    	CBCGPTabWnd & o= p->GetMDITabs();
    	o.Invalidate();
    	p->Invalidate();//只做测试
    	p->GetParent()->Invalidate();//只做测试
    	AfxGetMainWnd()->Invalidate();//只做测试
    }

    结果上述代码不起作用,MDI子窗口所属的TAB控件仍然不刷新。请问我该如何刷新Tab?


    妆台秋思



    2015年2月1日 16:38