我新建一个工程MFC AppWizard[exe],下一步选择的是Dialog based,而不是Single document,这样运行后弹出来的是一个对话框,而不是一个菜单窗口,接下来我想在这个对话框上贴上一幅我自己的位图,这就奇怪了,这个对话框没有响应处理函数OnEraseBKgnd(),好像这个函数只有菜单窗口类有而对话框窗口类没有(这是为什么啊???),我就另想了一个办法,办法如下:
1,在窗口初始化函数BOOL CTest001Dlg::OnInitDialog()里面
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
m_brushBK.CreatePatternBrush(&bitmap);//定义了m_brushBK为CBrush类型
bitmap.DeleteObject();
2,重载了函数OnCtlColor,在里面加了代码如下:
HBRUSH CTest001Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(pWnd == this)
{
return m_brushBK;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
运行后只能显示位图的一部分,不能完整的显示,我想完整的现实,请问有什么办法。
另外,我还想了一个办法,直接就是在初始化函数OnInitDialog()里面加了如下代码
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
CDC *pDC;
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);//这个函数是可以完整显示一幅位图的
运行后无任何反应,但是也没有错误。
可是我发现以上的代码放在OnEraseBKgnd()里面可以,但是对话框窗口类没有这个函数啊,请问办法怎么解决?

解决方案 »

  1.   

    这个对话框没有响应处理函数OnEraseBKgnd()重载WM_ERASEBKGND消息不就行了吗?
      

  2.   

    我就是在ClassWizard中重载的时候找不到WM_ERASEBKGND
      

  3.   

    点类视图  -> 找到你的那个对话框类  -> 右键属性  -> 消息 -> 在列表框中找到你要重载的消息双击或者点右边那个框 然后添加
      

  4.   

    C**View类派生于CView类
    C**Dlg类派生于CDialog类,
    而CView,CDialog都派生于CWnd类,OnEraseBKgnd()究竟是在哪个类中的函数啊
      

  5.   

    楼主用的是VC6?在ClassWizzard里选ClassInfo页,在Message filter中选Window,于是什么消息就都有了。
      

  6.   

    视类?我是直接新建的一个对话框工程啊,不是一个菜单对话框工程啊,里面就APP类和Dlg类,没有视类View的
      

  7.   

    不是啊,我是在EVC中编的啊,不过EVC应该和VC没什么大的区别吧
      

  8.   

    EVC没用过,不过你去看看ClassWizzard里面是不是也有个ClassInfo页吧。
      

  9.   

    因为对话框极少用到某些消息的重载,为了使用户在查找消息的时候不至于被太多的消息看得眼花缭乱,微软在ClassWizzard中缺省把这些消息给过滤掉了
      

  10.   

    WM_ERASEBKGND在对话框中药自己手动添加才可以或者在PAINT中处理是一样的