我写了个类CMyButton继承了CButton类,现在想在Button显示前用Button类的style/ctrlID/title来初始化我的CMyButton,我重载了PreSubclassWindow,在这里面用如下的代码获取:
GetWindowText(m_strMyTitle);
m_Mystyle = GetButtonStyle();
m_MyID = GetWindowLong(m_hWnd, GWL_ID);
如果把按钮放在对话框资源上,上面这三句话可以获得正确的值,但是如果我用CMyButton aa; aa.Create创建,则上面的值获取不对,我在WM_CREATE消息处理函数中获取上面三个值就成功了,但是如果把按钮放在对话框资源上,发现没有WM_CREATE消息.现在我的问题是,有没有重载按钮的那个函数,重载一个函数就可以实现获得上面三个值的方法,谢谢.

解决方案 »

  1.   

    你可以写一个初始化函数,在PreSubClassWindow和OnCreate里面调用。
    在调用之后设置一个标志,在调用开头检查,以避免重复初始化。
      

  2.   

    lz的意思是想在CMyButton子类现有的按钮或用新类CMyButton来Create一个按钮,都可以用同一种方法获取按钮的三个值,其实给CMyButton类添加一个OnPaint()就可以实现。
      

  3.   

    这个你可以在CMyButton里实现,也可以到CMyButton对象的父窗口中去处理,在父窗口中创建CMyButton对象实例的时候去调用。
      

  4.   

    你说的OnPaint的确可以实现,但是OnPaint调用太频繁了.我提的这个问题不仅仅对于按钮控件,其他所有的控件都有这个问题,所以才想仔细考究.希望大家多发表点意见
      

  5.   

    GetWindowLong(m_hWnd, GWL_ID)的返回值永远是0
    GetWindowText(m_strMyTitle)返回的总是空串你试试就知道了.
      

  6.   

    把按钮放在对话框资源上,上面这三句话可以获得正确的值,这是当然的,这个时候控件已经创建完毕,自然不会相应WM_CREATE消息了,空间的创建是这样的,先注册窗体,绘画,开始消息循环,像WM_CREATE的消息是不会在循环中相应的。
    如果你想自己Create控件,创建完后应该还要aa.Show吧?
      

  7.   

    但是在WinCE系统中在PreSubclassWindow中获取这些值都是对的,真是怪了
      

  8.   

    不清楚你获取ID和文字的目的是什么,可以在CMyButton中定义两个成员变量,分别储存ID和文字,在构造函数中初始化为0,重载Create函数,直接从函数参数中获得ID和文字赋给成员变量,在PreSubclassWindow中判断一下,如果成员变量是0,则调用相应的函数获取,否则直接使用。
      

  9.   

    参见:
    http://snipurl.com/cppcode8828
      

  10.   

    如果你用的不是"对话框数据关联",而是在OnInitDialg中自己创建m_mybtn.Create() 
    这时候,一些"建立前"的处理就应该写在PreCreateWindow函数中。而不是PreSubclassWindow函数