基于对话框的MFC程序,拖放了一个Picture控件,为其关联了一个控制型的CStatic变量,同时添加了一个继承于CStatic类的自定义类,如CMyStatic的,修改CStatic mm;为CMyStatic mm;mm表示关联的变量名。但为CMyStatic类添加了WM_CREATE、PreCreateWindow等消息,在消息函数中设置断点,发现程序运行时就没有执行这些函数,什么原因呢?求高手解答。MFC控件

解决方案 »

  1.   

     mm 的 ID 不能 是 -1
     mm 的 属性 要 Notify
      

  2.   

    mm的Notify属性是True,ID也不是-1.
      

  3.   

    有没有在OnInitDialog中调用mm.Create
      

  4.   

    CStatic控件是直接拖放到Dialog上的,不存在create啊!
      

  5.   

    Picture控件,修改ID名称。。默认名称是IDC_STATIC
      

  6.   

    刚刚帮你试了一下,如果是控件直接托在对话框上面的话,你的两个函数都不会调用,如果你在BOOL TestDlg::OnInitDialog()函数里面写如下代码,这里的控件是自绘制的,这时候会调用你的两个函数。
    {
    CDialogEx::OnInitDialog(); // TODO:  在此添加额外的初始化

    CRect rect ( 200, 200, 300 , 224);
    m_Pic.Create("fsfs",WS_CHILD|WS_VISIBLE,rect,this,3000);
    }
      

  7.   

    如果它是一个用户控件,那么至少需要在DDX中加入该控件和变量的映射,才会让你的变量类接收到窗口消息,否则对话框模板默认只是创建一个普通的STATIC控件而已,消息也只传递给了默认窗口过程
      

  8.   

    已经关联变量了啊,DDX中相关的代码啊
      

  9.   

    楼上使用动态create创建的话会响应,那为什么直接静态拖放的控件不行呢?
      

  10.   


    第一步:改变它的ID
    第二步:勾选Notify孙鑫VC++深入详解P235
      

  11.   

    个人感觉将Picture控件绑定到一个CStatic控件变量上面(或派生自CStatic的子类控件上面)的话:WM_CREATE、PreCreateWindow这两个消息本来就不会响应,或者说设置的断点本来就不会进去。即使更改Picture的属性也没用。
      

  12.   

    DDX_Control 关联的变量是通过 SubclassWindow 实现的, SubclassWindow 会调用到 PreSubclassWindow 
    因此 可以重载 PreSubclassWindow 去达到你想要的目的