读书人

MFC对话框OnInitDialog跟OnPaint函数之

发布时间: 2012-10-18 13:46:55 作者: rapoo

MFC对话框OnInitDialog和OnPaint函数之间还执行了什么函数?
在debug下总是出现assert failed, wingdi.cpp line336,是下面的代码

C/C++ code
int CDC::SetBkMode(int nBkMode){    ASSERT(m_hDC != NULL);    int nRetVal = 0;    if (m_hDC != m_hAttribDC)        nRetVal = ::SetBkMode(m_hDC, nBkMode);    if (m_hAttribDC != NULL)        nRetVal = ::SetBkMode(m_hAttribDC, nBkMode);    return nRetVal;}

就是ASSERT(m_hDC != NULL);
程序只在OnPaint中调用了SetBkMode,但是还没有执行到OnPaint就出现了assert failed的问题,
断点跑OnInitDialog没有问题,一出OnInitDialog,还没进入OnPaint出现assert failed,
OnInitDialog和OnPaint函数之间还执行了什么函数啊?

[解决办法]
int CDC::SetBkMode(int nBkMode)
{
if(m_hDC==NULL || !m_hDC)//加这两句
return;//加这两句
ASSERT(m_hDC != NULL);
int nRetVal = 0;

if (m_hDC != m_hAttribDC)
nRetVal = ::SetBkMode(m_hDC, nBkMode);
if (m_hAttribDC != NULL)
nRetVal = ::SetBkMode(m_hAttribDC, nBkMode);
return nRetVal;
}

应该是对话框还没建立就调用这个函数了,MFC复杂,调用一个函数前可能会执行很多内部函数
[解决办法]
OnPaint中调用了SetBkMode
有没有BeginPaint();
或CPaintDC dc;
[解决办法]
这之间还有好多要处理啊,比如OnSize等等,但是感觉还是你OnPaint中的问题,你是不是调用错了,或者用的全局DC?

应该用

dc.SetBkMode(...);

读书人网 >VC/MFC

热点推荐