cannot convert from 'ATL::CWindow' to 'WTL::CButtonT<ATL::CW
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.07.22 02:02
Оценка:
Здравствуйте!

Давно не брал я в руки шашек, и решил тут пописать на WTL. Так как студия у меня 2019ая, решил скачать WTL поновее — 10.

Взял пример BmpView, вставил сорцы в свой проект, собираю — ошибка:

1>\props.h(195,1): error C2440: 'initializing': cannot convert from 'ATL::CWindow' to 'WTL::CButtonT<ATL::CWindow>'
1>\props.h(195,21): message : No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called


Код такой (props.h):
  Скрытый текст
    CPropertySheetWindow sheet = GetPropertySheet();
    sheet.CancelToClose();
    RECT rect;
    //CButton btnCancel = sheet.GetDlgItem(IDCANCEL); // !!!
    ATL::CWindow btnCancel = sheet.GetDlgItem(IDCANCEL);
    btnCancel.GetWindowRect(&rect);
    sheet.ScreenToClient(&rect);
    btnCancel.ShowWindow(SW_HIDE);

Строчка !!! — не собирается. Ну, я переделал, вроде собирается.

Глянул CButtonT — это
  Скрытый текст
typedef CButtonT<ATL::CWindow>   CButton;

Которое есть

  Скрытый текст
template <class TBase>
class CButtonT : public TBase
{
public:
// Constructors
    CButtonT(HWND hWnd = NULL) : TBase(hWnd)
    { }

    CButtonT< TBase >& operator =(HWND hWnd)
    {
        this->m_hWnd = hWnd;
        return *this;
    }
//...



CPropertySheetWindow.GetDlgItem возвращает ATL::CWindow. Ну, вроде бы логично, конструктора подходящего нет. Хотя, по идее, ATL::CWindow должен иметь operator HWND, и тогда должно вроде бы работать.

Ладно. Попробовал в 2019 студии открыть идущий в комплекте с примером проект для 2010 студии. Попросило проапдейтить, и собралось без вопросов. Вот тут я не совсем понял, а как так?

Есть идеи, куда поковырять?
Маньяк Робокряк колесит по городу
Отредактировано 04.07.2022 2:03 Marty . Предыдущая версия .
Re: cannot convert from 'ATL::CWindow' to 'WTL::CButtonT<ATL::CW
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.07.22 09:24
Оценка:
Здравствуйте, Marty, Вы писали:

M>Есть идеи, куда поковырять?


Есть в Студии такой параметр ConformanceMode, может он поможет. Правда, я не помню, как он называется во вкладках и где расположен. У меня новый проект никак не хотел собираться и тоже ругался на конструкторы. Когда сбросил ConformanceMode в умолчание с true, собралось.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: cannot convert from 'ATL::CWindow' to 'WTL::CButtonT<ATL::CW
От: Alexander_S_U https://github.com/alexanders-code/cmdxmlinstaller
Дата: 19.07.22 19:54
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Давно не брал я в руки шашек, и решил тут пописать на WTL. Так как студия у меня 2019ая, решил скачать WTL поновее — 10.


M>Взял пример BmpView, вставил сорцы в свой проект, собираю — ошибка:

M>

1>>\props.h(195,1): error C2440: 'initializing': cannot convert from 'ATL::CWindow' to 'WTL::CButtonT<ATL::CWindow>'
1>>\props.h(195,21): message : No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called


M>Код такой (props.h):

M>
  Скрытый текст
M>
M>    CPropertySheetWindow sheet = GetPropertySheet();
M>    sheet.CancelToClose();
M>    RECT rect;
M>    //CButton btnCancel = sheet.GetDlgItem(IDCANCEL); // !!!
M>    ATL::CWindow btnCancel = sheet.GetDlgItem(IDCANCEL);
M>    btnCancel.GetWindowRect(&rect);
M>    sheet.ScreenToClient(&rect);
M>    btnCancel.ShowWindow(SW_HIDE);
M>


M>Строчка !!! — не собирается. Ну, я переделал, вроде собирается.

...

M>CPropertySheetWindow.GetDlgItem возвращает ATL::CWindow. Ну, вроде бы логично, конструктора подходящего нет. Хотя, по идее, ATL::CWindow должен иметь operator HWND, и тогда должно вроде бы работать.


M>Ладно. Попробовал в 2019 студии открыть идущий в комплекте с примером проект для 2010 студии. Попросило проапдейтить, и собралось без вопросов. Вот тут я не совсем понял, а как так?


M>Есть идеи, куда поковырять?


Может быть в проекте куда добавлялись исходники подключен header atlwin.h от старой версии ATL?
Студия 2019 в atlwin.h в CWindow есть operator HWND, он и вызывается

operator HWND() const throw()
{
    return m_hWnd;
}
https://github.com/alexanders-code/cmdxmlinstaller
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.