1:在调用oninitdialog时控件应该已经生成了,可是在onpaint 中GetDlgItem()去获取控件句柄,居然直接data abort了。代码很少
CPaintDC dc(this);
(GetDlgItem(IDC_STATIC_USER) )->SetFont(pFont);//EDIT控件,这句完就数据溢出了,注释掉正常运行还有些奇怪的问题
2:有时代码先执行OnEraseBkgnd再oninitdialog,想知道在什么情况下oninitdialog不会先执行
3:一个全局DLG指针,DOMODAL后,添加一CFONT成员变量(非指针),当此对话框enddialog后GDI资源没有被自动释放,对么

解决方案 »

  1.   

    1、OnPaint执行的次数很多
    (GetDlgItem(IDC_STATIC_USER) )->SetFont(pFont);
    这类语句最好不要写在OnPaint中2、不是有时候,是每次创建窗口时消息的执行顺序都是那样,你可以在关心的几个函数中下断点看看执行顺序
    3、没看明白你想问什么
      

  2.   

    (GetDlgItem(IDC_STATIC_USER) )->SetFont(pFont);
    这行不要放到paint里
      

  3.   

    你在OnPaint函数中
    (GetDlgItem(IDC_STATIC_USER) )->SetFont(pFont);
    要使用的使用的话先判断一下该控件的HWND是否存在
    if(GetDlgItem(IDC_STATIC_USER)->GetSafeHwnd())
    {
     ...
    }
    你上的(GetDlgItem(IDC_STATIC_USER) )->SetFont(pFont);
    你完全可以放到OnInitDialog函数中去做
      

  4.   

    用GetSafeHwnd==NULL?去判断控件是否创建完成
      

  5.   

    回1楼:
    我调试了下是oninitdialog先于OnEraseBkgnd执行的第3个问题是,假如有个对话框类ctestdlg,在oninitdialog中用一个cfont成员变量m_font去createfont,然后在析构函数中去deleteobject,现在用一个全局ctestdlg指针去domodal,请问下如果我不delete这个全局指针,字体GDI资源能自动释放么?
      

  6.   

    回2,3楼:
    想在一个EDIT中调节字体大小,每调1次能立即显示出调节字体后的效果。所以在onpaint里设置了
      

  7.   

    调试的结果就是正确的
    如果你认为你的程序存在先调用OnEraseBkgnd的情况你可以在调试看看真实的过程3、当然不会,不仅GDI资源没有释放,就连ctestdlg本身都泄露了