Невозможно создать окно (CreateWindowEx) с существующим дочерним классом

У меня есть родительское окно и несколько дочерних окон, прикрепленных к этому. С помощью SpyXX я вижу, что у всех детей есть определенный класс стилей, скажем, ChildWindowClass,

Когда я создаю окно с именем этого конкретного класса, CreateWindowEx возвращает NULL справиться. Если я использую свой собственный класс и просто устанавливаю родителя, окно является дочерним окном, но - конечно - имеет другой класс, как и все другие дочерние.

Если я получу стиль и затем установлю его, стиль будет найден, но не установлен для моего дочернего окна. Он по-прежнему показывает стиль, используемый с CreateWindowEx

HWND firstChild = FindWindowEx(MyClass::_parent, NULL, szFsxChildWindowClass, NULL);
LONG childStyle = GetWindowLong(firstChild, GWL_STYLE);
...
SetWindowLong(MyClass::_child,GWL_STYLE, childStyle);

ChildWindowClass не зарегистрировано мной, поэтому я не могу проверить, как оно зарегистрировано. Итак, как я могу установить этот стиль для моего дочернего окна?

- Редактировать звонок по запросу -

 child = CreateWindowEx( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
        szWindowClass, // this is where I want to place the name of the child class
        _T("Test"),
        WS_CHILDWINDOW | WS_VISIBLE,
        x,y, // 0,0
        w, h, // 500,100
        MyClass::_parent, // parent
        NULL,
        MyClass::_hInstance, // must this be 0??
        NULL
        );

1 ответ

Решение

Проверьте GetLastError, Если он ненулевой, вы, скорее всего, неправильно используете API. Если это 0, это означает, что оконная процедура явно провалила создание, возвращая FALSE из WM_NCCREATE или же WM_CREATE,

При обработке этих сообщений оконная процедура имеет доступ ко всем параметрам, которые вы передаете функции (стили, заголовок, координаты, родительское окно и меню), и этот конкретный класс окна может потребовать передачи дополнительных данных через lpCreateParamsили даже в заголовке или координатах, в противном случае создание невозможно.

Установить точку останова или крючок WM_CREATE для окон этого класса и изучить, как были созданы эти существующие дочерние окна, каковы были параметры. (Предполагая, что у вас нет только документации на это!)

Другие вопросы по тегам