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++技术网会员解答:
基于对话框的窗口,在处理消息映射时,请注意消息映射宏里和消息处理函数声明不要写错,正确的写法如下图所示:
如果自己手写,不清楚如何写,请参照下面的向导来添加消息处理:
而你这个代码中并没有触发背景重绘消息,很有可能是错误重载了类,请确定产生此消息的类被你重载了消息处理函数。具体情况无法判断,如有需要,请继续直接通过QQ交流。