当前位置:C++技术网 > 资讯 > 怎样处理WM_ERASEBKGND消息

怎样处理WM_ERASEBKGND消息

更新时间:2017-10-23 14:37:03浏览次数:1+次

之前的用MFC1.0编写的用调色板填充背景的问题,经过您的建议,我找到了问题的所在,就是我写的OnEraseBKgnd函数没有被调用。我在OnEraseBKgnd函数函数中添加了AfxMessage函数:
BOOL CMainWindow::OnEraseBKgnd(CDC *pDC)
{
   AfxMessageBox(_T("test")); 
   
    CRect rect;
	CPalette *pa;

	GetClientRect(&rect);
	if((HPALETTE)m_palette!=NULL)
	{
		
		pa=pDC->SelectPalette(&m_palette,FALSE);
		pDC->RealizePalette();
		
	}
 

	DoGradFill(pDC,&rect);
	if((HPALETTE)m_palette!=NULL)
		pDC->SelectPalette(pa,FALSE);


    return TRUE;

}

运行的结果是这样的

并没有弹出test这个对话框,而我将调色板填充的函数放在OnPaint函数中,背景就被填充了

这是OnPaint函数

void CMainWindow::OnPaint()
{
    
	CPaintDC dc(this);
	CRect rect;
    
	GetClientRect(&rect);

	DoGradFill(&dc,&rect);//这是加上来的,之前在OnEraseBKgnd函数中
	DODrawText(&dc,&rect);
	
}
程序的结果就出来了

所以我想问一下为什么OnEraseBKgnd函数没有被调用,WM_ERASEBKGND应该会在WM_PAINT前面发送过来,这是我的头文件中声明的OnEraseBkgnd函数以及对于消息的映射

	afx_msg BOOL OnEraseBKgnd(CDC *pDC);//这是头文件中对于他的声明,由于其他的可能没什么关系,就只贴这一个了

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
   ON_WM_PAINT()
   ON_WM_CREATE()
   ON_WM_ERASEBKGND()
   ON_WM_QUERYNEWPALETTE()
   ON_WM_PALETTECHANGED()
END_MESSAGE_MAP()//这是消息的映射
是不是需要用消息反射宏来映射?希望可以帮帮我


C++技术网会员解答:

    基于对话框的窗口,在处理消息映射时,请注意消息映射宏里和消息处理函数声明不要写错,正确的写法如下图所示:

怎样处理WM_ERASEBKGND消息

怎样处理WM_ERASEBKGND消息

    如果自己手写,不清楚如何写,请参照下面的向导来添加消息处理:

怎样处理WM_ERASEBKGND消息

怎样处理WM_ERASEBKGND消息

怎样处理WM_ERASEBKGND消息

怎样处理WM_ERASEBKGND消息

    而你这个代码中并没有触发背景重绘消息,很有可能是错误重载了类,请确定产生此消息的类被你重载了消息处理函数。具体情况无法判断,如有需要,请继续直接通过QQ交流。