当前位置:C++技术网 > 资讯 > 用mfc1.0写的程序,想用调色板来填充背景,可背景依然是白色的

用mfc1.0写的程序,想用调色板来填充背景,可背景依然是白色的

更新时间:2017-10-21 23:47:29浏览次数:1+次

//WM_ERASEBKGND消息处理函数
BOOL CMainWindow::OnEraseBKgnd(CDC *pDC)
{


    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;

}

代码中的m_palette是在CMainWindow这个继承了CFrameWnd的类中定义的调色板的变量,这个调色板在OnCreate函数中初始化,由于我觉得与程序无关,我就不贴OnCreate函数的代码了,这里调用了DoGradFill函数,以下是这个函数的实现

//绘制背景
void CMainWindow::DoGradFill(CDC *pDC,LPRECT pRect)
{

	CBrush *pbrush[64];
    int i=0;

	for(;i<64;i++)
		pbrush[i]=new CBrush(PALETTERGB(0,0,255-(i*4)));

	int nWidth=pRect->right-pRect->left;
	int nHeight=pRect->top-pRect->bottom;
    CRect rect;

	for(i=0;i<nHeight;i++)
	{
		rect.SetRect(0,i,nWidth,i+1);
		pDC->FillRect(&rect,pbrush[(i*63)/nHeight]);
	}

	for(i=0;i<64;i++)
		delete pbrush[i];
}
以下是对WM_PAINT消息的处理
void CMainWindow::OnPaint()
{

	CPaintDC dc(this);
	CRect rect;
    

	GetClientRect(&rect);
	DODrawText(&dc,&rect);
}
这里调用了DODrawText,以下是这个函数的实现
void CMainWindow::DODrawText(CDC *pDC,LPRECT pRect)
{
   	CFont font;
	font.CreatePointFont(720,_T("Comic Sans MS"));

	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(255,255,255));

	CFont *pf=pDC->SelectObject(&font);
	pDC->DrawText(_T("Hello MFC"),-1,pRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

	pDC->SelectObject(pf);
}
可程序运行的结果却是这样的
这里没有Hello MFC这几个字我还能理解,因为在DoDrawText函数中使用白色写这几个字的,被背景覆盖了,可背景为什么是白色的?对于调色板我也处理了WM_QUERYNEWPALETTE以及WM_PALETTECHANGED两个消息,由于我觉得与这个问题无关,我就没有将代码贴上来了,感觉就像WM_ERASEBKGND消息没有被处理一样,还是用了缺省的OnEraseBkGnd操作使用窗口的缺省背景刷来刷新背景的,可我明明已经重载了OnEraseBkGnd这个函数。不知道是哪里出现了问题。

C++技术网会员解答:

    您好,感谢您对C++技术网的信任与支持。

    对于文字没有显示,验证解决的办法很简单,那就是设置文字颜色为其他颜色即可。

    在背景重绘消息处理函数里,你使用了调色板,那么调色板是会影响背景的输出的,也就是说,背景的输出是使用调色板里面的颜色,而不是直接的颜色值。所以调色板相关的处理,是需要注意的。

    为什么背景是白色?默认的颜色就是白色。如果调色板未生效,自然会用默认的白色绘制背景。而你怀疑背景重绘是执行了默认函数,而没有执行你的函数,要确定这一点,其实不难。那就是在函数里弹出消息框。如果执行了,必然有消息框提醒。有没有执行,不能靠猜,一试便知。

    通过以上测试,我们才能真正说找到什么问题。

    另外,建议先不要使用调色板,直接指定直接的rgb颜色绘制背景,等效果出来后再使用调色板,一步步来。

    仅通过以上代码不容易看出什么问题,但是简单一测试,就清楚了。希望你根据我的建议测试一下,应该没有大问题的。