写了一个"自定义"的按钮MyButton类,通过改按钮的class name实现
virtual void registerClass() {
WNDCLASSEX cls;
ZeroMemory(&cls, sizeof(WNDCLASSEX));
cls.cbSize = sizeof(WNDCLASSEX); GetClassInfoEx(NULL, "BUTTON", &cls); // 拿到BUTTON的class cls.lpfnWndProc = AJ_InitThunkProc;   // 替换掉窗口回调函数
cls.lpszClassName = "MY_BUTTON";      // 新建一个叫 MY_BUTTON 的class
cls.cbWndExtra = DLGWINDOWEXTRA;
cls.cbClsExtra = 0; ATOM d = RegisterClassEx(&cls);
}
以上的MY_BUTTON 能RegisterClassEx成功,但如果把MY_BUTTON 替换成BUTTON呢,试了一样能注册成功,为什么不会冲突呢?是MyButton把windows默认的button给覆盖了吗?

解决方案 »

  1.   

    不对,你覆盖不了系统,每个应用程序有一份系统window class 的 拷贝,你只是覆盖了当前应用程序的
      

  2.   

    又试了一下tab的,就不能创建:
    virtual void registerClass() {
    WNDCLASSEX cls;
    ZeroMemory(&cls, sizeof(WNDCLASSEX));
    cls.cbSize = sizeof(WNDCLASSEX); GetClassInfoEx(NULL, WC_TABCONTROL, &cls); //拿tab控件的class cls.lpfnWndProc = AJ_InitThunkProc;
    cls.lpszClassName = WC_TABCONTROL;         //再次以WC_TABCONTROL注册,这次失败
    cls.cbWndExtra = DLGWINDOWEXTRA;
    cls.cbClsExtra = 0; int d = ::RegisterClassEx(&cls);           // 这里d===0,注册失败
    int x = GetLastError();                    // lastError 1410,表示class已存在
    }为什么button可以tab不行。。
      

  3.   

    你参数都用错了,是"Button",而不是"BUTTON"
      

  4.   

    你干脆用宏定义WC_BUTTON 看看还成功不成功?
      

  5.   

    经测试,className不区分大小写,试了
    Button  BUTTON  WC_BUTTON 结果一样,都可以注册成功,registerClassEx返回值0x17
    为什么可以成功。
      

  6.   

    不大熟悉这方面的东东,google了下有2种,
    1. 子类化,不新注册窗口类别,只是修改现有的窗口过程lpfnWndProc
    2. 超类化,新注册窗口类别,但是窗口类名必须和原先的不一样我的做法注册了新类别,貌似叫超类化,但是超类化一般不能用和原来一样的className,为什么Buton可以
      

  7.   

    照理Windows已经有了Button类, 再注册Button时候就会出现“重复注册类”的错误